Java SHA256 выводит другой хэш в PHP SHA256? - PullRequest
8 голосов
/ 13 января 2011

код 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

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

РЕДАКТИРОВАТЬ: Я сделал ошибку, думаю, у меня все равно есть ответ на вопрос.

Ответы [ 3 ]

12 голосов
/ 13 января 2011

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

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

Затем вывести результат Java в шестнадцатеричном виде.Я очень сомневаюсь, что код, который вы дали, является реальным кодом, который вы запускаете, иначе я бы ожидал вывод, такой как "[B @ e48e1b".Что бы вы ни делали для преобразования байтового массива в строку, измените его на шестнадцатеричное.

6 голосов
/ 13 января 2011

Они печатают одно и то же .. преобразуйте ваш байт [] в шестнадцатеричную строку, тогда вы увидите 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();
}
2 голосов
/ 13 января 2011

Вам необходимо преобразовать дайджест в шестнадцатеричную строку перед печатью. Пример кода можно найти здесь .

...