PFX自签名x509证书与密码安全
本文关键字:密码 安全 证书 x509 PFX | 更新日期: 2023-09-27 18:18:10
在查看了如何从c#中创建自签名证书生成自签名数字签名之后,我可以调用CreateSelfSignCertificatePfx并返回字节数组中的PXF数据,然后可以在X509Certificate2对象中使用该数据进行签名和验证。例子…
byte[] pfx = Certificate.CreateSelfSignCertificatePfx("O=Company,CN=Firstname,SN=Lastname", DateTime.Now, DateTime.Now.AddYears(1), "password");
X509Certificate2 cert = new X509Certificate2(pfx, "password");
byte[] publicBytes = cert.RawData;
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] signedData = rsa.SignData(new System.Text.UTF8Encoding().GetBytes("Test"), new SHA1CryptoServiceProvider());
RSACryptoServiceProvider rsa2 = (RSACryptoServiceProvider)new X509Certificate2(publicBytes).PublicKey.Key;
bool verified = rsa2.VerifyData(new System.Text.UTF8Encoding().GetBytes("Test"), new SHA1CryptoServiceProvider(), signedData);
这工作。我担心的是原始字节,byte[] pfx从上面,需要存储在DB(签名的东西)。问题是,这种格式的字节有多安全?我知道您需要密码才能用私钥构造新的X509Certificate2,但是一般来说,没有密码的字节有多安全呢?我没有问题加密这些字节作为一个附加层,但这是必要的吗?
根据X509Certificate2。X509Certificate2(Byte[], String) Constructor
使用正确的密码调用此构造函数将解密私钥并将其保存到密钥容器中。
我只是想确保私钥在没有密码的情况下是安全的
在我看来,问题不在于是否应该将"bytes"放在数据库中,而在于是否应该将带有私钥的文件放在文件系统中。
在你做这件事的方式上,本质上是一样的。您只是在存储组成证书文件的字节。
我可能无法理解这里的区别,但它们字节和文件本质上是一样的,唯一的区别是必须访问数据库才能获得它们。
使用智能卡或令牌存储您的私钥
更新:任何可以访问机器的人都可以访问Pvt密钥
PFX (pkcs# 12)中的私钥是加密存储的,这当然就是密码的用途。并非所有的PFX都是加密的,结构部分保持明文,以包含有关内容的元数据(如使用的加密算法)。
根据对文件的检查,从Windows 7开始,私钥使用3-key(168位)3DES加密。密钥是通过一个包含密码的复杂公式得来的;文件中没有任何保存的内容可以显示你的密码是什么,密码有多长,等等。
通常通过在内容上添加MAC来证明密码正确,该MAC使用相同的密码进行密钥派生功能。在MAC密码和加密密码不同的可能情况下(我个人从未见过),密码由加密有效载荷中的结构信息验证。
DES的弱点主要在于密钥尺寸小,今天很容易被破解。一个3密钥的3DES密钥比一个(1)个DES密钥多112个语义位,这使得破解它需要2^112 (~5 x 10^33)倍的时间。
因此,在一天结束时,私钥是加密可靠的。但就像任何基于密码的输入一样,如果你使用了一个很容易被猜到的坏密码,那么它就可以被暴力破解。