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



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

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

如果我尝试对 crypt(3( 函数做同样的事情,那么我会得到完全不同的东西:

const char* what = crypt("ChillyWilly", "$5$");
printf("%sn", what);
$5$$fQITOGYPwBrwOSpjX1Uhx5Ock/J84zbrqmTtg/SlvMB

它看起来像Base64,但事实并非如此。

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

如何使用 crypt(3( 函数获得相同的十六进制哈希?我已经按照加密手册页上的说明设置了 $5$,应该强制加密功能进入 SHA-256 模式。

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

谢谢!

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

SHA-256 是一个哈希函数,旨在快速运行。但crypt是一个密钥派生函数,用于对密码进行哈希处理。因此,它运行SHA-256多次(默认为5000次(,使其速度较慢,不易遭受暴力攻击。因此,它将给出与简单的SHA-256使用不同的结果。您可以在此处查看算法的详细信息。

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

crypt()实际上将使用相同的SHA-256算法 - 但它不会像您期望的那样返回哈希。计算哈希后,它会对结果应用另一个转换,如下所示。

所以我不会指望使用它并获得与sha256sum相同的结果,因为它是为不同的目的而构建的。您可以考虑使用 openssl SHA256 实现,或者如果您需要匹配它的其他实现。

最新更新