2010-03-23 98 views
25

我想使用.NET安全命名空間中可用的加密算法,但我想了解如何生成密鑰,例如AES算法需要256位,即16字節鍵,以及一些初始化向量,這也是幾個字節。如何爲加密算法創建加密密鑰?

  1. 我可以在我的Key和IV中使用任何值的組合嗎?例如Key和IV中的所有零是有效的還是不是?我知道做很多xors的算法的細節,所以零不會提供任何好處,但是這些算法是否有任何限制?

  2. 還是我必須使用一些程序來生成密鑰,並將其保存永久的地方?

我想加密後的數據在數據庫中存儲,如用戶名,密碼,電話號碼等,而關鍵的安全配置文件數據將提供給在連接字符串中只提到了,並給管理員數據庫用戶。

+0

如果你想使用AES256,那麼你的密鑰應該是32個字節,並設置KeySize屬性= 256。否則它將使用AES 128.你可以使用全零,但在安全上下文中,它不安全。是的,最好生成隨機密鑰(如在邁克爾霍華德 - 微軟的答案),並安全地存儲。 – 2015-02-12 06:36:46

回答

10

如果您正在使用加密來交換數據,那麼你將需要一個密鑰交換協議,但你不自己做一個,而不是使用一個現成的,貨架像TLS或SSL。

如果您使用加密來存儲數據,則使用CryptGenRandom(或其.net等效的RandomNumberGenerator.GetBytes)生成IV並將其保存在文檔中(清楚地說明,不需要保護IV)。你永遠不會寫下鑰匙,鑰匙是由用戶提供的。 Usualy從密碼短語中使用CryptDeriveKey或其.Net等效的PasswordDeriveKey.CryptDeriveKey獲得密鑰。

更新

要存儲在數據庫中的一個祕密就是隻提供給用戶,並且需要使用3個鍵管理員:

  • 一個與數據(稱之爲加密DK的鍵)
  • 一個用戶密鑰來加密DK鍵(稱之爲UK)
  • 一個管理員密鑰來加密DK鑰匙(稱之爲AK)

理論上你加密與DK的數據,然後加密與英國DK和保存,加密與AK的DK和保存。這樣用戶可以再次使用英國解密DK然後解密數據,並且管理員可以使用AK解密DK然後解密數據。最大的問題是系統始終是自動化的,所以系統需要訪問管理員的密鑰,這意味着它不是管理員的真實密鑰,而是一個系統密鑰(它不能用於非管理員的目的,例如拒絕)。

作爲一個負責人,瞭解IV是什麼或如何使用C#中的AES以及密碼算法是如何工作的,在解決這類問題時將獲得完全0(零)的牽引力。這個問題從來不是什麼IV和關鍵,這個問題總是關鍵配置。對於實際的加密操作,只需使用數據庫的內置支持,請參閱Cryptography in SQL Server。我可以很容易地爭辯說,您需要的只有設施是TDE(Transparent Data Encryption),以防止意外丟失媒體。

+0

我想在加密後將數據存儲在數據庫中,安全配置文件數據如用戶名,密碼,電話號碼只有連接字符串中提到的數據庫用戶以及管理員才能使用該密鑰。 – 2010-03-23 20:47:27

+0

簡而言之,我只需要保護來自訪問服務器和備份的其他開發人員的敏感用戶信息,雖然他們很少訪問服務器,但備份可以在任何地方,但沒有密鑰,敏感部分不應以純文本形式可見。 – 2010-03-23 21:08:37

+0

密碼應該是散列(單向加密)未加密。其他敏感數據可以加密。但只對包含敏感數據的列進行加密,而不對整個數據庫進行加密,導致性能後果和開銷。 – 2015-02-12 06:36:06

7

生成特定長度的隨機字母/十六進制代碼。

此功能(從here拍攝)在一個特定的長度返回一個隨機密鑰:

private static string CreateSalt(int size) 
{ 
    //Generate a cryptographic random number. 
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
    byte[] buff = new byte[size]; 
    rng.GetBytes(buff); 

    // Return a Base64 string representation of the random number. 
    return Convert.ToBase64String(buff); 
} 
1

這真的取決於你定義與鍵做什麼。

如果鍵是要由計算機生成(並且可以是任何隨機值)一般我需要幾個的GUID的SHA256。這與你在沒有硬件隨機數發生器的情況下隨機取得一樣。

