Как проверить хэш пароля с помощью пользовательского шифрования sh1 и соли в 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();

Приведенный выше код возвращает ноль. Кажется, что он не может зашифровать введенный пароль для сравнения с хэшем пароля. Таким образом, я попробовал следующий код.

 $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();

Это также возвращает ноль в качестве результата. Как я могу зашифровать введенный пароль, используя специальную соль, чтобы сравнить с хэшем пароля и вернуть запись? Даже я работаю с Yii 2, но я не хочу использовать Yii для входа в систему из-за некоторых технических требований.

1

Решение

Не использовать findBySql если у вас нет конкретной причины. Вы теряете абстракции.

'" . md5(":password") . "' тоже плохо и неправильно: вы хэшировали не sql запрос, а строку :password,

Посмотрите этот код:

$query = User::find()->where('password_hash = SHA1(:password)', [
':password' => 'password'
]);

$sql = $query->createCommand()->getRawSql();
$user = $query->one();

использование getRawSql для отладки вашего запроса. Вы всегда можете увидеть, что отправлено на сервер SQL.

0

Другие решения

Это неправильный способ проверить пароль. Невозможно проверить пароль внутри оператора SQL из-за соли, которую мы надеемся применить. Также небезопасно использовать SHA-1 для хранения паролей, потому что этот алгоритм слишком быстр и может быть легко взломан.

Вместо этого вы можете сделать запрос только с именем пользователя. Если строка может быть найдена, вы можете прочитать и проверить хэш пароля:

$sql = "SELECT * FROM user WHERE username = :username AND status = :status";

Инфраструктура Yii предлагает вспомогательные функции для генерации и проверки хэшей паролей. это документация может начать вас Альтернативой является вызов функций PHP password_hash () а также password_verify () непосредственно.

0

По вопросам рекламы [email protected]