У меня есть база данных, в которой есть имя пользователя, пароль и соль пароля. Пароль хешируется с использованием SHA512.
Данные в моей базе данных пользователей выглядят так:
пользователь = testuser
password_hash = 4acf9dc364843d1adfadfadf42de7d5707b791cc3ee8a2013f15efa8bdb
password_salt = QYhZ47zsQA =
Я пытаюсь пройти аутентификацию в этой базе данных, используя аутентификацию dovecot sql и SSHA512. Я включил отладку аутентификации и вижу это в mail.log:
dovecot: auth-worker(8603): Debug: sql(testuser,22.22.22.22): query: SELECT username as user, password_hash as password, password_salt as salt FROM users WHERE username='testuser';
dovecot: auth-worker(8603): sql(testuser,22.22.22.22): Password mismatch
dovecot: auth-worker(8603): Debug: sql(testuser,22.22.22.22): SSHA512(testpassword) != '4acf9dc364843d1adfadfadf42de7d5707b791cc3ee8a2013f15efa8bdb'
dovecot: auth: Debug: client passdb out: FAIL#0111#011user=testuser#011salt=QYhZ47zsQA=
dovecot: auth: Debug: client in: AUTH#0112#011PLAIN#011service=imap#011secured#011session=rZmPoRYOagBJ3Ukh#011lip=33.33.33.33#01 1rip=22.22.22.22#011lport=993#011rport=53098#011resp=AHJpY2hlZQBjY2NwdGFtdDNtcA== (previous base64 data may contain sensitive data)
dovecot: imap-login: Disconnected (auth failed, 2 attempts in 8 secs): user=<testuser>, method=PLAIN, rip=22.22.22.22, lip=33.33.33.33, TLS, session=<rZmPoRYOagBJ3Ukh>
Я также попытался выполнить проверку аутентификации, которая тоже не удалась:
$ sudo doveadm auth test testuser testpassword
passdb: richee auth failed
extra fields:
user=testuser
salt=QYhZ47zsQA=
К сожалению, документация dovecot не описывает, как именно аутентифицироваться против солёных хэшей. Я чувствую, что мне нужно сказать dovecot, что мой хэш пароля - шестнадцатеричный Salted SHA512, а моя соль - 8 байт base64. Однако я понятия не имею, как сказать голубятне использовать соль. Как я могу использовать соли при аутентификации голубятни?
Для пароля поиска SQL у dovecot есть дополнительная документация здесь. Для получения дополнительной информации вы можете прочитать ветку на SO: Как безопасно генерировать хеши SSHA256 или SSHA512 в PHP?. В этом ответе я предполагаю, что вы используете MySQL для базы данных.
Чтобы сопоставить схему аутентификации dovecot и вашу пользовательскую схему аутентификации, один из методов - ваш запрос должен быть возвращен password
поле, содержащее
{SSHA512.HEX}HashofPasswordandSaltinHEXformatТатуировка SaltinHEX
С помощью операций со строками из SQL мы можем построить такой запрос
SELECT CONCAT("{SSHA512.HEX}", `hex_password`, HEX(FROM_BASE64(`salt`))) AS password FROM mytable WHERE userid = '%u'
Поместите запрос выше в password_query
параметр в файле конфигурации dovecot-sql.
В приведенном выше запросе мы создаем специальную строку через SQL concat. Конечно, поскольку у вас другой формат для соли и хэша, мы должны преобразовать его с помощью декодирование base-64 затем шестнадцатеричное кодирование.
Похоже, обсуждение здесь было перенесено на эта страница с более полной и исчерпывающей информацией.