我已将一些用户插入MySQL数据库
$register_query = " INSERT INTO user ( name, password, permission_id)
VALUES ( '$username', SHA('$password_01'), '1' ) ";
我想阅读用户表以登录
require_once('initializing.php');
class DbPlus extends MySQLDatabaseConnection{
public $database;
function __construct()
{
$this->database = parent::connection();
}
public function reading_table($table, $query, $where = null, $limit = null, $order = null){
$query = "SELECT {$query} FROM {$table}";
if ( isset($where) ) {
$query .= " WHERE {$where}";
}
if ( isset($order) ){
$query .= " ORDER BY {$order}";
}
if ( isset($limit) ) {
$query .= " LIMIT {$limit}";
}
// $data = $this->database->query($query);
$data = $this->database->query($query);
$rows = array();
while ( $row = $data->fetch_object() ) {
$rows[] = $row;
}
return $rows;
}
}
$dbplus = new DbPlus;
$login_qry_slct = "id,name,password,permission_id";
$login_qry_whr = "name ='test' AND password = SHA('test')";
$result = $dbplus->reading_table('user', $login_qry_slct, $login_qry_whr );
var_dump($result);
出于测试目的,我插入了name=test
和password=test
。我用两种方式做到了,有和没有SHA()。当我输入密码' test'没有散列,select查询工作正常(注意:它是出于测试目的)并返回非散列测试用户。
$login_qry_whr = "name ='test' AND password = 'test'";
但是当我使用SHA
时$login_qry_whr = "name ='test' AND password = SHA('test')";
返回array(0) { }
(注意:用户表中也保存了散列版本)
SHA()我做错了什么?
答案 0 :(得分:0)
试试这个,
sha1(密码)而不是sha(密码)。
Orelse尝试这个,password_hash()函数或crypt函数。
http://www.php.net/manual/en/function.password-hash.php
希望这适合你。
答案 1 :(得分:0)
请不要将SHA *用于散列密码,而应使用像BCrypt或PBKDF2这样的慢速密钥派生函数和成本因子。验证不能直接在SQL语句中完成(因为盐),所以你必须在PHP代码中完成:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
答案 2 :(得分:-1)
我从未通过使用本机hash()函数在PHP中散列密码来解决这类问题。
<?php
$query = "SELECT * FROM table WHERE username = 'test' AND password = '" . hash('sha256', $password) . "'";
?>