2

我很感激你的时间。

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

例子:

使用 sha256 手动散列:

# sha256sum <<< asdf
d1bc8d3ba4afc7e109612cb73acbdddac052c93025aa1f82942edabb7deb82a1  -

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

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

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

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

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

非常感谢您的先进!

4

2 回答 2

1

这里发生了两件事。

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

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

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

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

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

echo -n "asdf" | sha1sum
于 2013-08-14T16:11:39.013 回答
0

它是 base64 编码的。

Base64 编码以等号结束。所以这是第一个指标。尽管htpasswd 手册页没有提到它,但其他关于“Apache 生成和理解的密码加密格式”的 Apache 文档确实说 Apache 理解的 SHA 格式是 base64 编码的。

于 2013-08-14T15:52:03.513 回答