MD5Crypt背后的算法

时间:2020-03-05 18:42:16  来源:igfitidea点击:

我正在使用基于Windows的Subversion,并且想在.NET中编写一个简单的实用程序来使用Apache密码文件。我知道它使用了一个称为MD5Crypt的函数,但在某些时候它似乎使用MD5创建散列,因此似乎找不到该算法的描述。

有人可以描述MD5Crypt算法和密码行格式吗?

解决方案

回答

我们可以在tcllib软件包中找到md5crypt的实现。可从sourceforge下载。

我们还可以在CAS通用处理程序的源代码中找到与apache兼容的md5crypt的示例。

回答

MD5Crypt基本上是老式的unix crypt函数的替代品。它是在freebsd中引入的,并已被其他组织采用。

基本思想是这样的:

  • 将其与存储的哈希值进行比较
  • 如果哈希值相同,则密码匹配

但是有一个问题:

  • 假设我们选择密码" jeff",我也选择了密码" jeff"。
  • 现在,我们的两个密码哈希都相同。
  • 因此,如果我看到存储的哈希码,我将知道密码与我的密码" jeff"相同。

因此,我们可以在密码中添加一个"盐"字符串。

  • 这可以是任何随机的东西。
  • 假设帐户是" zuzu",而我的帐户是" rjrj"。
  • 现在,我们将字符串" jeffzuzu"作为密码,并将" jeffrjrj"作为我的密码。
  • 现在,我们为密码使用了不同的哈希值。
  • 我们可以使用哈希密码安全地存储盐值,因为即使知道盐值也无助于解码哈希。

我们提到.net,另一个论坛对此有一个指示:

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

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

HTH!

回答

这个过程相当复杂……盐和密码不是一次哈希在一起,而是哈希在一起1000次。而且,base64编码使用了不同的字母,并且从末尾删除了填充。

最好的办法可能是找到要使用的库,例如cygwin下的glibc。

既然我们还是用Apache编写代码,那么请看一下Apache的crypt-md5实现。

C语言中的原始算法(我认为)可以在这里找到。它与上述实现的区别仅在于魔术数不同。