Java SHA256向PHP SHA256输出不同的哈希吗?

Finbarr:

PHP代码:

echo hash('sha256', 'jake');

PHP输出:

cdf30c6b345276278bedc7bcedd9d5582f5b8e0c1dd858f46ef4ea231f92731d

Java代码:

String s = "jake";
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(s.getBytes(Charset.forName("UTF-8")));
byte[] hashed = md.digest();
String s2 = "";
for (byte b : hashed) {
    s2 += b;
}
System.out.println(s2);

Java输出:

-51-1312107528211839-117-19-57-68-19-39-43884791-1141229-4088-12110-12-223531-11011529

我曾期望这两个返回相同的结果。显然,事实并非如此。我怎样才能使两者匹配?

编辑:我犯了一个错误,以为我现在无论如何都可以回答这个问题。

乔恩·斯基特(Jon Skeet):

好吧,您需要做的第一件事就是使用一致的字符串编码。我不知道PHP会做什么,但是"jake".getBytes()会使用平台默认的Java编码。真是个坏主意假设PHP首先可以处理Unicode字符串,那么使用UTF-8可能是一个不错的开始。(如果不是,则需要弄清楚它做什么,并尝试使两者保持一致。)在Java中,请使用重载值为String.getBytes()a Charset或名称为a 的重载Charset(我个人喜欢使用番石榴的Charsets.UTF_8。)

然后说服PHP也使用UTF-8。

然后以十六进制输出Java结果。我非常怀疑您提供的代码是您正在运行的实际代码,否则我会期望输出诸如“ [B @ e48e1b””。无论将字节数组转换为字符串的操作是什么,请将其更改为使用十六进制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章