如果我从Mac调用命令
echo hello | shasum -a 256
或者来自ubuntu
echo hello | sha256sum
然后我得到以下结果
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 -
我注意到最后有冲刺.
但是当我使用Python hashlib
或Java时java.security.MessageDigest
,它们会给我相同的结果如下:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
所以,有人能指出我错在哪里吗?
谢谢.
蟒蛇:
>>> import hashlib >>> hashlib.sha256("hello").hexdigest()
Java的:
MessageDigest md = MessageDigest.getInstance("SHA-256"); String text = "hello"; md.update(text.getBytes("UTF-8")); byte[] digest = md.digest(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < digest.length; i++) { sb.append(String.format("%02x", digest[i] & 0xFF)) } System.out.println(sb.toString());
Turn.. 12
这些echo
命令正在为字符串添加尾部换行符.尝试:
hashlib.sha256("hello\n").hexdigest()
Maarten Bode.. 6
的sha256sum
和相关的命令添加的破折号:-
在输出中.这些命令用于显示*文件的哈希值.单个破折号仅表示输入来自标准inpuIt流(即没有文件名).不幸的是我没有看到抑制输出的选项,所以你必须自己删除它以获得实际的哈希值.
因此,哈希实用程序不仅返回哈希值.SHA-256哈希值只包含32个字节.由于人类无法读取二进制文件,因此二进制文件使用十六进制显示,但实际值仍应被视为字节.十六进制字符只是这些字节的表示.
散列函数的输入也包括位或字节.这意味着编码文本的任何差异都意味着哈希值将不同.当涉及到空白和行尾编码时,这尤其棘手.在"hello"的情况下,可能最好使用-n
命令的命令行选项来抑制它,而不是添加尾随换行符echo
.
请尝试以下方法:
echo -n "hello" | sha256sum | tr -d "[:space:]-"
或者,使用OpenSSL(具有类似问题):
echo -n hello | openssl sha256 -binary | od -An -tx1 | tr -d "[:space:]"
这也将删除尾随换行符,因此您可以进行十六进制比较.
对于Java,您还应确保文本编码与系统默认编码匹配,否则您可能会遇到麻烦.所以你应该改变:
md.update(text.getBytes("UTF-8"));
至
md.update(text.getBytes());
获得平台字符编码.如果不这样做,如果平台的编码与要比较的字符串的UTF-8不兼容,则比较将失败.
在没有尾随行的Python中,要完成此答案:
print(hashlib.sha256("hello").hexdigest(), end="")
请注意十六进制本身也可以以不同的方式显示; 您将确保不存在空格,并且比较不区分大小写或者字节的表示始终使用相同的大小写.
这些echo
命令正在为字符串添加尾部换行符.尝试:
hashlib.sha256("hello\n").hexdigest()
的sha256sum
和相关的命令添加的破折号:-
在输出中.这些命令用于显示*文件的哈希值.单个破折号仅表示输入来自标准inpuIt流(即没有文件名).不幸的是我没有看到抑制输出的选项,所以你必须自己删除它以获得实际的哈希值.
因此,哈希实用程序不仅返回哈希值.SHA-256哈希值只包含32个字节.由于人类无法读取二进制文件,因此二进制文件使用十六进制显示,但实际值仍应被视为字节.十六进制字符只是这些字节的表示.
散列函数的输入也包括位或字节.这意味着编码文本的任何差异都意味着哈希值将不同.当涉及到空白和行尾编码时,这尤其棘手.在"hello"的情况下,可能最好使用-n
命令的命令行选项来抑制它,而不是添加尾随换行符echo
.
请尝试以下方法:
echo -n "hello" | sha256sum | tr -d "[:space:]-"
或者,使用OpenSSL(具有类似问题):
echo -n hello | openssl sha256 -binary | od -An -tx1 | tr -d "[:space:]"
这也将删除尾随换行符,因此您可以进行十六进制比较.
对于Java,您还应确保文本编码与系统默认编码匹配,否则您可能会遇到麻烦.所以你应该改变:
md.update(text.getBytes("UTF-8"));
至
md.update(text.getBytes());
获得平台字符编码.如果不这样做,如果平台的编码与要比较的字符串的UTF-8不兼容,则比较将失败.
在没有尾随行的Python中,要完成此答案:
print(hashlib.sha256("hello").hexdigest(), end="")
请注意十六进制本身也可以以不同的方式显示; 您将确保不存在空格,并且比较不区分大小写或者字节的表示始终使用相同的大小写.