Строка Java для SHA1 - PullRequest
       32

Строка Java для SHA1

138 голосов
/ 04 февраля 2011

Я пытаюсь сделать простой преобразователь String в SHA1 в Java, и вот что у меня получилось ...

public static String toSHA1(byte[] convertme) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    } 
    return new String(md.digest(convertme));
}

Когда я передаю его toSHA1("password".getBytes()), я получаю [�a�ɹ??�%l�3~��.Я знаю, что это, вероятно, простое исправление кодировки, такое как UTF-8, но кто-то может сказать мне, что я должен сделать, чтобы получить то, что я хочу - 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8?Или я делаю это совершенно неправильно?

Ответы [ 12 ]

1 голос
/ 04 февраля 2011

Причина, по которой это не работает, в том, что когда вы вызываете String(md.digest(convertme)), вы говорите Java интерпретировать последовательность зашифрованных байтов как строку. Вы хотите преобразовать байты в шестнадцатеричные символы.

0 голосов
/ 05 февраля 2011

Преобразование байтового массива в шестнадцатеричную строку.

public static String toSHA1(byte[] convertme) {
    final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] buf = md.digest(convertme);
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i) {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}
...