用于为 openssl EVP_PKEY 私钥清理内存的 C 代码

pok*_*eba 6 c openssl private-key

我开始学习 C/C++ 中的 OpenSSL 编程。我遇到的一个问题是,如何安全地清除私钥的内存?

例如,我可能有代码:

EVP_PKEY *private_key = PEM_read_bio_PrivateKey( bio, ,,,)
RSA *r = EVP_PKEY_get1_RSA( private_key);
Run Code Online (Sandbox Code Playgroud)

在使用 EVP_PKEY_free() 释放它之前,我想从内存中彻底清除 private_key 。

感谢您的帮助和/或您的建议。谢谢。

jww*_*jww 5

\n

EVP_PKEY *private_key = PEM_read_bio_PrivateKey( bio, ,,,)

\n\n

我想在使用EVP_PKEY_free它之前从内存中彻底清除 private_key 。

\n
\n\n

OpenSSL 的EVP_PKEY_free为您擦除私钥。您不必做任何特别的事情。

\n\n
\n

RSA *r = EVP_PKEY_get1_RSA( private_key);

\n
\n\n

get1意味着引用计数增加了,您实际上获得了自己的对象副本。Aget0意味着您有一个指向现有对象的指针,并且您应该调用free它。由于get1,您必须调用RSA_free它以确保它被删除。与 一样EVP_PKEY_freeRSA_free将擦除密钥。

\n\n

请不要打电话memset。这些是不透明的结构,您必须遵循许多指针才能正确清除子对象。OpenSSL 1.1.0 中隐藏了更多字段,因此遵循指针将变得更加困难(如果您愿意的话)。另请参阅错误: \xe2\x80\x9cinvalid use of incomplete type \xe2\x80\x98RSA {aka struct rsa_st}\xe2\x80\x9d in OpenSSL 1.1.0Visual Studio 和错误 C2027:使用未定义类型 \'rsa_st \' 在 OpenSSL 1.1.0 中EVP_get_cipherbyname 和 \xe2\x80\x9cundefined struct/union evp_cipher_st\xe2\x80\x9d 在 OpenSSL 1.1.0等中。

\n\n
\n\n

以下是您可能感兴趣的一些附加读物:

\n\n\n\n

EVP_PKEY_free当调用诸如和 之类的函数时,它们最终会在内存返回给操作系统之前RSA_free以调用结束。OPENSSL_cleanse对于 RSA 私钥,它至少被调用 8 次来擦除与nedpqdpdq、 和关联的字节数组invq

\n