在查看如何从Creating a self-signed certificate in 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
使用正确的密码调用此构造函数会解密私钥并将其保存到密钥容器中。
我只想确保没有密码的私钥是安全的。
答案 0 :(得分:1)
在我看来,问题不在于您是否应该将“字节”放在数据库中,而是更多,您是否将带有私钥的文件放在文件系统中。
在你这样做的过程中,它基本上是一回事。您只是存储构成cert文件的字节。
我可能没有理解这里的区别,但是它们的字节和文件基本上是一回事,唯一的区别是必须获得访问数据库以获取它们的事实。
答案 1 :(得分:0)
使用智能卡或令牌存储您的私钥。
更新: 任何可以访问机器的人都可以访问Pvt键。
答案 2 :(得分:0)
PFX(PKCS#12)中的私钥是加密存储的,这当然是密码的用途。并非所有PFX都经过加密,结构部分保持纯文本以包含有关内容的元数据(如使用的加密算法)。
基于检查文件,从Windows 7开始,私钥使用3键(168位)3DES加密。密钥是通过涉及密码的复杂公式得出的;文件中没有保存任何内容,可以显示您的密码是什么,密码有多长,等等。
密码通常通过在内容上添加MAC来证明是正确的,该密码使用相同的密码作为其密钥派生函数。在可能的情况下,MAC密码和加密密码不同(我个人从未见过),密码由加密有效载荷中的结构信息验证。
DES'弱点主要在于小按键,今天它很容易暴力破解。 3键3DES密钥比(1)DES密钥多112个语义位,使得中断需要2 ^ 112(~5 x 10 ^ 33)倍。
因此,在一天结束时,私钥是加密声音。但就像使用基于密码的输入的任何东西一样,如果你使用容易猜到的错误密码,那么它就会被蛮力破解。