【问题标题】:Password Hashes Characters in Applications应用程序中的密码哈希字符
【发布时间】:2013-08-16 15:42:02
【问题描述】:

感谢您的宝贵时间。

我试图理解一些事情。为什么我手动生成的哈希似乎只包含字母数字字符 0-9、a-f,但我们最喜欢的应用程序使用的所有哈希似乎都包含所有字母 [以及大写字母]?

例子:

使用 sha256 手动散列:

# sha256sum <<< asdf
d1bc8d3ba4afc7e109612cb73acbdddac052c93025aa1f82942edabb7deb82a1  -

你永远不会看到 f 上面的任何字母。而且没有大写。

但如果我使用 htpasswd 创建一个 SHA 哈希,它会包含所有的字母数字:

# htpasswd -snb test asdf
test:{SHA}PaVBVZkYqAjCQCu6UBL2xgsnZhw=

例如,如果您查看网站 CMS 数据库中的密码哈希,也会发生同样的事情。我必须缺少一些额外的步骤,或者最终格式与实际的哈希格式不同。我认为它可能是 base64 编码或其他东西,但它似乎没有解码。

有人可以解释一下幕后发生的事情吗?我的朋友解释说,通过管道将“asdf”传输到 sha256sum 会显示校验和,这不是实际的哈希值本身。那是对的吗?如果是这样,我怎样才能看到实际的哈希?

非常感谢您!

【问题讨论】:

    标签: algorithm unix hash passwords sha256


    【解决方案1】:

    这里发生了两件事。

    首先,您的手动哈希使用的算法与htpasswd 不同。 -s 标志导致 htpasswd 使用 SHA1,而不是 SHA256。使用sha1sum 而不是sha256sum

    其次,哈希的编码不同。您的手动哈希是十六进制编码的,htpasswd 哈希是 Base64 编码的。 htpasswd 哈希解码,它只是解码为二进制。如果您尝试打印此二进制文件,它将看起来像 =¥AU™¨Â@+ºPöÆ'f(取决于您使用的字符编码),这可能就是您认为它没有解码的原因。

    如果将 Base64 直接转换为 Hex(可以使用this one 之类的在线工具),您会发现sha1sum 会生成相同的哈希。

    我的朋友解释说,通过管道将“asdf”传输到 sha256sum 会显示校验和,这不是实际的哈希值本身。

    你的朋友不正确。您会看到哈希的十六进制编码。但是管道确实会影响生成的散列,它会添加一个换行符,所以你实际散列的是asdf\n。请改用此命令:

    echo -n "asdf" | sha1sum
    

    【讨论】:

    • 我知道他们说不要留下诸如“谢谢”之类的 cmets,但我不能期望遵守生活中的每一条规则。谢谢你,Syon。
    【解决方案2】:

    它是 base64 编码的。

    Base64 encoding ends an an equal sign。所以这是第一个指标。虽然htpasswd man page 没有提到它,但other Apache docs about "the password encryption formats generated and understood by Apache" 确实说Apache 理解的SHA 格式是base64 编码的。

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2023-03-02
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多