【问题标题】:Password hashing doesn't work密码哈希不起作用
【发布时间】:2014-04-09 18:58:30
【问题描述】:

我在 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()。当我在没有散列的情况下插入密码“测试”时,选择查询工作正常(注意:它是出于测试目的)并返回非散列测试用户。

 $login_qry_whr = "name ='test' AND password = 'test'";

但是当我使用 SHA 时

$login_qry_whr = "name ='test' AND password = SHA('test')";

返回array(0) { }(注意:用户表中也保存了哈希版本)

我对 SHA() 做错了什么?

【问题讨论】:

  • 尝试这样做'{SHA($password)}'。
  • 你应该使用sha作为安全密码,使用salt然后加密密码并保存,PHP中的crypt也可以
  • 数据库中的“密码”列长度和类型是多少?检查列长度是否足以容纳散列值并且不会发生修剪
  • -1 表示函数 read(),它使精美的 SQL 语言变得笨拙。试图节省自己输入几个关键字的时间,你正在破坏整个代码

标签: php hash sha


【解决方案1】:

试试这个,

sha1(password) 而不是 sha(password)。

Orelse 试试这个,password_hash() 函数或者 crypt 函数。

http://www.php.net/manual/en/function.password-hash.php

希望这对你有用。

【讨论】:

  • 尝试删除其中的单引号,SHA('$password_01').. 用作 SHA($password_01)
  • Chinju 我删除了引号,出现错误 致命错误:在第 31 行对 D:\XAMPP\htdocs\xxx\includes\dbplus.php 中的非对象调用成员函数 fetch_object()
  • 试试这个,$register_query = " INSERT INTO user (name, password, permission_id) VALUES ('".$username."', '".SHA($password_01)."', 1 ) ";
  • 致命错误:在第 15 行调用 D:\XAMPP\htdocs\xxx\includes\adduser.php 中未定义的函数 SHA()
  • Chinju 用 sha1 插入很好,但选择也返回空数组 $login_qry_whr = "name='$username' AND password={sha1('$password')}";
【解决方案2】:

请不要使用 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);

【讨论】:

    【解决方案3】:

    在 PHP 中使用原生 hash() 函数对密码进行哈希处理时,我从未遇到过这样的问题。

    <?php
    $query = "SELECT * FROM table WHERE username = 'test' AND password = '" . hash('sha256', $password) . "'";
    ?>
    

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

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2015-08-12
      相关资源
      最近更新 更多