функция java php sha1 - PullRequest
       7

функция java php sha1

1 голос
/ 19 апреля 2011

что является предупреждением о функции sha1 в java

, как в php

sha1("here is string"); 

что будет в java

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Вы используете класс java.security.MessageDigest в Java.Но обратите внимание, что хеши обычно применяются к двоичным данным, а не к строкам - поэтому сначала необходимо преобразовать строку в байтовый массив, обычно с помощью метода String.getBytes(String), - убедитесь, что вы используете перегрузку, которая задаеткодирование, а не использование платформы по умолчанию.Например (исключение обработки исключено):

MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] data = text.getBytes("UTF-8");
byte[] hash = sha1.digest(data);

Как только вы получите хеш в виде байтового массива, вы можете захотеть преобразовать его обратно в текст - что должно быть сделано либо в шестнадцатеричном виде, либо, возможно, в виде Base64Например, используя кодек Apache Commons .

Если вы пытаетесь сопоставить хеш SHA-1, созданный PHP, вам необходимо выяснить, какая кодировка это Используется при преобразовании строки в байты, и как впоследствии она представляет хеш.

0 голосов
/ 18 июня 2012

Вот что я использую. (Я проголосовал за два ответа, из которых собрал этот, но я подумал, что для простоты я вставил его в один ответ.)

// This replicates the PHP sha1 so that we can authenticate the same users.
public static String sha1(String s) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    return byteArray2Hex(MessageDigest.getInstance("SHA1").digest(s.getBytes("UTF-8")));
}

private static final char[] hex = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static String byteArray2Hex(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 2);
    for (final byte b : bytes) {
        sb.append(hex[(b & 0xF0) >> 4]);
        sb.append(hex[b & 0x0F]);
    }
    return sb.toString();
}
...