是否有确定地为X.509证书创建RSA私钥的方法,最好是通过已经经过审核的库?
例如,用户输入诸如“这是我的私有组”这样的短语,该种子值用于生成一个私用RSA密钥,然后我可以使用它作为证书颁发机构。但是这样的话,我就可以在不同的机器上从种子值中得到相同的密钥。
我的用例是,我希望在我的应用程序中支持预共享密钥,但是使用它用于键控的现有X.509支持。如果我可以从某个初始值创建一个可预测的X.509证书,那么这将非常简单,因为用户可以根据生成的密钥相互验证对方的证书。
出于显而易见的原因,我想避免用手滚动库来做这件事,但这似乎并不是一件常见的事情--尽管支持PSK的各种系统在内部必须做一些类似的事情。
发布于 2014-06-26 14:40:31
目前,我认为这里没有大的问题,至少,从算法本身的PoV。
决定论是通过使用带有相同关键字短语(可能是盐渍的,并通过SHA-256)的PRNG实现的,因此对于相同的输入,输出是相同的。所有所需的算法都可以很容易地用Python实现,或者可以重用现有的代码,比如Python-RSA。唯一需要的调整将是使用您的PRNG,而不是它现在使用的。
第3点是最难的部分,因为我不是库方面的专家,但这似乎是另一个问题的一部分(从现有的关键材料生成证书)。这属于“什么是最好的图书馆.”类别。
和往常一样:除非你是布鲁斯·施耐尔,否则鞭打你自己的密码通常是不被鼓励和皱眉的。;-)
发布于 2014-10-24 16:32:57
正如@Dmitry所指出的,你所设想的是可行的。PRNG本身是一种确定性算法,它将初始随机种子“扩展”到任意长的伪随机字节序列中。您可以使用一个强密码散列函数,并将得到的哈希值用作PRNG的种子。
不过,有些附带问题可能会令人感到烦恼。例如:
我在这个答案中更详细地讨论了这个问题。
请记住,证书(包含公钥)必须存储在某个地方,因为您不能通过密码重新创建证书(证书由CA签名,并且不能重新计算该签名,因为您不是自己的CA)。您可以“正常”生成私钥,用一些基于密码的加密系统对其进行加密,并将其与证书一起存储;从安全的角度来看,这相当于密码到RSA密钥派生;但至少它可以与现有格式和工具一起工作(您可以使用PKCS#12,也称为"pfx",作为证书和私钥的密码保护存档格式)。
发布于 2022-06-21 17:17:32
我做了一些调查,发现一些有趣的笔记,我认为值得分享,但不是一个明确的答案。我生成了几个证书并对它们进行了比较。我在用这句话:
Windows:
openssl req -new -x509 -key priv.pem -out pub.pem -h -subj '//CN=test'Linux (未测试):
openssl req -new -x509 -key priv.pem -out pub.pem -h -subj '/CN=test'然后,我比较了内容,但它们不匹配。
我使用Python获取有关证书的更多信息:
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
pub_str = open(pub_fname).read().encode()
cert_obj = load_pem_x509_certificate(pub_str, default_backend())
public_key = cert_obj.public_key()我发现cert_obj.serial_number、cert_obj.not_valid_after、cert_obj.not_valid_before不同( cert_obj.signature也不同,但我认为这是其他字段不匹配的结果)。
我能够通过命令行(Windows)指定序列号:
openssl req -new -x509 -key priv.pem -out pubX.pem -set_serial 219363692778776146107430278182615926685007820639 -subj '//CN=test'但不是日期。此时,我想我应该只存储证书文件。还有一些其他可能的途径有待探索。也许使用Python来生成证书而不是openssl可能会使指定这些值成为可能。还有其他命令允许指定日期(我在网上看到了gossl,但无法确认)。
https://security.stackexchange.com/questions/61845
复制相似问题