使用 mysql 8 SHA2 进行 dovecot 密码散列
dovecot password hashing with mysql 8 SHA2
以前 (MySQL 5.7) 我们使用此命令将新电子邮件地址添加到现有 table:
INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), 'user@example.com'),
然后 dovecot 能够对用户进行身份验证。 (more information 关于 dovecot 密码方案)
现在,在 MySQL 的最新版本中已弃用 Encrypt。 (link)
我想使用 SHA2 重写该命令,但没有成功。
编辑:
这可以帮助某人使用 How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin 配置具有 Mysql.
版本 8.0 的邮件服务器
最后,我将 dovecote 用于其用户身份验证的默认方法从 SHA512-CRYPT
更改为 SHA512
。我认为它的安全性不亚于此,但受到 MySQL 8.
的支持
之后,我使用此命令将新用户添加到 table.
INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', TO_BASE64(UNHEX(SHA2('password', 512))), 'user@example.com');
SHA512-CRYPT 似乎无法在 MySQL 内实施,就 Dovecot 而言,我承认我不明白为什么他们建议首先使用加密。按照 OP 建议使用强 hash 至少同样有效并且更安全。
因为我更喜欢加盐的密码,下面是我使用 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
- 删除 MySQL 的
TO_BASE64()
函数添加的不需要的换行符
结果是一个 256 字节长的字符串,因此您可能需要将 password
字段更新为 VARCHAR(256)。
有很多教程建议使用 doveadm
手动生成加密密码,虽然效果很好,但我觉得有点麻烦。有兴趣的可以这样称呼:
doveadm pw -s SHA512-CRYPT -p "YourPasswordHere"
更有用的是能够使用相同的实用程序验证您生成的密码:
doveadm auth test user@example.com YourPasswordHere
以前 (MySQL 5.7) 我们使用此命令将新电子邮件地址添加到现有 table:
INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$', SUBSTRING(SHA(RAND()), -16))), 'user@example.com'),
然后 dovecot 能够对用户进行身份验证。 (more information 关于 dovecot 密码方案)
现在,在 MySQL 的最新版本中已弃用 Encrypt。 (link)
我想使用 SHA2 重写该命令,但没有成功。
编辑:
这可以帮助某人使用 How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin 配置具有 Mysql.
最后,我将 dovecote 用于其用户身份验证的默认方法从 SHA512-CRYPT
更改为 SHA512
。我认为它的安全性不亚于此,但受到 MySQL 8.
的支持
之后,我使用此命令将新用户添加到 table.
INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', TO_BASE64(UNHEX(SHA2('password', 512))), 'user@example.com');
SHA512-CRYPT 似乎无法在 MySQL 内实施,就 Dovecot 而言,我承认我不明白为什么他们建议首先使用加密。按照 OP 建议使用强 hash 至少同样有效并且更安全。
因为我更喜欢加盐的密码,下面是我使用 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
- 删除 MySQL 的
TO_BASE64()
函数添加的不需要的换行符
结果是一个 256 字节长的字符串,因此您可能需要将 password
字段更新为 VARCHAR(256)。
有很多教程建议使用 doveadm
手动生成加密密码,虽然效果很好,但我觉得有点麻烦。有兴趣的可以这样称呼:
doveadm pw -s SHA512-CRYPT -p "YourPasswordHere"
更有用的是能够使用相同的实用程序验证您生成的密码:
doveadm auth test user@example.com YourPasswordHere