感谢您的时间。
我想要了解一些事情。为什么我手动生成的哈希值似乎只包含字母数字字符0-9,a-f,但我们最喜欢的应用程序使用的所有哈希值似乎都包含所有字母[和大写字母]?
示例:
使用sha256的手动哈希:
# sha256sum <<< asdf
d1bc8d3ba4afc7e109612cb73acbdddac052c93025aa1f82942edabb7deb82a1 -
你永远不会看到f以上的任何字母。没有什么是资本化的。
但是如果我使用htpasswd创建一个SHA哈希,它就有了所有的字母数字:
# htpasswd -snb test asdf
test:{SHA}PaVBVZkYqAjCQCu6UBL2xgsnZhw=
例如,如果您查看网站CMS数据库中的密码哈希,则会发生同样的情况。必须有一些额外的步骤我缺少或结束格式不同于实际的哈希格式。我认为它可能是base64编码或其他东西,但它似乎没有解码。
有人可以解释一下幕后发生的事情吗?我的朋友解释说管道“asdf”到sha256sum显示校验和,这不是实际的哈希本身。那是对的吗?如果是这样,我怎么能看到实际的哈希?
非常感谢先进!
答案 0 :(得分:1)
这里有两件事情。
首先,您的手动哈希使用的算法与htpasswd
不同。 -s
标志导致htpasswd
使用SHA1,而不是SHA256。使用sha1sum
代替sha256sum
。
其次,哈希的编码是不同的。您的手动哈希是十六进制编码的,htpasswd
哈希是Base64编码的。 htpasswd
哈希将解码,它只是解码为二进制。如果您尝试打印此二进制文件,它将看起来像=¥AU™¨Â@+ºPöÆ'f
(取决于您正在使用的字符编码),这可能就是您认为它不能解码的原因。
如果您将Base64直接转换为Hex(您可以使用this one等在线工具),您会发现sha1sum
会生成相同的哈希值。
我的朋友解释说,将shad6sum的“asdf”管道显示校验和,这不是实际的哈希值。
你的朋友不对。您正在看到哈希的十六进制编码。但是管道确实会影响生成的哈希值,它会添加一个换行符,所以实际哈希的是asdf\n
。请改用此命令:
echo -n "asdf" | sha1sum
答案 1 :(得分:0)
它是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编码的。