代码之家  ›  专栏  ›  技术社区  ›  Lee

MD5Crypt背后的算法

  •  3
  • Lee  · 技术社区  · 16 年前

    我正在使用基于Windows的Subversion,并希望在.NET中编写一个简单实用程序,用于处理Apache密码文件。我知道它使用了一个称为MD5Crypt的函数,但我似乎找不到算法的描述,除了在某个点上它使用MD5创建散列。

    4 回复  |  直到 16 年前
        1
  •  4
  •   nealmcb    13 年前

    更新用于sha256和sha512的加密算法的精确文本描述位于 http://www.akkadia.org/drepper/SHA-crypt.txt

    它包含了与MD5算法的对比,因此它应该提供您所需要的。

        2
  •  3
  •   Espo    16 年前
        3
  •  2
  •   Mark Harrison    16 年前

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

    其基本思想是:

      • 您获取用户输入的密码并对其进行哈希运算
      • 将其与存储的哈希进行比较
      • 如果哈希相同,则密码匹配

    但有一个问题:

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

    因此,我们可以在密码中添加一个“salt”字符串。

    • 这可以是任何随机的事情。
    • 假设你的账户是“zuzu”,我的账户是“rjrj”。
    • 现在我们的密码有了不同的散列值。
    • 我们可以用散列密码安全地存储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) ) ));
    

    嗯!

        4
  •  2
  •   user3850 user3850    15 年前

    这个过程相当复杂。。。salt和密码不是一次散列在一起,而是1000次散列在一起。此外,base64编码使用不同的字母表,并且从末尾删除了填充。

    既然您是针对Apache编写代码的,那么看看 Apache's implementation

    我认为可以找到C语言中的原始算法 here . 它与上述实现的不同之处仅在于不同的幻数。