crypt() 不返回标准 MD5 哈希?

crypt() not returning standard MD5 Hash?

我正在尝试使用 C 中 <crypt.h> 中的 crypt() 函数,例如,当我尝试在 MD5 中散列字符串时,它 returns 与标准的 MD5 散列将从 md5sum 等工具生成。 Example/Proof:

hash.c:

#include <stdio.h>
#include <crypt.h>

#define MD5 "$"

int main() {

        const char string[] = "helloworld";
        char * hash = crypt(string, MD5);

        printf("%s\n",hash);

        return 0;
}

我用gcc -o hash hash.c -lcrypt和运行编译:

./hash
$$edK86ZB1Vvaz2eneY.itb.

根据我对 UNIX 系统的了解,crypt 的输出格式与 UNIX 用户的密码格式匹配,而第一部分是散列 ID/type,第二部分是盐,第三部分是实际哈希 - $id$salt$hash。然而 helloworld 的实际标准 MD5 散列是 fc5e038d38a57032085441e7fe7010b0。有什么方法可以使用 crypt() 生成此哈希值吗?非常感谢!

crypt() 的 glibc 实现返回的字符串不仅仅是 salt + 编码成 base 16 的密码的简单散列。

如果您查看 MD5 版本的 the source code,您会看到一个循环,该循环采用先前的 MD5 散列并对其进行散列,重复一千次。然后它变成一个字符串,重复使用名为 __b64_from_24bit() 的函数,一次将最终 MD5 哈希的 3 个字节(不是线性顺序)编码为我假设的 base 64.

这就是为什么您所看到的与 md5sum 等的输出完全不同的原因。