php - 如何在 PHP 中用盐检查 mysql 加密值?

标签 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 版

最佳答案

ENCRYPT()(更广为人知的是 crypt() 函数)使用的盐被存储为散列的一部分,并且可以用作散列:

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

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

您可以(并且应该)通过检查在 PHP 中做同样的事情:

crypt($user_password, $hashed_password) == $hashed_password

请注意,crypt() 并不是一种特别安全的密码存储方法。请看Secure hash and salt for PHP passwords了解详情。

关于php - 如何在 PHP 中用盐检查 mysql 加密值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704051/

相关文章:

php - 如何正确地将 "$data"从一个 mySQL 查询输入到另一个查询中?

docker - 如何保护公共(public) docker hub 图像?

php - 清除 XML 的 mysql 数据

php - Codeigniter 3 分页错误 : the second page shows records 3 to 13 instead of 11 to 20

PHP/MySQL 将 'while' 语句转换为 'foreach'

mySQL - 我应该反规范化吗?

javascript - 确保 meteor 聊天的安全

ISP 的 Javascript 注入(inject)

php - CDbCommand执行SQL语句失败: SQLSTATE[HY000]: General error: 1364

php - (.*) 和 (.*?) 之间的区别