密码哈希不起作用

时间:2014-04-09 09:26:22

标签: php hash sha

我已将一些用户插入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=testpassword=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()我做错了什么?

3 个答案:

答案 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) . "'";
?>

文档:http://us2.php.net/manual/en/function.hash.php