4

我已经设置了 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 会使用随机盐。这应该会导致ENCRYPT('bluefish')每次 ProFTPD 使用 MySQL 后端检查密码是否与数据库中的一个条目匹配时的不同输出。

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

4

1 回答 1

2

ProFTPD 不需要知道盐是什么。

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

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

您可以通过运行例如:

SELECT ENCRYPT ('blowfish');

返回:

201GDb8Aj8RGU

如果你然后运行

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

你会得到同样的结果201GDb8Aj8RGU。只有前两个字符用作盐。

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

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

返回值为:

rbMle0EHJVXcI
^^

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

于 2013-08-04T05:14:34.287 回答