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"的,因为如果没有提供salt,MySQL会使用随机salt。每当ProFTPD使用MySQL后端检查密码是否与数据库中的一个条目匹配时,这应该会导致ENCRYPT('bluefish')的不同输出。

不过效果很好。ProFTPD如何知道使用了什么盐?

ProFTPD不需要知道盐是什么。

根据MySQL文档,ENCRYPT使用DES的Unix crypt()实现。正如您所指出的,如果不提供盐,则会随机选择一种盐。根据手册页:

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

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

SELECT ENCRYPT ('blowfish');

返回:

201GDb8Aj8RGU

如果你运行

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

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

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

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

返回值为:

rbMle0EHJVXcI
^^

你提供的盐现在更加明显了。

最新更新