【发布时间】:2021-02-03 01:19:30
【问题描述】:
我正在尝试为 Java 和 Go 中的相同输入生成具有相同算法 (sha256) 的哈希。有趣的是,我得到了两个值。任何解释表示赞赏,我需要在 Go 中生成 Java 中生成的相同哈希。
Java 代码:
public byte[] sha256Hash(byte[] content) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
return digest.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage(),e);
}
}
byte[] to ="AA".getBytes();
byte[] shaed = sha256Hash(to);
System.out.println(Arrays.toString(shaed));
Java 输出:[88, -69, 17, -100, 53, 81, 58, 69, 29, 36, -36, 32, -17, 14, -112, 49, -20, -123, -77、91、-4、-111、-99、38、62、126、93、-104、104、-112、-100、-75]
去:
fmt.Println(sha256.Sum256([]byte("AA")))
输出:[88 187 17 156 53 81 58 69 29 36 220 32 239 14 144 49 236 133 179 91 252 145 157 38 62 126 93 152 104 144 156 181]
【问题讨论】:
-
不一样是什么意思?打印的十进制字节?
-
如果你用 Java 打印一个字节数组,你不会得到任何有用的东西。你会得到
[B@,后跟一个哈希码。它没有告诉你字节数组的内容,这很重要。 -
Java 的
byte已签名,而 Go 的byte未签名:参见 this answer。将它们打印为十六进制值,然后它们应该匹配。 -
@khelwood 我已经使用 Arrays.tostring() 来打印我忘记发布的 java 输出。即使这样,它也不同
-
那么这就是我怀疑的:它是this的副本。