我有一个关于理解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))), 'email1@example.com'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');
再次,这完全正常,即我可以用我的密码(只有我的密码)登录到dovecot。但为什么?如果我看对了,它会用随机盐加密密码,但它不能保存在任何地方。所以两次使用相同的密码给我两个不同的哈希值(我试过了)。所以我的问题归结为: 我能否简单解释一下sha-512(我无法在网上找到)以及解释为什么这些线路有效?
非常感谢
答案 0 :(得分:13)
盐被保存为密码的一部分。例如,呼叫:
ENCRYPT('firstpassword', CONCAT('$6$', 'FooBarBaz'))
给出
$ 6 $ $ FooBarBaz .T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe。
这将存储使用的算法(6为SHA512)和盐(' FooBarBaz')都由$
删除。
编辑:要检查密码,您可以使用:
password = ENCRYPT('user_input', `password`)
ENCRYPT
将从存储的密码中获取salt,并在检查user_input
时使用此密码。
hek2mgl完全归功于他在this answer中详述的密码检查。