Понимание хэширования паролей в Java с помощью MessageDigest - PullRequest
4 голосов
/ 04 января 2012

Я создаю простое веб-приложение и хочу сохранить хешированные пароли в базе данных. Мне также нужна хеш-функция для токена аутентификации (объединение имени пользователя и даты и отправка их с хешем клиенту в качестве токена).

Я обнаружил, что Java-класс MessageDigest может помочь мне в этом. Вот одна ссылка . Основная идея выглядит так:

public String digestString (String stringToHash) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] stringBytes = stringToHash.getBytes();
    byte[] stringDigest = sha256.digest(stringBytes);
    return new String(stringDigest);
}

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

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

1 Ответ

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

Хеш не использует ключ. Это просто односторонний алгоритм. Вы даете ему что-то переварить, и он возвращает хеш. То, что он гарантирует, это то, что чрезвычайно трудно найти исходный ввод или любой другой ввод, который приводит к тому же хешу.

В вашем алгоритме есть две основные проблемы (помимо недостатка соления):

  • он использует String.getBytes (), который полагается на кодировку платформы по умолчанию и, таким образом, отличается от платформы к платформе. Вы должны указать кодировку, например UTF-8.
  • он использует новую строку (byte []), которая имеет ту же проблему, что и выше + дополнительная: вся последовательность байтов не является допустимым символом. Чтобы преобразовать чисто двоичный байтовый массив в строку, используйте алгоритм кодирования base64. Apache Commons коды имеет один.
...