У меня есть сервер Dovecot с базой данных MySQL для хранения имен пользователей и паролей. Пароли в базе данных находятся в схеме SHA512-CRYPT.
Я вставляю хешированные пароли в базу данных с помощью скрипта.
doveadm pw -s SHA512-CRYPT -p password -r 500000
Я хочу хэшировать пароли с помощью приложения JAVA. Я нашел эти вопросы и попытался создать такой же результирующий хеш, используя тот же пароль firstpassword
и соль FooBarBaz
. По какой-то причине полученный хеш отличается, хотя я использую тот же алгоритм хеширования, соль и пароль.
Вот мой код Java:
byte[] password = "firstpassword".getBytes();
byte[] salt = "FooBarBaz".getBytes();
MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(salt);
byte[] hashed = digest.digest(password);
String encodedHash = Base64.getEncoder().encodeToString(hashed);
System.out.printf("{SHA512-CRYPT}$6$%s$%s", "FooBarBaz",encodedHash);
Это выводит хеш:
{SHA512-CRYPT}$6$FooBarBaz$5WPtOnXVI/a6f003WByGKIcsfa6x0ansxiyE8uEfJ0TE5pI+Rv9kcMLgdZboKg7ZSWQgWFg+pIqruvdg6aiP/g==
Я также попытался поменять порядок соли + пароль, чтобы сделать это:
digest.update(password);
byte[] hashed = digest.digest(salt);
это дает мне:
{SHA512-CRYPT}$6$FooBarBaz$QWS8+W5EWhModF+uO2tcsd55tDxzdzGJ5FurIbEgwVCwKfT5UqwIvBNG1Oyws8bZEFdeGgyD0u6zS1KArvGf9Q==
Кто-нибудь знает, как я могу добиться тех же результатов хеширования в Java, если я использую тот же пароль и соль?
Хэш, который я ищу, это:
{SHA512-CRYPT}$6$FooBarBaz$.T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe.