用于登录的编码器和散列密码


Codeigniter and hash password for login?

我正在制作一个登录页面,我需要使用CodeIgniter帮助访问数据库中的哈希密码。

我的hashPassword函数是

function hashPassword($pass, $passKey){
    $key = base64_decode($passwordKey);
    return base64_encode(hash_hmac(
        'sha256', 
        $key . mb_convert_encoding($password, 'UTF-16LE', 'ASCII'),
        $key, true));
}   

我必须做以下事情:

  1. 使用usernamemy_aspnet_Users表中提取用户的id
  2. 使用id
  3. my_aspnet_Membership中提取passwordpasswordKey
  4. 检查password是否等于hashPassword(<password entered by user>, passwordKey),以确定输入的密码是否有效。

所以我有两个模型:

Class Password extends CI_Model{
    function getPassword($password, $passwordKey){
    $this -> db -> select ('userId, Password, PasswordKey');
    $this -> db -> from ('my_aspnet_Membership'); 
    $this -> db -> where ('Password = '. "'" . $password . "'");
    $this -> db -> where ('PasswordKey = '. "'" . $passwordKey . "'");
    $q = $this -> db -> get(); 
    if ($q -> num_rows() == 1){
        return $q ->result();}else{
            return false;
        } 
    }  
}

和. .

Class User extends CI_Model{
    function getUser($id){
        $this -> db -> select('id, name ');
        $this -> db -> from('my_aspnet_Users');
        $this -> db -> where('id = '. "'". $id . "'");
        $this -> db -> limit(1);
        $query = $this -> db -> get();
        if($query -> num_rows() == 1){
            return $query->result();
        }
        else{
            return false;
        }
    }
}

我只是不知道如何使它们一起工作来执行密码检查

首先,对您的设计提出几点意见。

  • 您不需要两个表——一个用于用户,一个用于成员。您只需要一个用户表,其中包含一列来存储密码哈希值。
  • SHA256是一个通用哈希函数。使用bcrypt代替。
所以伪代码会读成类似于
class User extends CI_Model
    function getHash($password) {
        /* Code to get hash */
        return $passwordHash;
    }
    function validateUser($username, $password) {
        $passwordHash = $this->getHash($password);
        /* Query MySQL 
           select * from user 
           where 
           username = $username and
           password_hash = $passwordHash 
        */
        if num_rows > 1
            return true
        else
            return false
    }
} 

如果没有用户名选项,则在查询中使用用户id/用户电子邮件(任何唯一标识用户的内容)。

只需重用相同的函数(顺便说一下,这非常复杂)。如果我创建一个账户你在存储之前对我的密码运行functionX()只需对登录时输入的密码运行functionX()看看数据库中是否存在输入的用户名?

编辑:我认为你这里的主要问题是你需要一个用户名/电子邮件字段来确认用户与输入的密码相同。尽管

CodeIgniter使用一个名为"Tank Auth"的库:http://konyukhov.com/soft/tank_auth/

它包括类"PasswordHash.php": http://bit.ly/1gahwtT

示例代码:

require "PasswordHash.php";
define("phpass_hash_portable",TRUE);
define("phpass_hash_strength",8);
$hasher = new PasswordHash(phpass_hash_strength,phpass_hash_portable);
if ($hasher->CheckPassword($password_to_check, $original_encoded_password)) {
    echo "password correct";
} else {
    echo "password incorrect";
}