1

在查看了如何通过在 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 来自上面,需要存储在数据库中(用于签名)。问题变成了,这种格式的字节有多安全?我知道您需要密码才能使用私钥构造新的 X509Certificate2,但一般来说,没有密码的字节有多安全?我将这些字节加密为附加层没有问题,但这有必要吗?

根据X509Certificate2.X509Certificate2(Byte[], String) 构造函数

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

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

4

3 回答 3

1

在我看来,问题不在于您是否应该将“字节”放入数据库中,而更多的是,您是否将带有私钥的文件放入文件系统中。

在你做这件事的方式上,它本质上是一样的。您只是存储构成证书文件的字节。

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

于 2011-12-16T20:29:50.807 回答
0

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

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

于 2012-01-10T13:04:50.380 回答
0

PFX (PKCS#12) 中的私钥是加密存储的,这当然是密码的用途。并非所有 PFX 都是加密的,结构部分保持纯文本以包含有关内容的元数据(例如使用了哪种加密算法)。

根据检查文件,从 Windows 7 开始,私钥使用 3 密钥(168 位)3DES 加密。密钥是通过涉及您的密码的复杂公式得出的;文件中没有任何内容可以说明您的密码是什么,密码是多长时间等等。

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

DES 的弱点主要在于 keysize 小,今天它很容易被暴力破解。3 键 3DES 密钥比 (1)DES 密钥多 112 个语义位,因此需要 2^112 (~5 x 10^33) 倍的时间才能破解。

因此,归根结底,私钥在密码学上是可靠的。但是就像任何基于密码输入的东西一样,如果你使用了一个很容易被猜到的错误密码,那么它就可以被暴力破解。

于 2016-08-03T15:10:25.723 回答