SHA 256不同的结果

时间:2015-12-23 07:29:55

标签: python hash cryptography sha256

如果我从Mac调用命令

echo hello | shasum -a 256

或来自ubuntu

echo hello | sha256sum

然后我得到以下结果

5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03  -

我注意到最后有冲刺。

但是当我使用Python hashlib或Java java.security.MessageDigest时,它们会给我相同的结果如下:

2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

那么,有人能指出我弄错了吗?

感谢。

的Python:

>>> import hashlib
>>> hashlib.sha256("hello").hexdigest()

爪哇:

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());

2 个答案:

答案 0 :(得分:10)

echo命令正在为字符串添加尾随换行符。尝试:

hashlib.sha256("hello\n").hexdigest()

答案 1 :(得分:5)

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="")

请注意十六进制本身也可以以不同方式显示;你会确保空格不存在,并且比较是不区分大小写的,或者字节的表示总是使用相同的大小写。