我使用以下代码将用户密码存储到mysql表中,密码列为BINARY(20)
类型:
$salted_hash = sha1($salt . $password);
$sql = sprintf("INSERT INTO foo(user, password) VALUES ('guest', UNHEX('%s'))", $salted_hash);
匹配密码的选择查询如下所示:
$salted_hash = sha1($salt . $password);
$sql = sprintf("SELECT `userID` FROM `foo` WHERE `user`='guest' AND `password`=UNHEX('%s')", $salted_hash);
当我连接到在Windows或Mac机器上运行的Web服务器时,代码工作正常。但是,我的生产Web主机是一台Linux机器,而SELECT
在那里失败了。
我只能phpMyAdmin
到我的网站托管服务商(mhpMyAdmin版本3.4.7.1)。通过phpMyAdmin我执行以下查询:
SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104')
显示的结果与十六进制数3530280EDB5AA715929266D1D6F0423ABC27B104
相同,这似乎表明UNHEX
函数在linux上没有做任何事情。
如果我在Mac上Sequel Pro执行相同的查询,我会50(ÛZ§fÑÖðB:¼'±
。
我不确定发生了什么,在哪里看。我在想,phpMyAdmin无法显示二进制文件,或者UNHEX确实存在一些问题(似乎不同)。感谢任何帮助。
答案 0 :(得分:1)
这似乎是一个可配置的设置:"Show binary contents as HEX"。我在同一台服务器上试过你的查询...
SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104')
...但使用两个不同的客户端。我可以确认phpMyAdmin以你找到的方式转义二进制输出。您可以使用以下方法仔细检查输出是否正确:
SELECT HEX(UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104'))='3530280EDB5AA715929266D1D6F0423ABC27B104'
...,应返回1,或使用简单的PHP脚本运行原始查询。总结一下:UNHEX()
没有错。
我使用的大多数托管服务实际上允许外部MySQL客户端,您只需要在控制面板中启用它。确保情况并非如此。如果你能与Sequel Pro联系,那么使用愚蠢的网络客户端是愚蠢的。
我建议你用PHP代码进一步调试。我不清楚如何构建匹配的哈希(你在其他查询中检索盐吗?)。
答案 1 :(得分:0)
如果您正在阅读这篇文章,是因为上述解决方案都不适合您(对我而言)。
我已经通过使用存储过程解决了...
CREATE DEFINER=`root`@`%` PROCEDURE `SearchMessage`(IN code_to_search VARCHAR(255))
BEGIN
SELECT * FROM tablename WHERE UPPER(UNHEX(SUBSTRING(hex_field,25))) like CONCAT('%',UPPER(TRIM(text_to_search)),'%') COLLATE latin1_swedish_ci;
END
希望有帮助。