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

时间:2013-07-28 18:21:56

标签: mysql encryption ftp passwords salt

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

1 个答案:

答案 0 :(得分:2)

ProFTPD不需要知道盐是什么。

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

  

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

您可以通过运行例如:

为自己验证
SELECT ENCRYPT ('blowfish');

返回:

201GDb8Aj8RGU

如果你再运行

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

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

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

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

返回值为:

rbMle0EHJVXcI
^^

现在提供的盐更加明显。