我在native中使用openssl来加密或解密我的android数据。我在这个领域很天真。我刚做了一个研究并添加了实施。
https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption
我引用它来使用和修改一下如下:
/* Initialise the library */
//Add the ciper algorithm.
EVP_add_cipher(EVP_aes_256_cbc());
//use the default config.
OPENSSL_config(NULL);
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_DecryptUpdate(ctx, t, &outlen, s, size);
...
EVP_DecryptFinal_ex(ctx, t + tlen, &outlen);
...
EVP_CIPHER_CTX_free(ctx);
EVP_cleanup();
但问题来了,调用EVP_cleanup会导致java端https打开连接异常。像SSL_CTX_new这样的错误返回NULL。一些讨论提到它不应该被称为EVP_cleanup,它将全局清理表算法。所以我删除了EVP_cleanup。崩溃解决了。
但是当我测试内存使用原生时,调用上述功能的100,200 ......次。每次都会增加本机堆。
我删除了这两行。它仍然可以使用EVP_ases_256_cbc成功加密和解密。
/* Initialise the library */
//Add the ciper algorithm.
//EVP_add_cipher(EVP_aes_256_cbc());
//use the default config.
//OPENSSL_config(NULL);
https://wiki.openssl.org/index.php/Library_Initialization#OPENSSL_config
我还测试了用OPENSSL_no_config()替换EVP_cleanup();
/* Initialise the library */
//Add the ciper algorithm.
EVP_add_cipher(EVP_aes_256_cbc());
//use the default config.
OPENSSL_config(NULL);
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_DecryptUpdate(ctx, t, &outlen, s, size);
...
EVP_DecryptFinal_ex(ctx, t + tlen, &outlen);
...
EVP_CIPHER_CTX_free(ctx);
//unload the config.
OPENSSL_no_config();
上面的实现,似乎没有导致本机堆增加。
我的问题如下:
不调用任何初始化,例如
OpenSSL_add_ssl_algorithms或SSL_load_error_strings或 EVP_add_cipher;
什么是默认的ssl添加算法或密码?
何时使用OPENSSL_config?是否有必要在我的情况下使用?
- 我用OPENSSL_no_config()替换EVP_cleanup的最后一个解决方案是本机堆增加泄漏的可接受解决方案吗?
醇>