我有一个数据库,里面有用户名、密码和密码盐。密码使用 SHA512 进行哈希处理。
我的用户数据库中的数据如下:
用户=测试用户
密码哈希 = 4acf9dc364843d1adfadfadf42de7d5707b791cc3ee8a2013f15efa8bdb
密码盐 = 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 我的密码哈希是十六进制加盐 SHA512,而我的盐是 8 字节 base64。但是我不知道如何告诉 dovecot 使用盐。如何在对 dovecot 进行身份验证时使用盐?
答案1
对于 SQL 查找密码,dovecot 有额外的文档在这里。有关其他信息,您可以阅读 SO 上的一个帖子:如何在 PHP 中安全地生成 SSHA256 或 SSHA512 哈希?。在这个答案中,我假设您使用 MySQL 作为数据库。
为了匹配 dovecot 身份验证方案和您的自定义身份验证方案,其中一种方法是您的查询必须返回password
包含以下字段的字段
{SSHA512.HEX}HashofPassword和SaltinHEX格式SaltinHEX格式
通过 SQL 的字符串操作,我们可以构造如下查询
SELECT CONCAT("{SSHA512.HEX}", `hex_password`, HEX(FROM_BASE64(`salt`))) AS password FROM mytable WHERE userid = '%u'
将上述查询放入password_query
dovecot-sql 配置文件中的参数中。
在上面的查询中,我们通过以下方式构造特殊字符串SQL 连接当然,因为你的盐和哈希格式不同,所以我们必须通过base-64 解码然后十六进制编码。
看起来这里的讨论已被转载这一页提供更加完整、全面的信息。