如何用PHP中的salt检查mysql加密值?

时间:2013-05-23 01:05:13

标签: php mysql security

对于我的网站,我使用这个MySQL函数将我的用户密码存储在数据库中:

ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))

现在我的用户需要登录,我需要检查他们提供的密码和数据库中的值。

我认为它会像这样容易:

SELECT user FROM users WHERE id = $id AND password = ENCRYPT('$password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))

然而,由于RAND()函数......

,显然这不起作用

那么如何在PHP(或mysql)中重新创建此密码以使其与加密密码相匹配?我假设我需要使用crypt()或hash(),但老实说我不确定是应该使用PHP还是MySQL。

我使用的是MySQL 5.5版,PHP版本5.3

1 个答案:

答案 0 :(得分:3)

ENCRYPT()使用的盐(更好地称为crypt()函数)存储为散列的一部分,可以用作散列的一部分:

SELECT ... FROM users WHERE ... AND password = ENCRYPT('swordfish', password);

(也就是说,如果用户输入的密码是“箭鱼”。我正在避免使用“密码”,因为它也是一个列名。)

您可以(并且应该)通过检查:

在PHP中执行相同的操作
crypt($user_password, $hashed_password) == $hashed_password

请注意,crypt()不是特别安全的密码存储方法。有关详细信息,请参阅Secure hash and salt for PHP passwords