如何在Yii2.0中使用自定义sh1加密和自定义salt验证密码哈希


How to validate password hash using a custom sh1 encryption and a custom salt in Yii 2.0?

下面是我的帐户凭据。

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()。