我正试图为一个登录数据库获取base64编码的密码哈希值。我正在使用picketbox安全库来获取密码的base64编码哈希值,但我想使用不同的工具。
如果我使用:
java -cp $JBOSS_HOME/modules/system/layers/base/org/picketbox/main/picketbox-4.9.6.Final.jar org.jboss.security.Base64Encoder master SHA-256
我得到的结果是:
[/GE7Tf1nNqe9JoyKDnTtDRwEqVn1nddO8odJg/1EP8k=];
[
]
必须在数据库中被删除才能正常登录。
当我使用:
echo -n master | openssl dgst -sha256 -binary | base64
我得到的结果是:
/GE7Tf1nNqe9JoyKDnTtDRwEqVn1nddO8odJg/1EP8k=
同样的结果。
但是当我使用
echo -n master |sha256sum -b | base64
我得到的结果是:
ZmM2MTNiNGRmZDY3MzZhN2JkMjY4YzhhMGU3NGVkMGQxYzA0YTk1OWY1OWRkNzRlZjI4NzQ5ODNmZDQ0M2ZjOSAqLQo=
这两者之间有什么区别? openssl dgst -sha256 -binary
和 sha256sum -b
? 我以为他们会提供相同的哈希值。
看看这两者的区别 openssl
和 sha256sum
:
openssl
打印原始二进制的哈希值。它不是文本,也不是人类可读的,它是纯字节。
$ echo -n master | openssl dgst -sha256 -binary
�Y��N�I��D?�
如果你用 wc ---bytes
你会看到它的打印正好是32个字节。
$ echo -n master | openssl dgst -sha256 -binary | wc --bytes
32
我们也可以用 hexdump
:
$ echo -n master | openssl dgst -sha256 -binary | hexdump
0000000 61fc 4d3b 67fd a736 26bd 8a8c 740e 0ded
0000010 041c 59a9 9df5 4ed7 87f2 8349 44fd c93f
0000020
与此相反。sha256sum
用十六进制的数字以人类可读的形式打印哈希值。0-9
和字母 a-f
.
$ echo -n master | sha256sum -b
fc613b4dfd6736a7bd268c8a0e74ed0d1c04a959f59dd74ef2874983fd443fc9 *-
它与上面的乱码二进制信息相同,但呈现方式不同。你会注意到,十六进制值比二进制数据占用了更多的空间。它还包括了最后的文件名,这里的文件名是加密的 *-
. *
表示您使用了 -b
旗帜,而 -
表示输入是从 stdin 读取的。
你可以从 openssl
如果你改变 -binary
到 -hex
:
$ echo -n master | openssl dgst -sha256 -hex
(stdin)= fc613b4dfd6736a7bd268c8a0e74ed0d1c04a959f59dd74ef2874983fd443fc9
但没有办法做相反的事情。sha256sum
没有打印二进制哈希的标志。它只能打印十六进制。