Нужно ли вызывать MessageDigest.reset () перед его использованием? - PullRequest
5 голосов
/ 25 сентября 2011

Вопрос прост: когда я должен вызывать функцию reset () для java-класса MessageDigest?

Вопрос в основном исходит от ссылки OWASP , где в примере кода они делают:

   MessageDigest digest = MessageDigest.getInstance("SHA-1");
   digest.reset();
   digest.update(salt);
   byte[] input = digest.digest(password.getBytes("UTF-8"));

затем, в цикле, они делают:

   for (int i = 0; i < iterationNb; i++) {
       digest.reset();
       input = digest.digest(input);
   }

Теперь мне кажется, что сброс требуется только после того, как экземпляр дайджеста уже «загрязнен» вызовами для обновления. Следовательно, тот, что в первом примере, не кажется необходимым. Если это необходимо, означает ли это, что экземпляр, возвращенный MessageDigest.getInstance, не является потокобезопасным?

1 Ответ

4 голосов
/ 25 сентября 2011

Я думаю, что вы правы, начальная reset() не нужна. Документация гласит :

Объект MessageDigest начинает инициализироваться.

Также пример в документации класса не включает первоначальный сброс.

Это не имеет ничего общего с безопасностью потока, необходимость в .reset() будет означать, что getInstance() не выполняет саму инициализацию.

В любом случае вы не должны использовать один и тот же объект MessageDigest из нескольких потоков без синхронизации: хэш имеет смысл только в том случае, если вы знаете, в каком порядке хешируются части, в противном случае это просто не совсем детерминированный PRNG.

...