Bonjour,

J'éspere que mes deux questions sur la même journé ne sont pas considéré comme du flood.

Voici mon problem:

Je constate que lorsque je crée un nouvelle utilisateur, le chiffrement du mot de pass est différent que lorsque je me connecte, ce qui fait que je ne sais pas me connecter tout simplement.

Voici les codes sources:

AppController:

<?php
class AppController extends Controller {
    var $components = array('Auth', 'Session');
    function beforeFilter() {
        if(isset($this->Auth)) {
            $this->Auth->userModel = 'User';
            $this->Auth->fields = array ('username' => 'email', 'password' => 'password');      
        }
    }
}
?>

UserController:

<?php
class UsersController extends AppController {
    var $name = 'Users';
    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
    }

    function login() {}
    function logout() {$this->redirect($this->Auth->logout());}
    function register() {
        if($this->Auth->User('id')){$this->logout();}
        if(!empty($this->data)) {
            $this->Session->setFlash('Your account has been created, check your mail to activate it');
            $this->User->save($this->data); 
        }
    }
}
?>

User (model)

<?php
class User extends AppModel {
    var $name = 'User';
    var $hasMany = array('Thing');
    function beforeSave() {
        $this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], 'sha1', true);
        return true;
    }
}
?>

Login (view):

<?php
echo $form->create('User', array('url' => array('action' => 'login')));
echo $form->input('email');
echo $form->input('password');
echo $form->end('Login');
?>

Register (view):

<?php
echo $form->create('User', array('url' => array('action' => 'register')));
echo $form->input('User.email');
echo $form->input('User.nickname');
echo $form->input('User.password');
echo $form->end('Register');
?>

Je pense que c'est du a cette ligne dans le model User:

$this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], 'sha1', true);

Mais pas sûre

D'avance merci,
Tosch

12 réponses


Hardware
Réponse acceptée

Donc essaye la méthode hashPasswords du composant Auth :

$data'User']'username'] = 'moi@moi.com';
$data'User']'password'] = 'motdepasse';
$hash = $this->Auth->hashPasswords($data);
print_r($hash);
/* retourne :
Array
(
    [User] => Array
    (
        [username] => moi@moi.com
        [password] => 967520ae23e8ee14888bae72809031b98398ae4a636773e18fff917d77679334
    )
)
*/

Tu peux changer le type hashage avec la méthode setHash de la classe Security :

Security::setHash('sha256');

Là les maitres du hacking ne pourront rien faire contre ce type de hash xD, sinon pour les paranos il existe l'algorithme " Whirlpool" mais bon attention au temps d'exécution, il sera forcément plus long...

tottosche
Auteur
Réponse acceptée

Merci pour ton conseil.

Recapitulatif:
cakePHP v1.3. chiffre par defaut les champs password en SHA1
pour une chiffrement plus complexe, j'ai décidé d'utiliser SHA256
Pas besoin donc de (re)chiffrer le mot de passe avant enregistrement dans la bdd

Solution:

AppController

function beforeFilter() {
    var $components = array('Auth');
    if(isset($this->Auth)) {        
        Security::setHash('md5');
    }
}

modele User:

function beforeSave() {
    //$this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], 'sha1', true);
    return true;
}

Dans ce cas, on peut tout simplement supprimé la fonction beforeSave().

Tout grand merci a toi hardware pour ton aide.

Ton problème vient peut-être d'une mauvaise association quand tu configures le composant Auth :

$this->Auth->fields = array ('username' => 'email', 'password' => 'password');

Essayes avec les valeurs par défaut (username, password), regarde aussi au niveau de la bdd pour voir si le hash à la bonne valeur.

Mais en tout cas la ligne contenue dans la fonction beforeSave est correcte :

$this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], 'sha1', true);

Ton mot de pase est bien hashé en sha1 avec le "Security.salt" qui est défini dans core.php

Bonjour,

