【问题标题】:How can ProFTPD read a password encrypted with the MySQL ENCRYPT() function?ProFTPD 如何读取使用 MySQL ENCRYPT() 函数加密的密码?
【发布时间】:2013-07-28 11:51:58
【问题描述】:

我已设置 ProFTPD 以便它使用 mod_sql_mysql 后端。在我将用户插入 SQL 数据库之前,一切正常。为此,我使用了以下查询:

INSERT INTO `auth`.`users` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`)
 VALUES ('username', ENCRYPT('bluefish'), '999', '999', '/dev/zero', '/bin/laden');

我可以很好地登录我的帐户,但我真的不明白 ProFTPD 如何读取加密密码"bluefish",因为如果没有提供盐,MySQL 会使用随机盐。每次 ProFTPD 使用 MySQL 后端检查密码是否与数据库中的一个条目匹配时,这都会导致 ENCRYPT('bluefish') 的不同输出。

虽然它工作得很好。 ProFTPD 如何知道使用了什么盐?

【问题讨论】:

    标签: mysql encryption ftp passwords salt


    【解决方案1】:

    ProFTPD 不需要知道盐是什么。

    根据MySQL documentationENCRYPT 使用 Unix crypt() 的 DES 实现。正如您所指出的,如果没有提供盐,则会选择随机盐。根据man页面:

    返回值指向加密后的密码,一串13 可打印的 ASCII 字符(前两个字符代表 盐本身)。

    您可以自己验证这一点,例如运行:

    SELECT ENCRYPT ('blowfish');
    

    返回:

    201GDb8Aj8RGU
    

    如果你然后运行

    select ENCRYPT ('blowfish', '201GDb8Aj8RGU');
    

    您将得到相同的结果201GDb8Aj8RGU。只有前两个字符用作盐。

    如果你提供自己的盐会变得更清楚一些,例如:

    SELECT ENCRYPT ('blowfish', 'rb');
    

    返回值为:

    rbMle0EHJVXcI
    ^^
    

    您提供的盐现在更加明显。

    【讨论】:

    • 感谢您的解释!我不知道这个!我可能需要深入研究 crypt() :)
    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2011-06-04
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多