【问题标题】:PFX Self Signed x509 Certificate with password securePFX 自签名 x509 证书,带密码安全
【发布时间】:2012-01-22 07:05:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# x509 pfx


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这不是问题。问题是,没有密码的私钥有多安全?存储带有私钥的证书的位置与我的问题无关,即使我在最初的问题中确实提到存储是一个问题;我的错。此外,智能卡不是一种选择,因为没有任何基础设施可以支持。
      【解决方案3】:

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

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

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

      【讨论】:

      • 对于迟到的回复、假期和所有事情,我深表歉意。问题是仅凭密码获得的 X509 证书的安全性如何?如果你有密码,你就有私钥,但没有密码,私钥的安全性如何?
      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 2016-10-20
      • 2019-04-02
      • 2011-05-12
      • 2017-12-18
      • 2017-12-29
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多