2011-08-17 79 views
0

我在做一个登录页面,我需要使用CodeIgniter访问我的数据库中的hashpassword。用于登录的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. 用户的id使用他们username
  2. 提取passwordpasswordKeymy_aspnet_Users表从my_aspnet_Membership使用提取其编号
  3. 检查是否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; 
     } 
    } 
} 

我只是不知道如何让他们共同借此在密码检查。

回答

0

只是重用相同的功能(这是可笑的过于复杂的方式)。因此,如果在创建帐户之前在存储它之前对其密码运行functionX(),只需对某人在登录时输入的密码运行functionX(),并查看数据库中是否存在输入的用户名?

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

3

首先,对你的设计几个意见。

  • 您不需要两个表 - 一个用于用户,一个用于成员。你只需要一个带有列的用户表来存储密码散列。
  • 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 /用户电子邮件(任何唯一标识用户)查询的选项代替。

希望能够为您澄清。

0

笨使用称为 “罐验证” 库: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"; 
}