2008-08-22 72 views
3

我正在使用基於Windows的Subversion,並希望在.NET中編寫一個易於使用Apache密碼文件的實用程序。我知道它使用了一個稱爲MD5Crypt的函數,但我似乎無法找到超出該算法的描述,在某些時候它使用MD5創建哈希。背後的算法MD5Crypt

有人可以描述MD5Crypt算法和密碼行格式嗎?

回答

4

隱窩算法更新與SHA256和SHA512使用的精確的文字說明是在http://www.akkadia.org/drepper/SHA-crypt.txt

它包括MD5算法的對比,所以它應該給你你在找什麼。

+0

謝謝!這正是我很久以前正在尋找的東西。我真的希望在Stack Overflow上有更多這樣的信息。不考慮個別編程語言的算法描述和討論。我希望我不僅僅贊成和接受。 – Lee 2011-02-16 01:13:11

2

MD5Crypt的一個Apache兼容md5crypt的例子基本上是老式的UNIX crypt函數的替代品。它是在freebsd中引入的,並且也被其他組所採用。

的基本思路是這樣的:

  • 哈希是用於存儲密碼
    • 你把用戶輸入的密碼和散列它
    • 比較它存儲的散列
    • 的好方法
    • 如果哈希值相同,密碼匹配

但是有一個問題:

  • 假設你選擇的密碼「傑夫」,我也挑密碼「傑夫」。
  • 現在我們的密碼哈希值都是一樣的。
  • 所以,如果我看到存儲的哈希碼,我會知道你的密碼和我的「jeff」一樣。

所以,我們可以給密碼添加一個「鹽」字符串。

  • 這可以是任何隨機的東西。
  • 假設您的帳戶是「zuzu」,而我的帳戶是「rjrj」。
  • 現在我們爲您的密碼散列字符串「jeffzuzu」,爲我的密碼散列「jeffrjrj」。
  • 現在我們有我們的密碼不同的哈希值。
  • 我們可以安全地存儲散列密碼的salt值,因爲即使知道salt值也無助於解碼散列值。

你提到的.NET,還有在另一個論壇上是一個指針這樣的:

System.Security.Cryptography.MD5CryptoServiceProvider md5 = new 
System.Security.Cryptography.MD5CryptoServiceProvider(); 

string hash =BitConverter.ToString((md5.ComputeHash(
System.Text.ASCIIEncoding.Default.GetBytes(stringtohash)))); 

HTH!

2

這個過程相當複雜......鹽和密碼不是一次就是一次,而是1000次。此外,base64編碼使用不同的字母表,並且從末尾刪除填充。

最好的事情可能是找到一個庫來使用,就像cygwin下的glibc一樣。

既然你對Apache編碼,看看crypt-md5的Apache's implementation

在C中的原始算法(我認爲)可以找到here。它不同於上面的實現只是由不同的幻數。