Bonjour. visiteurs jour : 10       Au président     Beauté santé     Infos loisirs     Ensemble      Jean      Informatique     Relativité     Relativity

Les joies de l'informatique et de l'internet !





Coucou et merci


  Accueil - Disques - Excel - Informatique - Infos - Internet - Javascript - logiciels  - Programation - Sites RJ - Vidéo - Plan du site -



   

PHP hashage ou hachage du mots de passe


Le hashage ne fait que protéger les mots de passe dans la base, pas leur éventuelle interception alors qu'ils sont envoyés à l'application par l'utilisateur.


Les algorithmes de hashage comme MD5, SHA1 et SHA256 sont rapides mais faibles. Avec la force brute des nouveaux ordinateurs il est possible d'explorer toutes les combinaisons dans un temps de traitement raisonnable.


Comment hasher les mots de passe


 ? Lorsqu'on hashe des mots de passe, les deux considérations les plus importantes sont le temps de traitement, et le grain de sel. Plus la puissance de traitement requise est élevée, plus il faudra du temps pour casser le mot de passe en analysant sa sortie


PHP 5.5 fournit une API native de hashage de mot de passe qui gère à la fois le hashage et la vérification de mots de passe de manière sécurisée. Il existe aussi une » bibliothèque pure PHP de compatibilité pour PHP 5.3.7 et suivants.


Une autre option est la fonction crypt(), qui supporte différents algorithmes de hashage en PHP 5.3 et suivants.


Un grain de sel, ou "salt", en cryptographie, est appliqué durant le processus de hashage pour éliminer la possibilité d'attaques par dictionnaires (hashages enregistrés dans une grande liste et comparés).

password_hash() crée un salt aléatoire si vous n'en fournissez pas, et c'est généralement la façon la plus sécurisé et la plus simple.


Avec les fonctions password_hash() ou crypt(), la valeur retournée inclue le salt et doit être stockée telle quelle dans votre base de données. Elle est à fournir directement à la fonction password_verify() ou la fonction crypt() lors de la vérification des mots de passe.

source Manuel PHP FAQ




PHP by example en utilisant l'algorithme PASSWORD_BCRYPT  et un côut de 9 pour le choix du grain de sel

$pass = 'Mot de passe' ;


$hash = password_hash($pass,PASSWORD_BCRYPT,['cost' => 9]) ;


On augmente le coût de l'algorithme le rendant par la même occasion plus lent et donc plus dur à « brute-forcer ».

Pour déterminer le coût idéal en fonction du matériel disponible, on peut utiliser ce code :

Déterminer le coût idéal


function getOptimalCost($timeTarget) {

     $cost = 9;

    do { $cost++;

            $start = microtime(true); password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);

           $end   = microtime(true);

     } while (($end - $start) < $timeTarget);

     return $cost;

}

echo getOptimalCost(0.3);


On choisira en général un temps d'exécution entre 0,1 s et 0,5 s ; c'est le bon compromis entre sécurité et attente de l'utilisateur.

Pour un ordi de bureau moyen nous avons troiuve pour 0,1 cost=11 pour 0,2 cost=12 pour 0,3 cost=13 et pour 0.4 cost=13


Le hash d'une même chaîne ne donne jamais le même résultat, dans ce cas comment le comparer ?

PHP met à disposition la fonction password_verify(), pour cela : Comparer hash et mot de passe Sélectionnez


$pass_base='$2a$10$GlvaE1qXuYE6O/ICVtPTeOf3QwE6QNB2quHgqpbK2JKzDYCNnyAL6'

if(password_verify($pass, $pass_base)) {

             echo 'OK';

} else { echo 'ERREUR'; }

Il est possible d'avoir les informations sur un hash via la fonction password_get_info().


print_r(password_get_info($hash));


Cela affichera

Array ( [algo] => 1

             [algoName] => bcrypt

             [options] => Array (

                                          [cost] => 12

                                   )

)


On peut utiliser directement la fonction password_needs_rehash() qui va vérifier la validité d'un hash avec les options fournies :


if (password_verify($pass, $hash)) {

    if (password_needs_rehash($hash, $algorithm, $options)) {

           $hash = password_hash($pass, $algorithm, $options);

    }

}


if(password_verify($pw, $enr['pw_h']))

        $pass1=1;

else $pass1=0;



On peut utiliser ce test après avoir changé le coût de l'algorithme pour permettre aux utilisateurs de réinitialiser leur mot de passe de manière progressive, au fur et à mesure qu'ils accèdent au site.

Source Developpez.com


-
vues  1840     En ligne actuellement :   1   Total des clics  1737487