我目前正在开发一个共享主机应用程序,该机器使用完整的 MySQL 后端。我已经设置了所有服务,它们运行正常,但是 pure-ftpd 出现了一点问题。
您可能知道,Pure-FTPd 可以通过 来与 MySQL 协同工作pure-ftpd-mysql
。基本配置如下:
MYSQLServer 127.0.0.1
MYSQLPort 3306
MYSQLSocket /var/run/mysqld/mysqld.sock
MYSQLUser myftpdbuser
MYSQLPassword myftpdbpassword
MYSQLDatabase myftpdb
MYSQLCrypt md5
# Here come the selection queries...
如您所见,我选择了 md5 作为加密算法,但这存在问题。我使用的是 Symfony2,并且我已为我的用户将编码器设置为 sha512,当我想使用与我的某个用户相同的密码创建 FTP 帐户时,我必须将 sha512 哈希复制到 FTP 帐户。
不过,这还是很令人满意的,Pure-FTPd 配置为 md5,因此它无法检查此密码。我想尽可能保留 sha512,因为使用 md5 需要对我的代码进行一些修改才能重新加密。
Pure-FTPd 配置示例如下:
# Mandatory : how passwords are stored
# Valid values are : "cleartext", "crypt", "sha1", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "sha1", "md5" *and* "password"
所以这是我的疑问:我能否将 Pure-FTPd 设置为使用 sha512,例如使用“crypt”?也许我可以crypt
在其他地方使用并配置它以使用 sha512,我不知道...
编辑
我尝试过查询,但找不到任何技巧。这是密码查询:
MYSQLGetPW SELECT password FROM ftp_accounts WHERE username='\L'
解决方案
经过几次搜索并根据得到的答案,我得出了 3 个解决方案:
- 开发一个 Pure-FTPd 身份验证模块设计来执行 MySQL 查询,并处理密码加密机制。这意味着将 PHP 算法移植到 C(或其他语言),我使用 OpenSSL 库完成了这项工作。启动一个
SHA512_CTX
结构并获取您的第一个摘要。使用正确的参数迭代 500 次,并执行 base 64 编码。您还可以根据您的 Symfony 设置使用十六进制结果。 - 设置
crypt(3)
为在 PureFTPd 下使用加盐 SHA512 哈希。当你开始谈论 500 次迭代时,这是一件棘手的事情。 - 开发一个 Symfony2 命令来为您执行身份验证。非常简单,效果很好。创建一个可执行脚本(假设
/usr/bin/pureftpd-auth
它只是调用/path/to/php /path/to/app/console your:ftp:auth:command
.chmod
它,给它一个适当的解释器(#!/bin/bash
,...)并在共享套接字上启动pure_authd
和pureftpd
使它们进行通信。参见http://download.pureftpd.org/pure-ftpd/doc/README.Authentication-Modules了解更多信息。
答案1
glibc 2.7 及更高版本确实支持 sha512,但仅以加盐方式。如果您确实有加盐的 SHA512 哈希,则使用“crypt”应该可以立即起作用。
如果您确实有未加盐的 sha512 哈希:请避免使用它们 - 认真的。有预先计算的数据库可用,因此从这些数据库中查找哈希将立即为您提供明文密码或至少可用于成功登录的内容。使用当前 GPU 计算哈希也非常快,因此需要避免任何未加盐的方式。
例如,https://www.crackstation.net/为您提供了一个良好的网络界面,用于从哈希值中查找数百万个未加盐的密码,并提供一些关于“加盐哈希值与未加盐哈希值”的教育,选择正确的(随机)盐和“好的”哈希算法。
举个现实生活中的例子,数百万个来自 linkedin 和 lastfm 的未散列密码散列确实泄露到了互联网上,使用预先计算的散列数据库或彩虹表,只需几天时间就能找到其中大多数匹配的明文密码。使用加盐散列,更有可能需要数月或数年才能找到与您的散列匹配的明文数据。
如果您确实了解无盐哈希的风险,并且仍然绝对需要通过 MySQL 实现无盐 sha512,则可以通过向 pure-authd 提供自定义脚本来实现(这样做相当简单)。请参阅http://download.pureftpd.org/pure-ftpd/doc/README.Authentication-Modules了解更多信息。