我有一个数据库,其中有一个用户名,密码和密码盐。 密码使用SHA512散列。
我的用户数据库中的数据如下所示:
user = testuser
password_hash = 4acf9dc364843d1adfadfadf42de7d5707b791cc3ee8a2013f15efa8bdb
password_salt = QYhZ47zsQA =
我正在尝试使用dovecot sql身份validation和SSHA512对此数据库进行身份validation。 我已经打开身份validationdebugging,我看到这在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>
我也试图做一个validationtesting,也失败了:
$ sudo doveadm auth test testuser testpassword passdb: richee auth failed extra fields: user=testuser salt=QYhZ47zsQA=
不幸的是, dovecot文档没有涵盖如何validation盐渍的哈希值。 我觉得我需要告诉dovecot我的密码哈希是hex腌制SHA512和我的盐是8个字节的base64。 然而,我不知道如何告诉dovecot使用盐。 在authenticationdovecot时如何使用盐?
对于SQL查找密码,dovecot 在这里有其他文档。 有关其他信息,您可以阅读SO上的线程: 如何在PHP中安全地生成SSHA256或SSHA512哈希值? 。 在这个答案我假设你使用MySQL的数据库。
为了匹配dovecot身份validationscheme和您的自定义身份validationscheme,其中一种方法是您的查询必须返回password字段,该字段包含
{SSHA512.HEX} HashofPasswordandSaltinHEXformat SaltinHEXformattoo
使用SQL的string操作,我们可以像这样构造一个查询
SELECT CONCAT("{SSHA512.HEX}", `hex_password`, HEX(FROM_BASE64(`salt`))) AS password FROM mytable WHERE userid = '%u'
把上面的查询放在dovecot-sqlconfiguration文件中的password_query参数中。
在上面的查询中,我们通过SQL concat构造特殊的string。 当然,因为你对salt和hash有不同的格式,所以我们必须用base-64解码和 hex编码来转换它。
看起来像这里的讨论已经在这个页面上的更完整和全面的信息。