2013-07-28 70 views
4

我已经设置了ProFTPD,以便它使用mod_sql_mysql后端。一切工作正常,直到我将用户插入SQL数据库。我用下面的查询可以这样做:ProFTPD如何读取使用MySQL ENCRYPT()函数加密的密码?

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

ProFTPD不需要知道盐是什么。

根据MySQL documentation,ENCRYPT使用DES的Unix crypt()执行。正如你所指出的,如果没有提供盐,则选择一种随机盐。根据man网页:

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

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

SELECT ENCRYPT ('blowfish'); 

返回:

​​

如果你再运行

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

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

如果你提供你自己的盐,比如它成为一个更清晰一点:

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

返回的值是:

rbMle0EHJVXcI 
^^ 

您提供盐现在更加明显。

+0

谢谢你的解释!我不知道这个!我可能不得不深入挖掘crypt()一点点:) – user2628088