清除OpenSSL机密的正确方法是什么?

时间:2015-05-14 10:17:36

标签: c security openssl

在代码中我经常使用OpenSSL资源:RSA,EC_KEY,EVP_PPKEY等。我知道有指定的功能来创建和删除它们:

RSA_new()
RSA_free(RSA*)

然而,这些功能是否足以确保秘密不会留在记忆中 - 例如内存被清理/归零 - 例如,如果攻击者会扫描?

换句话说,OpenSSL从内存中删除秘密的正确方法是什么?

(任何文档链接都很棒,我在阅读消息来源,但有些官方声明会有所帮助)

1 个答案:

答案 0 :(得分:1)

  

换句话说,OpenSSL从内存中删除秘密的正确方法是什么?

OPENSSL_cleanse

$ cd openssl-1.0.2a
$ grep -R OPENSSL_cleanse *
...
apps/apps.c:    OPENSSL_cleanse(buff, (unsigned int)bufsiz);
apps/apps.c:    OPENSSL_cleanse(buf, (unsigned int)bufsiz);
apps/apps.c:    OPENSSL_cleanse(buf, (unsigned int)bufsiz);
apps/ca.c:    OPENSSL_cleanse(key, strlen(key));
apps/dgst.c:    OPENSSL_cleanse(buf, BUFSIZE);
apps/enc.c:    OPENSSL_cleanse(str, SIZE);
apps/enc.c:    OPENSSL_cleanse(str, strlen(str));
...

据我所知,所有*_free函数在删除对象时都会在内部使用它(如果需要)。

我不相信OpenSSL会使用包装。存储密钥包装或秘密包装的密钥是无人值守密钥存储问题。这是一个没有解决方案的问题。有关详细信息,请参阅Guttman的Engineering Security

相关:Why does OPENSSL_cleanse look so complex and thread-unsafe?Secure memory block in openssl