2

我已经按照这里的要求实现了我的邮件服务器。

它工作得很好。我的好奇心围绕着将用户输入数据库并对其进行身份验证

跑步:

INSERT INTO users (email, password) VALUES ('sales@example.com', ENCRYPT('password'));

多次将为加密密码提供不同的哈希,因为它使用随机盐。即,如果我使用相同的密码输入 sales@example.com 三次,则每个哈希值都不同......

我的问题是,当用户通过邮件客户端登录时,Postfix 服务器如何真正验证密码?

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

4

3 回答 3

3

Postfix 将来自数据库的密码与使用 salt 完成的新加密(来自 db 的密码)进行比较。

加密:

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

检查密码:

SELECT u.* FROM user u where u.email ='admin@dominio.com' 
and ENCRYPT('1234', u.password) = u.password
于 2012-10-03T12:45:03.723 回答
2

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

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

于 2011-02-11T11:28:57.473 回答
-3

您必须使用 ENCRYPT('pass','salt') 强制添加盐,否则盐将永远丢失,您无法恢复它。没有它相当没有意义的功能。但是,这是一个糟糕的功能,因为安全性非常低。请改用 PASSWORD() 或 OLD_PASSWORD()。

ENCRYPT() 使用系统 crypt(),它可以使用全部或只使用前 8 个字符,必须是可打印的 7 位 ascii,通常使用 1 轮基于 DES 的哈希,并且完全不可移植。躲开它。

于 2011-01-07T02:35:44.050 回答