0

当用户在我的网站上注册时,我使用加密功能将他们的密码插入到数据库中(数据库是 mysql);

$qry = "INSERT INTO members(firstname, lastname, email, login, passwd) VALUES ('$fname','$lname','$email', '$login',ENCRYPT('$password'))";

当我在他们登录时匹配它时,我使用此查询,但它似乎不起作用;

$qry="SELECT * FROM members WHERE login='$login' AND passwd = ENCRYPT('$password')";

为什么这不起作用?

4

2 回答 2

3

根据加密文档

加密(str [,盐])

使用 Unix crypt() 系统调用加密 str 并返回二进制字符串。salt 参数必须是一个至少包含两个字符的字符串,否则结果将为 NULL。如果没有给出 salt 参数,则使用随机值。

然后,您会得到相同的结果,因为每次您请求函数加密时,都会使用一个新的盐字符串,可能您需要在尝试之前设置盐。例如,当我尝试使用盐时,我得到了我一直在寻找的结果

SELECT ENCRYPT(  'hello',  'stringSalt' ) =  'stOIgrUfQZeZ.'

但是,如果我不使用盐串

select encrypt('hello');

1st result: qn8VHq6xLWgQc
2nd result: 6odpFDddcEdoA

两者结果完全不同

最后,如果 crypt 函数不在您的操作系统上,则结果将为空

(感谢@Fred ii 的说明)

于 2013-10-24T23:33:19.060 回答
0

加密密码并不容易,你不应该问堆栈溢出。

本文讨论了正确的方法:Secure hash and salt for PHP passwords

不要从头开始发明它,您必须使用行业标准和强大的方法,例如 scrypt、bcrypt 或 pbkdf2,在使用它们之前,您需要研究它们的工作原理并确保正确实施它们。

任何关于实施的问题都应该在 security.stackexchange.com 上询问,因为堆栈溢出并不是真正的安全问题的地方。

到目前为止,您发布的技术完全错误。它无法修复,您需要从头开始并以不同的方式进行。

于 2013-10-24T23:25:07.897 回答