您可以使用全0鍵,但顯然它不會是非常安全的。

+0

所以簡而言之,我可以隨便生成一些隨機垃圾並永久保存它,好吧,一旦密鑰全部丟失了?當然,我會嘗試將副本保存在輔助媒體上。 – 2010-03-23 20:53:49

+0

這是正確的。密鑰越隨機,密鑰越安全(當然,這取決於密鑰存儲的安全性。) – 2010-03-25 07:03:56

6

使用System.Security.Cryptography.RandomNumberGenerator生成隨機字節:

var rnd = new System.Security.Cryptography.RandomNumberGenerator.Create(); 
var key = new byte[50]; 
rnd.GetBytes(key); 
31

你真的應該這樣做的正確的方式:)

1)使用安全產生的隨機IV
2)使用安全產生的隨機關鍵
3)不要使用ECB模式 - EVER

AesManaged aes = new AesManaged(); 
aes.GenerateKey(); 
aes.GenerateIV(); 

上面的代碼將正確安全地爲您生成一個隨機的IV和隨機密鑰。

+8

由於我剛剛閱讀了這個內容,所以答覆晚了:實例化AESManaged類已經爲您生成了密鑰,只需讀取.Key和.IV屬性即可。 – 2012-08-21 08:16:38

+1

你說你永遠不應該使用ECB模式,儘管我同意你的意見,但我會說有時你可能會想使用它。這是非常罕見的,但作爲一個例子,如果你想在CTR(計數器模式)下實現AES,那麼你需要在ECB模式下使用該算法。對於普通用戶,您的陳述是絕對正確的,我絕不會主張您在未充分了解潛在隱患的情況下使用ECB模式。 http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation提供了一個很好的分組密碼模式。 – 2015-03-24 17:43:29

12

聽起來像你需要讀入Rfc2898DeriveBytes類。

Rfc2898DeriveBytes.GetBytes(); 

它有一個方法(上文),可以允許,簡單地通過將一個int值來調整該被送入上的對稱加密算法的。重點和.IV屬性字節數組的大小。 MS官方的70-536版書籍建議通過將KeySize屬性/ 8分開來進行此操作。例如,TripleDes或AESManaged。無論你使用什麼,算法本身都會有一些需要先滿足的預先需求。即滿足關鍵尺寸條件。 RunTime會自動填充屬性和字段等,爲您提供最好,最強大的值。但是IV和Key需要來自你。這如何可以做到以下幾點:

RijndaelManaged myAlg = new RiRijndaelManaged(); 
byte[] salt = Encoding.ASCII.GetBytes("Some salt value"); 
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes("some password", salt); 
myAlg.Key = key.GetBytes(myAlg.KeySize/8); 
myAlg.IV = key.GetBytes(myAlg.BlockSize/8); 
// myAld should now fully set-up. 

上面可以看到我的意思做親語法,因爲它應該非常 做這一切爲你,沒有你竟然真的有蝙蝠的眼睛 - 滿足它的預先要求。

Microsoft 70-536書指出,.Key屬性期望您按字節提供 的字節數組,而不是位。 RFC類以字節形式工作,其中算法KeySize屬性以位爲單位工作。 1個字節= 8位。你能看到這是怎麼回事嗎? 這應該給你一個想法,爲什麼上面的示例peice代碼完成了它的方式!我研究過它,這對我來說非常合適!

上述答案應該允許您使用提供的密碼和靜態鹽值創建算法對象,該值可以是兩端的硬代碼。您只需要擔心如何確保存儲在.Key和.IV中的字節數組安全地傳輸到收件人,以便可以成功解密您加密的郵件。通過安全地重建相同的算法對象。

OBTW:

AESManaged具有密鑰大小REQ':128位= 16個字節!!! (8 * 8 = 64,64Bit/8bits per Byte = 8 Bytes)因此,

64 * 2 = 128Bit,8 * 2,> 16字節密鑰大小!

256Bit = 32Bytes !!!!


根據70-536官方培訓包的書,Aes限於128位的密鑰大小。例如256位,192和128密鑰大小可以與Rijndael類一起使用。


你可以從另一方面完全忘記了所有的垃圾,並簡單地使用.GenerateKey和GenerateIV方法,而不是救你整理出一個預共享,並同意密碼和靜態鹽值的所有麻煩。您唯一需要考慮的是找出存儲和檢索密鑰和IV字節數組的方法。二進制格式化程序? 。