Java SHA256向PHP SHA256输出不同的哈希值?
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
我曾预料到两者会返回相同的结果。 显然,事实并非如此。 如何让两者相匹配或者不可能?
编辑:我犯了一个错误,认为我现在已经回答了这个问题。
嗯,您需要做的第一件事是使用一致的字符串编码。 我不知道PHP会做什么,但"jake".getBytes()
将使用你的平台默认编码用于Java。 这是一个非常糟糕的主意 。 假设PHP应对Unicode字符串开始,使用UTF-8可能是一个好的开始。 (如果没有,你需要弄清楚它在做什么,并尝试使两者保持一致。)在Java中,使用String.getBytes()
的重载,它带有一个Charset
或一个带名字的一个Charset
。 (我个人喜欢使用Guava的Charsets.UTF_8
。)
然后说服PHP也使用UTF-8。
然后以hex输出Java结果。 我非常怀疑你给出的代码是你正在运行的实际代码,否则我会期望输出如“[B @ e48e1b”。 无论您将字节数组转换为字符串,都要将其更改为使用hex。
它们打印相同..将您的byte []转换为hex字符串,然后您将看到CDF30C6B345276278BEDC7BCEDD9D5582F5B8E0C1DD858F46EF4EA231F92731D作为Java输出:
public void testSomething() throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update("jake".getBytes()); System.out.println(getHex(md.digest())); } static final String HEXES = "0123456789ABCDEF"; public static String getHex( byte [] raw ) { if ( raw == null ) { return null; } final StringBuilder hex = new StringBuilder( 2 * raw.length ); for ( final byte b : raw ) { hex.append(HEXES.charAt((b & 0xF0) >> 4)) .append(HEXES.charAt((b & 0x0F))); } return hex.toString(); }
您需要在将摘要打印出来之前将其转换为HEX字符串。 示例代码可以在这里找到。