如何使用 crypt() 函数获取十六进制哈希值?

How to get hex hash with crypt() function?

如果我在终端中创建一个 SHA-256,我会得到一个漂亮的十六进制哈希:

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

如果我尝试对 crypt(3) 函数执行相同的操作,那么我会得到完全不同的结果:

const char* what = crypt("ChillyWilly", "$");
printf("%s\n", what);
$$fQITOGYPwBrwOSpjX1Uhx5Ock/J84zbrqmTtg/SlvMB

它看起来像 Base64,但它不是。

我的假设是,如果密钥和盐值相等,那么我应该得到相同的结果。网络中的所有 SHA-256 哈希器将从相同的 key/salt 组合生成相同的结果。

如何使用 crypt(3) 函数获得相同的十六进制散列?我已经按照 crypt manpage 上的说明设置了 $5$,这应该会强制 crypt 函数进入 SHA-256 模式。

我知道这里有几个类似的问题,但它们似乎没有包含正确答案。

谢谢!

crypt() 实际上会使用相同的 SHA-256 算法 - 但它不会像您期望的那样 return 哈希。在计算哈希后,它会对结果应用另一个转换,as seen here

所以我不会指望使用它并获得与 sha256sum 相同的结果,因为它是为不同的 purpose. You might look into using the openssl SHA256 实现而构建的,或者如果您需要它来匹配的话。

虽然 crypt$ 模式下可以使用 SHA-256,但它们不是一回事。

SHA-256 是一种哈希函数,旨在 运行 快速。但是 crypt 是一个用于散列密码的密钥派生函数。因此,它 运行s SHA-256 多次(默认为 5000 次)以使其变慢并且不易受到暴力攻击。所以它会给出与简单的 SHA-256 使用不同的结果。可以看到算法的细节here.

如您所见,crypt 也不会将结果输出为十六进制,而是作为类似 Base64 的编码(不是标准的 Base64,但基于类似的想法)。如果您希望获得与 SHA-256 相同的结果,那么尝试转换为十六进制是没有意义的。