2011-01-06 63 views
2

我已经实现了我的邮件服务器作为口述herePostfix + MySQL ENCRYPT(),它如何验证随机盐的密码?

它工作得很好。我的好奇心是围绕着用户进入到数据库,并验证它们

运行:

INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('password')); 

多次将给予不同的散列加密的密码作为其利用随机盐。即如果我输入[email protected]三次使用相同的密码,每个哈希是不同的...

我的问题是,它是如何当Postfix服务器可以实际验证密码,当用户登录通过邮件客户端?

没有任何问题可以说,因为它工作正常,更多的是为了满足我的好奇心,所以我可以完全理解幕后发生的事情,以正确验证加密的密码。

回答

2

阅读man crypt:它在返回值的前两个字符中返回salt。

所以盐不会丢失,您可以将加密的字符串与crypt('pass',$ first_two_chars_of_encrypted_value)的结果进行比较。

-3

您必须使用ENCRYPT('pass','salt')强制加盐,否则盐会永远丢失,您无法恢复它。相当没有它的没有意义的功能。然而,这是一个可怕的功能,因为安全性非常小。请改用PASSWORD()或OLD_PASSWORD()。 ()使用系统crypt(),它可以使用全部或只使用前8个字符,必须是可打印的7位ascii,通常使用1轮基于DES的散列,并且是完全不可移植的。躲开它。

+1

如果盐是永远失去了,那么他的配置将不实际工作。我同意加密听起来不是一个好的解决方案,但是有没有办法让postfix接受别的东西? – Dwayne 2011-06-13 03:29:26

3

Postfix将数据库中的密码与使用盐进行的新加密(来自db的密​​码)进行比较。

加密:

update user set password = ENCRYPT('1234') where id = 1 

查询密码:

SELECT u.* FROM user u where u.email ='[email protected]' 
and ENCRYPT('1234', u.password) = u.password