SHA хеширует одну и ту же строку в разные BLOB-объекты - PullRequest
2 голосов
/ 04 января 2012

Я использую следующий код для хэширования входящей строки, ожидая, что одна и та же вещь, примененная к методу несколько раз, всегда будет иметь одинаковые результаты. Сценарий будет для хеширования пароля и последующей проверки. Но, похоже, это не сработало - у меня есть две разные капли для одной входной строки. Что-то не так или отсутствует в моем коде?

public synchronized String encrypt(String token) {
    try {
        MessageDigest sha = MessageDigest.getInstance("SHA");
        sha.reset();
        sha.update(token.getBytes("UTF-8"));
        byte[] raw = sha.digest();
        System.out.println("raw = " + raw.toString());
        String hash = Base64.encodeBase64(raw).toString();
        return hash;
    } catch (Exception e) {
    }

    return token;
}

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Вы на самом деле не дали достаточно информации, но я подозреваю, что вас отвлекает это:

System.out.println("raw = " + raw.toString());

Это будет выводить что-то вроде [B@30a4effe, которое не имеет ничего с данными в байтовом массиве. Вместо этого вы должны распечатать hash - который должен быть одинаковым для всех вызовов, если ваш token действительно совпадает.

(Как отметил Дэн, ваш метод имеет неправильное название: хеширование не является шифрованием. Также, пожалуйста, не перехватывайте Exception или , просто глотайте исключения, подобные этому. верните token при ошибке тоже.)

РЕДАКТИРОВАТЬ: Как уже отмечалось, я предположил, что Base64.encode на самом деле возвращает строку, что может и не быть. Я бы порекомендовал эту реализацию base64 , которая является общественным достоянием и имеет разумный API - вызовы кодирования возвращают String, что вполне уместно. Конечно, тогда вам не нужен явный вызов toString() ...

1 голос
/ 04 января 2012

Я не знаю, какой класс Base64 вы используете, но я возьму тот из Apache Commons. Вы делаете это:

String hash = Base64.encodeBase64(raw).toString();

Который вызывает метод toString для любого произвольного байтового массива, возвращаемого методом Base64.encodeBase64(). Вот почему ваш результат является случайным каждый раз, вы просто возвращаете ссылку на объект в виде строки. Попробуйте вместо этого:

String hash = Base64.encodeBase64String(raw);

EDIT

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

...