Результат Java MessageDigest не остается постоянным - PullRequest
1 голос
/ 18 мая 2010

У меня есть эта функция для шифрования паролей в Java, но как-то, когда я звоню MessageDigest, он каждый раз возвращает другой результат, даже если я вызываю его с тем же паролем. Интересно, я что-то неправильно инициализирую?

public String encrypt (String password) {
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    md.reset();     
    md.update(password.getBytes(Charset.forName("utf-8")),0,password.length());
    String res = md.digest().toString();
}

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Этот простой код дает три разных результата:

    MessageDigest digest = MessageDigest.getInstance("MD5");
    System.out.println("test1 ");
    System.out.println(digest.digest("test".getBytes("UTF-8")));

    Thread.sleep(10000);        
    System.out.println("test2 ");
    System.out.println(digest.digest("test".getBytes("UTF-8")));

    Thread.sleep(10000);
    System.out.println("test3 ");
    System.out.println(digest.digest("test".getBytes("UTF-8")));
1 голос
/ 18 мая 2010

Вы можете изменить подпись метода:

public byte[] encrypt (String password) {
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    md.reset();
    md.update(password.getBytes(Charset.forName("utf-8")), 0, password.length());
    return md.digest();
}

... и используйте Arrays.equals(byte[], byte[]) для сравнения дайджестов.

1 голос
/ 18 мая 2010

Метод .toString() для byte[], который является возвращаемым значением .digest(), просто дает представление массива, а не его содержимого.

См. этот ответ о том, как преобразовать ваш байтовый массив в шестнадцатеричную строку.

Другой подход заключается в использовании Arrays.toString (byte []) , хотя это, вероятно, не дает требуемый формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...