2011-12-16 53 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)倍的時間才能中斷。

因此,在一天結束時,私鑰密碼聽起來很健全。但是就像任何使用密碼輸入的東西一樣,如果你使用了一個很容易被猜到的密碼,那麼它可能被暴力破解。