我有一个关于理解 sha512-crypt 哈希的问题。我找到了这个tutorial来使用mysql设置dovecot和postfix。我按照教程进行操作(稍作修改),一切正常。但有一点我不明白:
要添加用户,我应该使用:
INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');
再说一次,这工作得很好,即我可以使用我的密码(并且只有我的密码)登录 dovecot。但为什么?如果我没看错的话,它会用随机盐加密密码,但不会将其保存在任何地方。因此,对相同的密码进行两次哈希处理会得到 2 个不同的哈希值(我尝试过)。所以我的问题归结为: 我可以得到 sha-512 的简要说明(我在网上找不到)以及这些线路为何有效的解释吗?
已经谢谢了
盐作为密码的一部分保存。例如调用:
ENCRYPT('firstpassword', CONCAT('$6$', 'FooBarBaz'))
给予
$6$FooBarBaz$.T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe。
这存储了所使用的算法(6 是 SHA512)和盐(“FooBarBaz”),两者均由
$
指定。
编辑:要检查密码,您可以使用:
password = ENCRYPT('user_input', `password`)
ENCRYPT
将从存储的密码中获取盐并在检查user_input
时使用它。
完全归功于hek2mgl,他在这个答案中详细介绍了密码检查。
您可以直接使用dovecot来生成哈希。
用途:
sudo doveadm pw -s SHA512-CRYPT
这将要求您输入您尝试创建的用户的密码,并返回一个字符串,您可以将其复制并粘贴到 MYSQL 数据库中。
INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
(1, 1, '{SHA512-CRYPT}$6$5kJy...', '[email protected]'),
(...)
;