Codeigniter и хэш-пароль для входа в систему? - PullRequest
0 голосов
/ 17 августа 2011

Я делаю страницу входа, и мне нужна помощь в получении доступа к хэш-паролю в моей базе данных с помощью 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 пользователя из таблицы my_aspnet_Users, используя его username
  2. извлекают password и passwordKey из 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;
        }
    }
}

Я просто не знаю, как заставить их работать вместе для проверки пароля.

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Во-первых, пара комментариев к вашему дизайну.

  • Вам не нужны две таблицы - одна для пользователей и одна для членства. Вам просто нужна таблица пользователя со столбцом для хранения хэша пароля.
  • 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
    }
} 

Если у вас нет возможности указать имя пользователя, используйте вместо этого идентификатор пользователя / адрес электронной почты пользователя (все, что уникально идентифицирует пользователя).

Надеюсь, это прояснит это для вас.

0 голосов
/ 13 февраля 2014

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";
}
0 голосов
/ 17 августа 2011

Просто повторно используйте ту же функцию (что, кстати, до смешного слишком сложно).Поэтому, если при создании учетной записи вы запускаете functionX () на моем пароле, прежде чем сохранить его, просто запустите functionX () на пароле, который кто-то вводит при входе в систему, и посмотрите, существует ли он с введенным именем пользователя в базе данных?

Редактировать: Я думаю, что в основном ваша проблема здесь в том, что вам нужно поле имени пользователя / электронной почты, чтобы подтвердить, что пользователь совпадает с введенным паролем.Выше все еще применяется, хотя

...