SHA512-CRYPT 似乎不可能在 MySQL 中实现,就 Dovecot 而言,我承认我无法理解他们为什么建议一开始就使用加密。使用 OP 建议的强散列至少也可以工作并且更安全。
由于我更喜欢带有额外盐的密码,因此我使用 Dovecot 的SSHA512的方式如下,它是“存储在 base64 中的密码的加盐 SHA512 总和”:
INSERT INTO `virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
(NULL, '1', (SELECT REPLACE(TO_BASE64(CONCAT(UNHEX(SHA2(CONCAT('YourPasswordHere', v.salt), 512)), v.salt)), '\n', '') AS salted FROM (SELECT SHA2(RAND(), 512) AS salt) v), 'user@example.com');
或更新密码:
UPDATE virtual_users
SET `password` = (
SELECT REPLACE(TO_BASE64(CONCAT(UNHEX(SHA2(CONCAT('YourPasswordHere', v.salt), 512)), v.salt)), '\n', '') AS salted
FROM (
SELECT SHA2(RAND(), 512) AS salt
) v
)
WHERE email = 'user@example.com';
这些查询:
- 生成一个随机(相当长的)盐
- 将盐附加到密码
- 获取 #2 的 SHA512 哈希
- 将哈希转换为二进制
- 将盐添加到#4
- 将整个东西转换为 Base64
TO_BASE64()
删除 MySQL函数添加的不需要的换行符
结果是一个 256 字节长的字符串,因此您可能需要将password
字段更新为 VARCHAR(256)。
有许多教程建议使用doveadm
手动生成加密密码,虽然这很好用,但我发现它有点麻烦。对于那些感兴趣的人,您可以这样称呼它:
doveadm pw -s SHA512-CRYPT -p "YourPasswordHere"
更有用的是能够使用相同的实用程序验证生成的密码:
doveadm auth test user@example.com YourPasswordHere