2012-02-08 53 views
0

完全糊塗了我最初清理(谷歌,SO,兵)顯示如何進行加密和解密密碼的使用使用C#.NET提供的AES算法工作代碼。我懷疑這兩個職位AES算法在C#中 - 在現在

  1. http://yossi-yakubov.blogspot.in/2010/07/aes-encryption-using-c-short-way.html

  2. http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx

#出現1他表示一切都可能使用CryptoTransformMSDN頁樣本顯示用做複雜的流。

  • 我需要這樣做嗎?

  • 我有一個比另一個有什麼好處?

  • 有人能澄清這是最好的代碼我需要遵循與其他方法的任何警告。

增加了混亂加密關於鹽的this會談後,現在我完全lost.Why應該鹽的存在於加密,而不是散列法。

回答

3

這兩種方法都可以工作,但我會說在第一個鏈接中使用的方法最適合「小」數據量,其中數據可以合理地適合輸入byte[](例如,密鑰,密碼等) 。

來自第二個鏈接的方法更適合「大量」數據,將整個輸入加載到內存中可能是不可行的,並且流式方法更適合(例如,加密網絡流上的文件或數據)。

根據您的需求,從第一個鏈接的方法可能是適當的。

至於你的最後一個環節,鹽的提及,這只是被用來種子PasswordDeriveBytes,而不是直接相關的AES算法本身。

值得一提然而,有一個對各種各樣的AES「鹽」,以及在IV(初始化向量)的形式。這只是隨機數據(每次都應該有所不同),它可以與密文一起存儲,並確保即使多次加密相同的數據,輸出也不相同。

考慮到這一點,應該使用在最後的鏈路中所示的方法,因爲它每次出現,以產生相同的輸出,因爲無論是密鑰和IV完全由密碼生成的輸入,而IV應該是隨機字節。

+0

奇妙解釋現在一切都使得sense.btw只是一個怪癖不base64encoding,解碼,UTF8編碼,解碼出爐即解密方法裏面,加密的原始數據或outside.I把它們放在外面,以便將來開發者可以實現自己的路在加密後存儲'byte []'。例如,這是現在遵循的東西'DAL.ChangePassword(Convert.ToBase64String(AESUtility.EncryptPassword(Encoding.UTF8。'GetBytes(password),KEY,IV)));' – Deeptechtons 2012-02-08 09:22:59

+2

我想我個人會將字符串傳遞給方法,並期待Base64字符串輸出(因此將UTF8.GetBytes和Convert.ToBase64String放入加密方法中)。理由是它減少了必須在任何地方進行這些轉換的開銷,並且還確保它是標準的並且(幾乎)保證一個開發人員編寫的密碼加密可以被另一個開發人員解密而無需確定哪些轉換他們可能在加密時使用。 – Iridium 2012-02-08 09:53:59

+0

核心密碼庫已經處理密鑰和二進制數據。你不應該在他們周圍創建包裝方法來做同樣的事情;相反,請專注於您的用例併爲這些用戶創建類。 – 2012-02-09 00:48:13