【问题标题】:How to get hex hash with crypt() function?如何使用 crypt() 函数获取十六进制哈希?
【发布时间】:2020-05-27 02:28:19
【问题描述】:

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

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

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

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

看起来像 Base64 但不是。

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

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

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

谢谢!

【问题讨论】:

  • 您希望sha256 生成与crypt 相同的哈希值吗?为什么?它们是不同的算法。
  • crypt 上的联机帮助页警告很有趣。 “使用大规模并行计算机可以对这个关键空间进行详尽的搜索。”。这些天我们称之为 iGPU,并认为它们不适合严肃的游戏:D。我们搬到sha256 是有原因的。
  • 是的,我确实期待同样的结果。这就是 5 美元的用途。这应该强制 crypt 函数生成一个 SHA256 哈希。假设密钥和盐是相同的,我应该得到相同的结果。
  • @ellont 啊,我现在明白了。是的,现在这对我来说很有意义。

标签: c hash sha256 crypt


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多