我在项目中使用公钥/私钥来加密/解密某些数据。
我在服务器上托管公钥(“public.pem”)。
“public.pem”看起来像这样:
-----BEGIN PUBLIC KEY-----
.....
.....
-----END PUBLIC KEY-----
我编写了一个客户端,下载此公钥并将其保存到磁盘,然后使用文件描述符将OpenSSL的PEM_read_RSA_PUBKEY()调用到该文件。 此操作很有效,结果是一个准备加密的RSA对象。
我想避免每次都将公钥写入磁盘(因为我已经在内存中有缓冲区了)。
如何在不将缓冲区保存到磁盘的情况下执行相同的操作? 我注意到一个名为PEM_read_bio_RSAPublicKey()的函数,但我不确定它是否使用了BIO结构。我在正确的道路上吗?
所以真正的问题是:如何直接从内存而不是文件描述符中读取RSA对象的公钥/私钥。
答案 0 :(得分:14)
你走在正确的轨道上。您必须通过BIO_new_mem_buf()
通过BIO缓冲区将PEM密钥包装在内存中。换句话说,比如:
BIO *bufio;
RSA *rsa
bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len);
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL);
相同的方法对于RSA私钥(通过PEM_read_bio_RSAPrivateKey
)有效,但在这种情况下,您肯定需要满足密码短语。查看man page了解详情。
答案 1 :(得分:4)
SquareRootOfTwentyThree的方法对我不起作用。这是我的解决方案。
@include('views.acp.review.check-details')
答案 2 :(得分:1)
这里是完整的示例,显示了嵌入式密钥以及如何使用C ++ 11唯一指针 管理OpenSSL资源。
已更新:根据spectras的评论进行。不再使用专业化
的import json
from pprint import pprint
import ast
with open('data2.txt') as f:
data = f.read().replace("ObjectId(", "'ObjectId(").replace(")", ")'").replace("\n", ",");
listDict = ast.literal_eval(data)
print(listDict)
({'_id': 'ObjectId("5c04cc50792d7153282a0874")', 'Name': 'Nimish', 'Marks': '100'}, {'_id': 'ObjectId("5c04cc61792d7153282a0875")', 'Name': 'Ayush', 'Marks': '78'})