繁体   English   中英

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

[英]How to get hex hash with crypt() function?

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

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

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

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

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

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

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

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

谢谢!

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM