关于算法:密码哈希应用程序中的字符

Password Hashes Characters in Applications

谢谢你的时间。

我想了解一些事情。为什么我手工生成的散列看起来只包含字母数字字符0-9、a-f,但我们最喜欢的应用程序使用的所有散列似乎都包含所有字母[和大写字母]?

例子:

使用sha256手动散列:

1
2
# sha256sum <<< asdf
d1bc8d3ba4afc7e109612cb73acbdddac052c93025aa1f82942edabb7deb82a1  -

你从来没有看到F.以上的字母,也没有大写的。

但是,如果我使用htpasswd创建一个sha散列,它将包含所有字母数字:

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

例如,如果您查看网站cms数据库中的密码哈希,也会发生同样的事情。必须有一些额外的步骤丢失,或者结束格式与实际哈希格式不同。我以为它可能是base64编码的或者什么的,但它似乎没有解码。

有人能解释一下这里幕后发生了什么吗?我的朋友解释说,通过管道"asdf"到sha256sum显示的是校验和,而不是真正的哈希本身。对吗?如果是这样,我如何才能看到实际的散列值?

非常感谢你的进步!


这里有两件事。

首先,您的手动散列使用的是与htpasswd不同的算法。-s标志使htpasswd使用sha1,而不是sha256。用sha1sum代替sha256sum

第二,散列的编码是不同的。您的手动散列是十六进制编码的,htpasswd散列是base64编码的。htpasswd散列将被解码,它只是解码为二进制。如果您尝试打印这个二进制文件,它将看起来像=¥AU?¨?@+oP??'f(取决于您使用的是什么字符编码),这可能是您认为它没有解码的原因。

如果您将base64直接转换为hex(您可以使用类似于此的在线工具),您会发现sha1sum将生成相同的哈希。

My friend explained that piping"asdf" to sha256sum is showing the checksum, which is not the actual hash itself.

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

1
echo -n"asdf" | sha1sum


它是base64编码的。

base64编码以等号结尾。所以这是第一个指标。虽然htpasswd手册页没有提到它,但是其他关于"Apache生成和理解的密码加密格式"的Apache文档确实说Apache理解的sha格式是base64编码的。