2011-12-16 54 views
1

看过如何从Creating a self-signed certificate in C#生成自签名数字签名后,我可以调用CreateSelfSignCertificatePfx并将字节数组中的PXF数据返回,然后可以在X509Certificate2对象内使用它来签名并验证。示例...带密码安全的PFX自签名x509证书

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); 

This works。我的关注点虽然是来自上面的原始字节byte [] pfx需要存储在一个数据库中(用来签名)。问题在于,这种格式的字节有多安全?我知道你需要密码才能用私钥构造新的X509Certificate2,但从一般意义上讲,没有密码的字节有多安全?我没有问题将这些字节作为附加层加密,但这是必要的吗?

根据X509Certificate2.X509Certificate2(Byte[], String) Constructor

调用此构造函数使用正确的密码解密私钥并将其保存到一个关键的容器。

我只是想确保没有密码的私钥是安全的。

回答

1

在我看来,问题不在于是否应该将“字节”放在数据库中,但更重要的是,是否将文件与私钥放在文件系统中。

就像你这样做,它本质上是一回事。你只是存储组成cert文件的字节。

我可能无法理解这里的区别,但它们字节和文件本质上是相同的东西,唯一的区别是人们必须访问数据库才能获取它们。

+0

我很抱歉迟到的回复,假期和所有。问题是仅凭密码的X509证书有多安全?如果你有密码,你有私钥,但没有密码,私钥有多安全? – user1097974 2011-12-27 14:30:55

0

使用智能卡或令牌存储您的私钥。

更新: 任何可以访问机器的人都可以访问Pvt密钥。

+0

这不是问题。问题是,没有密码的私钥有多安全?存储私钥的证书与我的问题无关,尽管我在原始问题中确实提到了存储问题;我的错。此外,智能卡不是一种选择,因为没有任何基础设施可以支持。 – user1097974 2012-01-18 15:43:47

0

PFX(PKCS#12)中的私钥被加密存储,这当然是密码的用途。不是所有的PFX都是加密的,结构部分保持明文以包含关于内容的元数据(例如使用什么加密算法)。

在检查文件的基础上,从Windows 7开始,使用3键(168位)3DES对私钥进行加密。密钥是通过涉及密码的复杂公式得出的;文件中没有保存任何内容,可以显示密码是什么,密码是多久,等等。

密码通常通过在内容上添加一个MAC来证明是正确的,该密码为其密钥派生函数使用相同的密码。在MAC密码和加密密码不同的情况下(我个人从未见过),密码通过加密有效载荷中的结构信息进行验证。

DES的弱点主要在于小键盘大小,它今天很容易被粗暴地使用。 3键3DES密钥比(1)DES密钥有112个更多的语义位,因此需要2^112(〜5×10^33)倍的时间才能中断。

因此,在一天结束时,私钥密码听起来很健全。但是就像任何使用密码输入的东西一样,如果你使用了一个很容易被猜到的密码,那么它可能被暴力破解。