我正在尝试获取登录数据库的以 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 读取的。
如果将 -binary
更改为 -hex
,则可以从 openssl
获得相同的十六进制值:
$ echo -n master | openssl dgst -sha256 -hex
(stdin)= fc613b4dfd6736a7bd268c8a0e74ed0d1c04a959f59dd74ef2874983fd443fc9
但是,没有办法做相反的事情。 sha256sum
没有用于打印二进制哈希值的标志。它只能做十六进制。
关于java - Linux 中哈希命令的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61667824/