Je viens d'essayer ta solution mais ce n'est pas due a mon association (et je la voulait car je trouve qu'une authentification par email est plus adéquate pour mon site)

Je viens de comprendre ou se situait le probleme:

Effectivement mon mot de passe etait bien hashé salt + sha1 mais lorsque je demandais le login, non.

Avant:

Requete SQL pour register:

INSERT INTO `users` (`email`, `nickname`, `password`) VALUES ('a@a.com', 'azerty', '4486a48634b7d7313004df985642b9882fe7ea7b')

Requete de login:

SELECT * FROM `users` AS `User` WHERE `User`.`email` = 'a@a.com' AND `User`.`password` = '16274c4a8005a754cba23bb8d84c13f16a738b6d'

J'ai donc désactiver le hashage en beforeFilter pour tester:

function beforeSave() {
        //$this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], 'sha1', true);
        return true;
    }

Et voici le résultat après :

Requete SQL pour register:

INSERT INTO `users` (`email`, `nickname`, `password`) VALUES ('a@a.com', 'azerty', '16274c4a8005a754cba23bb8d84c13f16a738b6d')

Requete de login:

SELECT * FROM `users` AS `User` WHERE `User`.`email` = 'a@a.com' AND `User`.`password` = '16274c4a8005a754cba23bb8d84c13f16a738b6d'

Le hash est le même dans ce cas.

Voici donc ma question, comment demander lors du login de hasher le mot de passe exactement comme lors du register (salt + sha1 je suppose) pour que la comparaison dans la table soit bonne?

Merci,
Tosch

INSERT INTO users (email, nickname, password) VALUES ('a@a.com', 'azerty', ' 16274c4a8005a754cba23bb8d84c13f16a738b6d')

C'est pas normal que ton mot de passe soit hashé alors que tu as désactivé la fonction de hashage dans beforeSave, il devrait apparaître en clair :|

Sinon essaye d'utiliser la methode " hashPasswords" du composant Auth.

Aaaah donc cakePHP hash automatiquement le password lors de l'action login en fonction de ce qu'il y a dans le beforeSave du model User?!
Pas besoin de la signaler autre pars?
Pourtant son nom indique bien beforeSafe donc c'est avant toute sauvegarde hors le login il compare juste si il existe une entré dans la BDD avec le mm email et mot de passe, donc aucun save.

Peut tu me confirmé?

Possible que ce soit du au faite que j'utilise cakePHP 1.3 ?

Dans la doc j'ai trouvé ceci :

"Pour une sécurité accrue, le composant AuthComponent hashe automatiquement les données soumises de n'importe quel formulaire dont le nom correspond au nom du champ que vous avez rattaché au champ password de AuthComponent."

Donc apparement le mot de passe est hashé automatiquement, regarde ceci ça pourrait t'aider.

Edit : Lors du login, cakephp n'utilise pas la fonction beforeSave, cette dernière est réservée pour être traitée avant une sauvegarde dans la bdd. Je crois que c'est cake qui s'occupe tout seul du traitement de l'authentification de l'utilisateur.

Ok merci pour l'info.

Ce qui me turlupine c'est que quand je fait un debug de la variable $data dans le fonction login de user:

function login() {
    debug($this->data);
}

Il me retourne:

Array
(
    [User] => Array
        (
            [email] => a@a.com
            [password] => 
        )
)

Il vide le champ password... normal?
Je ne peu faire donc aucune action sur lui

Je pensais le faire passer sous une fonction:

function hashPasswords($data) {
        if (isset($data'User']'password'])) {
            $data'User']'password'] = md5($data'User']'password']);
            return $data;
        }
        return $data;
    }

comme décrit sur le lien que tu m'as proposé mais rien n'y fait.
Je vais essayer d'aller chercher un peu plus loin, au pire je n'utiliserai que le hashage de base...

Ce que je comprend pas c'est quand j'utilise le systeme de Grafikart lors du tutoriel a propos de Auth (donc mettre le chiffrement supplémentaire a null), chez moi ça ne fonctionne pas non plus. Même avec chiffrement a null et utilisation de salt a false...
Un explication? :s

Au pire tu te fais toi même ta fonction de hashage :|

Mais j'aimerai bien faire ma fonction de hashash, le problème c'est comme dit plus haut, je n'arrive pas à acceder au contenu de la varialbe $data'User']'password'] vu qu'il est vidé automatiquement pour je n'sais quel raison :s

Je ne pense pas qu'elle soit vidée, elle doit être mal déclarée quelque part, ça doit être pour ça quelle est vide...

Sinon essaye de recommençer la partie login/inscription avec comme base les exemples de la doc ou avec le système de grafikart dans son tuto sur le composant "auth" puis si tout fonctionne tu personnalises le tout en ajoutant par exemple l'inscription par formulaire.

Désoler pour le retard, ça a prit un peut de temps car j'ai eu de problème de server SQL

Donc j'ai recommencé à partir de zéro,
Et la encore une foi, ça ne fonctionne pas.

Lorsque je commente la ligne:

$this->data$this->name]'password'] = Security::hash($this->data$this->name]'password'], null, true);

La valeur chiffré est la même lors de l'enregistrement et le login.

Fait intéressant:

La valeur de password est la même que je mette le chiffrement en sha1 ou null:

$pass1 = Security::hash($this->data$this->name]'password'], null, true);
$pass2 = Security::hash($this->data$this->name]'password'], 'sha1', true);

$pass1 = $pass2

Autre fait intéressant:
Je crée un utilisateur nommé John qui utilise le mot de pass "azerty", la requete:

INSERT INTO `users` (`username`, `password`) VALUES ('John', '16274c4a8005a754cba23bb8d84c13f16a738b6d')

Ensuite je crée un autre utilisateur nommé Fred avec comme mot de pass la valeur d'azerty chiffré précédement (16274c4a8005a754cba23bb8d84c13f16a738b6d), la requête:

INSERT INTO `users` (`username`, `password`) VALUES ('Fred', '4486a48634b7d7313004df985642b9882fe7ea7b')

La valeur de password = la valeur du password chiffrer avec le Security::hash decommenté!

Toujours aucune idée?
J'aimerai vraiment avoir quelque chose de sécurisé, étant etudiant en Ethical Hacking, les utilisateur de ce site seront de personne ayant des connaissances très pointu de la sécurité et ce serai le comble de ne pas avoir un site blindé