10

以前(MySQL 5.7)我们使用此命令将新的电子邮件地址添加到现有表中:

INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user@example.com'),

然后 dovecot 能够对用户进行身份验证。(有关 dovecot 密码方案的更多信息
) 现在加密已在最新版本的 MySQL 中被弃用。(链接

我想使用 SHA2 重写该命令,但没有成功。

编辑:
这可以帮助某人使用如何使用 Postfix、Dovecot、MySQL 和 SpamAssassin配置邮件服务器来配置带有 8.0 版 Mysql 的邮件服务器。

4

2 回答 2

15

最后,我将 dovecote 用于其用户身份验证的默认方法从SHA512-CRYPT更改为SHA512。我认为它并不比这更安全,但 MySQL 8 支持它。
之后我使用这个命令向表中添加了一个新用户。

INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', TO_BASE64(UNHEX(SHA2('password', 512))), 'user@example.com'); 
于 2018-08-09T08:20:10.327 回答
2

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';

这些查询:

  1. 生成一个随机(相当长的)盐
  2. 将盐附加到密码
  3. 获取 #2 的 SHA512 哈希
  4. 将哈希转换为二进制
  5. 将盐添加到#4
  6. 将整个东西转换为 Base64
  7. TO_BASE64()删除 MySQL函数添加的不需要的换行符

结果是一个 256 字节长的字符串,因此您可能需要将password字段更新为 VARCHAR(256)。

有许多教程建议使用doveadm手动生成加密密码,虽然这很好用,但我发现它有点麻烦。对于那些感兴趣的人,您可以这样称呼它:

doveadm pw -s SHA512-CRYPT -p "YourPasswordHere"

更有用的是能够使用相同的实用程序验证生成的密码:

doveadm auth test user@example.com YourPasswordHere
于 2021-09-08T14:31:50.627 回答