我开始学习C/C++中的OpenSSL编程。我遇到的一个问题是,如何才能安全地清除内存中的私钥?
例如,我可能有代码:
EVP_PKEY *private_key = PEM_read_bio_PrivateKey( bio, ,,,)
RSA *r = EVP_PKEY_get1_RSA( private_key);
在使用private_key ()释放它之前,我希望清除内存中的EVP_PKEY_free。
我很感谢你的帮助和/或你的建议。谢谢。
发布于 2017-03-18 16:26:36
EVP_PKEY *private_key = PEM_read_bio_PrivateKey( bio, ,,,)
在使用private_key来释放它之前,我想清除内存中的EVP_PKEY_free
。
OpenSSL的EVP_PKEY_free
为您擦去私钥。你没必要做什么特别的事。
RSA *r = EVP_PKEY_get1_RSA( private_key);
get1
意味着引用计数被碰撞,您实际上得到了对象的副本。get0
表示您有一个指向现有对象的指针,不应该在它上调用free
。因为有了get1
,您必须对其调用RSA_free
,以确保它被删除。与EVP_PKEY_free
一样,RSA_free
将擦除密钥。
请不要给memset
打电话。这些是不透明的结构,为了正确清除子对象,您必须遵循多个指针。OpenSSL 1.1.0中隐藏了更多的字段,因此执行指针将更加困难(如果您愿意的话)。也见st}” in OpenSSL 1.1.0,st' in OpenSSL 1.1.0,st” in OpenSSL 1.1.0等。
下面是一些你可能感兴趣的额外阅读:
当调用像EVP_PKEY_free
和RSA_free
这样的函数时,它们最终会在内存返回到操作系统之前调用OPENSSL_cleanse
。对于RSA私钥,它至少调用8次以擦除与n
、e
、d
、p
、q
、dp
、dq
和invq
相关的字节数组。
https://stackoverflow.com/questions/42868879
复制相似问题