我已经设置了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
^^
你提供的盐现在更加明显.