2008-08-22 32 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。它不同于上面的实现只是由不同的幻数。