2011-08-17 3 views
0

Je crée une page de connexion et j'ai besoin d'aide pour accéder au hashpassword dans ma base de données en utilisant CodeIgniter.Codeigniter et mot de passe de hachage pour la connexion?

Ma fonction hashPassword est:

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

Je dois faire ce qui suit:

  1. extrait id de l'utilisateur de la table my_aspnet_Users utilisant leur username
  2. extrait password et passwordKey de my_aspnet_Membership en utilisant leur id
  3. vérifier si password est égal à hashPassword(<password entered by user>, passwordKey) pour savoir si le mot de passe entré est valide.

J'ai donc deux modèles:

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; 
     } 
    } 
} 

et ..

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; 
     } 
    } 
} 

Je n'ai aucune idée comment les faire travailler ensemble pour perfrom vérification de mot de passe.

Répondre

0

Réutilisez simplement la même fonction (ce qui est ridiculement trop compliqué). Donc, si lorsque je crée un compte, vous exécutez functionX() sur mon mot de passe avant de le stocker, exécutez simplement functionX() sur le mot de passe que quelqu'un saisit lors de la connexion et voyez s'il existe dans la base de données.

Editer: Je pense principalement que votre problème ici est que vous avez besoin d'un champ nom d'utilisateur/email pour confirmer que l'utilisateur est le même que le mot de passe entré. Ce qui précède s'applique encore

3

Tout d'abord, quelques commentaires sur votre conception.

  • Vous n'avez pas besoin de deux tables - une pour les utilisateurs et une pour l'adhésion. Vous avez juste besoin d'une table d'utilisateur avec une colonne pour stocker le hachage de mot de passe.
  • SHA256 est une fonction de hachage à usage général. Utilisez bcrypt à la place.

Ainsi, le pseudo-code sera lu quelque chose comme

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 
    } 
} 

Si vous n'avez pas la possibilité d'avoir le nom d'utilisateur, utilisez l'ID utilisateur/email de l'utilisateur (tout ce qui identifie de manière unique l'utilisateur) dans la requête au lieu.

Espérons que cela vous le clarifie.

0

CodeIgniter utilise une bibliothèque appelée "Tank Auth": http://konyukhov.com/soft/tank_auth/

Il inclut la classe "PasswordHash.php": http://bit.ly/1gahwtT

Exemple Code:

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"; 
} 
Questions connexes