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

Я ожидал, что двое вернут тот же результат. Очевидно, это не так. Как я могу заставить их совпасть или это невозможно?

EDIT: Я ошибся, думаю, теперь я отвечу на вопрос.

Ну, самое первое, что вам нужно сделать, это использовать согласованную строчную кодировку. Я понятия не имею, что будет делать PHP, но "jake".getBytes() будет использовать все, что ваша стандартная кодировка платформы для Java. Это действительно плохая идея . Использование UTF-8, вероятно, будет хорошим началом, если предположить, что PHP справляется с строками Unicode для начала. (Если это не так, вам нужно будет разобраться, что он делает, и попытаться сделать их согласованными.) В Java используйте перегрузку String.getBytes() которая берет Charset или тот, который берет имя Charset . (Лично мне нравится использовать Charsets Charsets.UTF_8 .)

Затем убедите PHP использовать UTF-8.

Затем выведите результат Java в hex. Я очень сомневаюсь, что код, который вы указали, является фактическим кодом, который вы используете, так как в противном случае я ожидал бы выход, например «[B @ e48e1b». Независимо от того, что вы делаете, чтобы преобразовать массив байтов в строку, измените его на использование 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. Пример кода можно найти здесь .