下面是我的帐户凭据。
id username password salt status
1 test qepoihadfnkdsgbkajb1358139jbdf 35asf24s 1
下面是我想要执行的sql查询。
$sql = "SELECT * FROM user WHERE username = :username AND password = 'SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(':password')))))' AND status = :status";
下面是我检索用户记录的代码片段。
$this->_user = User::findBySql($sql, [
':username' => $this->username,
':password' => $this->password,
':status' => 1,
])->one();
上面的代码返回null。它似乎无法加密输入的密码以与密码哈希进行比较。因此,我尝试了以下代码。
$this->_user = User::find()->where("username = :username AND (password = 'SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(':password')))))' OR password = '" . md5(":password") . "') AND status = :status")
->addParams([
':username' => $this->username,
':password' => $this->password,
':status' => 1,
])->one();
这也将返回null作为结果。如何使用自定义salt加密输入的密码以与密码哈希进行比较并返回记录?即使我正在使用Yii 2,但由于一些技术要求,我不想使用Yii方式登录用户。
如果没有特定原因,请不要使用findBySql
。你们松散的抽象。
'" . md5(":password") . "'
也是错误的:您散列的不是sql请求,而是字符串:password
。
看这个代码:
$query = User::find()->where('password_hash = SHA1(:password)', [
':password' => 'password'
]);
$sql = $query->createCommand()->getRawSql();
$user = $query->one();
使用getRawSql
调试您的请求。您总是可以看到发送到sql server的内容。
这是检查密码的错误方法。不可能在SQL语句中验证密码,因为希望应用salt。此外,使用SHA-1存储密码是不安全的,因为这种算法速度太快,很容易被暴力强制。
相反,您可以只使用用户名进行查询。如果可以找到一行,您可以读取并验证密码哈希:
$sql = "SELECT * FROM user WHERE username = :username AND status = :status";
Yii框架提供了生成和验证密码散列的辅助函数。此文档可能会让您开始使用。另一种选择是直接调用PHP函数password_hash()和password_verify()。