【问题标题】:Postfix + MySQL ENCRYPT(), How does it verify the password with randomizing salt?Postfix + MySQL ENCRYPT(),它如何使用随机盐验证密码?
【发布时间】:2011-06-04 23:29:52
【问题描述】:

我已经按照here 的指示实现了我的邮件服务器。

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

跑步:

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

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

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

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

【问题讨论】:

    标签: mysql encryption postfix-mta encryption-asymmetric


    【解决方案1】:

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

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

    【讨论】:

    • 如果盐永远丢失了,那么他的配置实际上就不会起作用。我同意加密听起来不是一个好的解决方案,但是有没有办法让后缀接受其他东西?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 2015-08-22
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多