ProFTPD如何读取使用MySQL ENCRYPT()函数加密的密码?

我已经设置了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如何知道使用了什么盐?

解决方法:

ProFTPD不需要知道盐是什么.

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

The returned value points to the encrypted password, a series of 13
printable ASCII characters (the first two characters represent the
salt itself).

您可以通过运行例如:自己来验证这一点.

SELECT ENCRYPT ('blowfish');

返回:

201GDb8Aj8RGU

如果你然后运行

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

你会得到相同的结果201GDb8Aj8RGU.只有前两个字符用作salt.

如果您提供自己的盐,它会变得更清晰,例如:

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

返回的值是:

rbMle0EHJVXcI
^^

你提供的盐现在更加明显.

上一篇:高性能MySQL(上)


下一篇:使用mysqlbinlog工具进行基于位置或时间点的数据恢复