首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙256不同结果

沙256不同结果
EN

Stack Overflow用户
提问于 2015-12-23 07:29:55
回答 2查看 14.3K关注 0票数 19

如果我从Mac调用命令

代码语言:javascript
复制
echo hello | shasum -a 256

或来自ubuntu

代码语言:javascript
复制
echo hello | sha256sum

然后我得到以下结果

代码语言:javascript
复制
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03  -

我注意到最后有破折号。

但是,当我使用Python hashlibjava.security.MessageDigest时,它们给出的结果与以下相同:

代码语言:javascript
复制
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

有人能指出我哪里弄错了吗?

谢谢。

Python:

代码语言:javascript
复制
>>> import hashlib
>>> hashlib.sha256("hello").hexdigest()

爪哇:

代码语言:javascript
复制
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());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-23 07:35:57

echo命令正在向字符串中添加一个尾换行符。尝试:

代码语言:javascript
复制
hashlib.sha256("hello\n").hexdigest()
票数 29
EN

Stack Overflow用户

发布于 2015-12-23 09:07:10

这是一个解释字符和十六进制编码的广泛答案,您可以跳过这里并查看下面的代码

sha256sum和相关命令在输出中添加了破折号:-。这些命令用于显示*文件的散列值。一个破折号仅仅意味着输入来自标准的inpuIt流(即没有文件名)。不幸的是,我没有看到任何抑制输出的选项,所以您必须自己删除它才能得到实际的哈希值。

因此,散列实用程序不仅返回哈希值。SHA-256散列值仅由32个字节组成。由于人类无法读取二进制文件,所以使用十六进制显示二进制文件,但实际值仍应视为字节。十六进制字符只是这些字节的表示。

哈希函数的输入由位或字节组成。这意味着编码文本的任何差异都意味着哈希值将是不同的。当涉及到空白和行尾编码时,这一点特别棘手。不过,与其添加尾随换行符,不如在"hello“的情况下,使用-n命令行选项来抑制echo命令。

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

外壳码

使用sha256sum**:**的

代码语言:javascript
复制
echo -n "hello" | sha256sum | tr -d "[:space:]-"

使用命令行的OpenSSL:

代码语言:javascript
复制
echo -n hello | openssl sha256 -binary | od -An -tx1 | tr -d "[:space:]"

在这里,od -An -tx1将分别显示每个字节,而不是分组它们,这可能会导致问题。

tr -d "[:space:]将从十六进制和尾随换行符中删除空格。对于sha256sum,还删除了破折号文件指示符(请注意末尾的- )。通过这种方式,可以执行文本(大小写不敏感)比较。

Python代码

在Python中,没有行尾:

代码语言:javascript
复制
print(hashlib.sha256("hello").hexdigest(), end="")

Java代码

对于Java,您还应该确保文本编码与系统默认编码相匹配,否则可能会遇到麻烦。所以你应该改变:

代码语言:javascript
复制
md.update(text.getBytes("UTF-8"));

代码语言:javascript
复制
md.update(text.getBytes());

以获取平台字符编码。如果不这样做,如果平台的编码与您要比较的字符串的UTF-8不兼容,则比较将失败。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34430714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档