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