我目前正在迁移旧的网络服务器。
旧服务器使用存储在 mysql 表中并mod_auth_mysql
启用的用户的基本身份验证。
密码存储在 apaches 的 sha1 函数SELECT sha1('secret')
中,适用于mod_auth_mysql
不幸mod_auth_mysql
的是不再支持。这就是为什么我找到mod_authn_dbd
了替代方案。
https://documentation.help/httpd-2.4-es/mod_authn_dbd.html
我已经设法让所有东西都启动并运行,直到我可以使用基本身份验证和固定密码登录为止
<Location />
AuthType Basic
AuthName "Test"
AuthBasicProvider dbd
Require valid-user
AuthDBDUserPWQuery "SELECT '{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=' FROM users WHERE user = %s"
</Location>
我只将 sha1 哈希存储在用户表中。虽然由 mysql ( ) mod_authn_dbd 生成的旧mod_auth_mysql
接受的哈希SELECT sha1('test')=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
没有。
根据https://documentation.help/httpd-2.4-es/password_encryptions.html
SHA1 "{SHA}" + Base64 编码的密码 SHA-1 摘要。
接受 htpasswd 生成的密码。
htpasswd -bns user test
user:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
现在我需要将此值a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
(存储在我的数据库中用于密码测试)转换qUqP5cyxm6YcTAhz05Hph5gvu9M=
为 mysql 内部的(密码测试的接受值)
我已经试过了
SELECT to_base64(sha1('test')), to_base64(ucase(sha1('test'))), to_base64(lcase(sha1('test')));`
但没有一个产生预期的结果。
我要么需要一种方法将我现有的密码哈希转换为预期的格式,要么说服mod_authn_dbd
我接受我现有的 sha1 哈希。
任何帮助,将不胜感激
您用 PHP 示例回答了您自己的问题。PHP 中的 pack() 函数将二进制数据的十六进制表示(SHA-1 哈希通常显示为人类可读)转换为其原始二进制(非人类可读)形式。您需要针对您生成的这种二进制形式的 SHA-1 哈希运行 to_base64(),如下所示:
在这种情况下,您将仅使用 MySQL 获得所需的输出。
这不是对我的问题的直接回答,但可能是一种解决方法,我在一篇博客文章中发现有人遇到了同样的问题。
http://nileshbansal.blogspot.com/2008/06/password-encryption-mysql-apache-and.html
在评论中有一个关于如何使用 php 创建 htpasswd 兼容哈希的链接。我确认这给出了与
htpasswd -bns
命令相同的结果如果没有人知道更好的解决方案(只有 mysql 而没有 php),我会适当地扩展我的用户表,并在其中存储密码的列以这种方式存储。有点多余,但它应该工作。