【问题标题】:mac osx: using a rsa decryption function of openssl, but it has risk of memory leaksmac osx:使用openssl的rsa解密功能,但是有内存泄露的风险
【发布时间】:2013-11-01 00:25:46
【问题描述】:

我使用openssl rsa函数解密密文,部分代码如下:

+ (NSString *)RsaDecryptWithPrivateKey:(NSString *)encryptedString {
  void   *encrypt = NULL;    // Encrypted message
  char   *decrypt = NULL;    // Decrypted message
  char   *err = NULL;               // Buffer for any error messages

  BIO *bio = BIO_new_mem_buf((char *)prikey, -1);
  RSA *prikey = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
  encrypt = malloc(RSA_size(prikey));

  NSData *encryptedData = [NSData dataFromBase64String:encryptedString];
  int encryptedData_length = (int)[encryptedData length];
  encrypt = (void *)[encryptedData bytes];

  decrypt = malloc(encryptedData_length);
  memset(decrypt, 0, encryptedData_length);
  if(RSA_private_decrypt(encryptedData_length,
                       (unsigned char*)encrypt,
                       (unsigned char*)decrypt,
                       prikey, RSA_PKCS1_OAEP_PADDING) == -1) {
      ERR_load_crypto_strings();
      ERR_error_string(ERR_get_error(), err);
      goto free_stuff;        
  }
  return [[NSString alloc] initWithBytes:decrypt length:strlen(decrypt) encoding:NSUTF8StringEncoding];

  free_stuff:
    RSA_free(prikey);
    free(encrypt);
    free(decrypt);
    free(err);
}

它工作正常。但是,当我使用 Instrument 跟踪有关它的泄漏时,会出现一些警告,如下所示:

我不知道如何解决这个问题,你能给我一些建议吗?

【问题讨论】:

    标签: objective-c macos memory-leaks openssl


    【解决方案1】:

    在我看来,除非出现错误(在这种情况下,尽管返回类型为 NSString,但您不会返回任何内容),否则您在从函数返回后正在 freeing 分配您的分配。

    NSString *decryptedString = nil;
    
    if(RSA_private_decrypt(encryptedData_length,
                           (unsigned char*)encrypt,
                           (unsigned char*)decrypt,
                           prikey, RSA_PKCS1_OAEP_PADDING) == -1) {
          ERR_load_crypto_strings();
          ERR_error_string(ERR_get_error(), err);
          goto free_stuff;        
    } else {
        decryptedString = [[NSString alloc] initWithBytes:decrypt length:strlen(decrypt) encoding:NSUTF8StringEncoding];
    }
    
    free_stuff:
      RSA_free(prikey);
      free(encrypt);
      free(decrypt);
      free(err); 
    
    return decryptedString;
    

    这样,如果解密失败,您将返回nil,但如果解密成功,仍然释放所有内容。

    我还没有实际编译或测试过这个,所以我不知道这是否是问题所在,但至少要仔细看看。

    【讨论】:

    • 我按照您的建议修改了我的代码,不幸的是,警告仍然出现。
    猜你喜欢
    • 2012-07-13
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2013-01-11
    • 2015-04-11
    相关资源
    最近更新 更多