Sécurisez vos mots de passe en PHP

Snake's

Administrateur
Ancien staff
Inscription
5 Juin 2012
Messages
8 792
Réactions
6 913
Points
25 465

SÉCURISEZ VOS MOTS DE PASSE EN PHP



separateur.png


Salut à tous, :membre:

Aujourd'hui nous allons voir comment sécuriser vos mots de passe en PHP.


separateur.png




INTRODUCTION


Il est évident que vous n'allez pas stocker les mots de passe de vos utilisateurs tels quels, il faut les crypter, ou bien les hasher.

Note : Veuillez à ne pas confondre cryptage et hashage. Le cryptage est réversible, le hashage ne l'est pas.


separateur.png






HASHER UN MOT DE PASSE



Pour hasher un mot de passe, c'est très simple.
PHP propose une fonction nommée password_hash pour hasher des chaînes de caractères.

Exemple :

PHP:
$pass = 'RealityGaming' ;
$hash = password_hash($pass,PASSWORD_BCRYPT);

Le résultat de ma variable $hash ne sera jamais le même résultat.

PASSWORD_BCRYPT est une constante, il y a une autre constante qui est : PASSWORD_DEFAULT, mais celle-ci n'est pas recommandée (elle fait référence à l'algorithme par défaut de PHP).
Une liste des constantes disponibles se trouve .

La fonction password_hash possède un troisième argument, celui de spécifier des options pour l'algorithme.

Nous l'exprimerons comme ceci :

PHP:
$pass = 'RealityGaming' ;
$hash = password_hash($pass,PASSWORD_BCRYPT,['cost' => 10]);

Dans cet exemple on augmente le coût (cost) de l'algorithme le rendant par la même occasion plus lente et donc plus dure à « brute-forcer ».

Vous pouvez déterminer le « coût idéal » grâce à une fonction trouvée sur le net.
PHP:
function getOptimalCost($timeTarget)
{
    $cost = 9;
    do {
        $cost++;
        $start = microtime(true);
        password_hash("RealityGaming", PASSWORD_BCRYPT, ["cost" => $cost]);
        $end = microtime(true);
    } while (($end - $start) < $timeTarget);

    return $cost;
}

echo getOptimalCost(0.3);
Personnellement j'obtiens un résultat de 11.

Il existe également l'option « sel » (salt), qui permet de générer ses propres grains de sel.
Je ne conseille pas d'utiliser cette fonction, car mal utilisée elle pourrait réduire la sécurité du hash.

Voici un schéma expliquant ce que je viens de dire. :nerd:

2a34c7f2e658f6ae74f3869f2aa5886f-crypt-text-render.png



separateur.png






COMPARER UN MOT DE PASSE ET UN HASH



Comme dit plus haut, le résultat d'un hash n'est jamais le même, alors comment comparer ce résultat avec le mot de passe initial saisit par l'utilisateur ? :shock:

Heureusement pour nous, PHP possède une fonction nommée
password_verify.

Nous l'utiliserons comme ceci :
PHP:
if(password_verify('RealityGaming', '$2y$10$nQWnPp/DAAz0Z41/zydo1.9pIKqQMmvGXj9XagxA0lIngdZ29eauW')) echo 'OK';
else echo 'ERREUR';

Le résultat est OK, car le hash que j'ai fourni est le résultat de :
PHP:
echo $hash;


separateur.png





VÉRIFIER UN HASH



Avec le temps, il se peut qu'un hash ne fonctionne plus, car vous avez augmenté le coût par exemple.
Avec une fonction PHP, vous pouvez avoir toutes les informations sur un hash. Cette fonction se nomme password_get_info.

Nous l'utilisons comme ceci :
PHP:
print_r(password_get_info($hash));

Cela affichera le type d'algorithme ainsi que les options que vous avez utilisées :
PHP:
 Array
(
     [algo] => 1
     [algoName] => bcrypt
     [options] => Array
     (
          [cost] => 11
     )
)

C'est pratique d'avoir ces valeurs, mais PHP dispose d'une fonction qui vérifie la validité d'un hash en fonction des options que vous voulez !
Cette fonction se nomme : password_needs_rehash.

Voici un exemple d'utilisation :
PHP:
        $pass = 'RealityGaming' ;
        $hash = password_hash($pass,PASSWORD_BCRYPT,['cost' => 11]);
        $options = array('cost' => 11);
        if (password_verify($pass, $hash))
        {
            if (password_needs_rehash($hash, PASSWORD_BCRYPT, $options))
            {
                $hash = password_hash($pass, PASSWORD_BCRYPT, $options);
            }
        }



separateur.png




FIN DU TUTORIEL



J'espère que ce tutoriel vous aura plu.
Vous n'avez plus d'excuses pour stocker vos mots de passes tels quels maintenant, faites attention aux données sensibles de vos utilisateurs. ;)

PS : Je vous ai présenté uniquement les méthodes basiques, il y a beaucoup d'autres méthodes, comme le sha256, sha1, md5 .. :p

RealityGaming Tech
 

Orgs64

Un ancien
Premium
Inscription
5 Août 2013
Messages
2 382
Réactions
1 142
Points
19 126

SÉCURISEZ VOS MOTS DE PASSE EN PHP



Voir la pièce jointe 74543

Salut à tous, :membre:

Aujourd'hui nous allons voir comment sécuriser vos mots de passe en PHP.


Voir la pièce jointe 74543



INTRODUCTION


Il est évident que vous n'allez pas stocker les mots de passe de vos utilisateurs tels quels, il faut les crypter, ou bien les hasher.

Note : Veuillez à ne pas confondre cryptage et hashage. Le cryptage est réversible, le hashage ne l'est pas.


Voir la pièce jointe 74543





HASHER UN MOT DE PASSE



Pour hasher un mot de passe, c'est très simple.
PHP propose une fonction nommée password_hash pour hasher des chaînes de caractères.

Exemple :

PHP:
$pass = 'RealityGaming' ;
$hash = password_hash($pass,PASSWORD_BCRYPT);

Le résultat de ma variable $hash ne sera jamais le même résultat.

PASSWORD_BCRYPT est une constante, il y a une autre constante qui est : PASSWORD_DEFAULT, mais celle-ci n'est pas recommandée (elle fait référence à l'algorithme par défaut de PHP).
Une liste des constantes disponibles se trouve .

La fonction password_hash possède un troisième argument, celui de spécifier des options pour l'algorithme.

Nous l'exprimerons comme ceci :

PHP:
$pass = 'RealityGaming' ;
$hash = password_hash($pass,PASSWORD_BCRYPT,['cost' => 10]);

Dans cet exemple on augmente le coût (cost) de l'algorithme le rendant par la même occasion plus lente et donc plus dure à « brute-forcer ».

Vous pouvez déterminer le « coût idéal » grâce à une fonction trouvée sur le net.
PHP:
function getOptimalCost($timeTarget)
{
    $cost = 9;
    do {
        $cost++;
        $start = microtime(true);
        password_hash("RealityGaming", PASSWORD_BCRYPT, ["cost" => $cost]);
        $end = microtime(true);
    } while (($end - $start) < $timeTarget);

    return $cost;
}

echo getOptimalCost(0.3);
Personnellement j'obtiens un résultat de 11.

Il existe également l'option « sel » (salt), qui permet de générer ses propres grains de sel.
Je ne conseille pas d'utiliser cette fonction, car mal utilisée elle pourrait réduire la sécurité du hash.

Voici un schéma expliquant ce que je viens de dire. :nerd:

Voir la pièce jointe 74544


Voir la pièce jointe 74543





COMPARER UN MOT DE PASSE ET UN HASH



Comme dit plus haut, le résultat d'un hash n'est jamais le même, alors comment comparer ce résultat avec le mot de passe initial saisit par l'utilisateur ? :shock:

Heureusement pour nous, PHP possède une fonction nommée
password_verify.

Nous l'utiliserons comme ceci :
PHP:
if(password_verify('RealityGaming', '$2y$10$nQWnPp/DAAz0Z41/zydo1.9pIKqQMmvGXj9XagxA0lIngdZ29eauW')) echo 'OK';
else echo 'ERREUR';

Le résultat est OK, car le hash que j'ai fourni est le résultat de :
PHP:
echo $hash;


Voir la pièce jointe 74543




VÉRIFIER UN HASH



Avec le temps, il se peut qu'un hash ne fonctionne plus, car vous avez augmenté le coût par exemple.
Avec une fonction PHP, vous pouvez avoir toutes les informations sur un hash. Cette fonction se nomme password_get_info.

Nous l'utilisons comme ceci :
PHP:
print_r(password_get_info($hash));

Cela affichera le type d'algorithme ainsi que les options que vous avez utilisées :
PHP:
 Array
(
     [algo] => 1
     [algoName] => bcrypt
     [options] => Array
     (
          [cost] => 11
     )
)

C'est pratique d'avoir ces valeurs, mais PHP dispose d'une fonction qui vérifie la validité d'un hash en fonction des options que vous voulez !
Cette fonction se nomme : password_needs_rehash.

Voici un exemple d'utilisation :
PHP:
        $pass = 'RealityGaming' ;
        $hash = password_hash($pass,PASSWORD_BCRYPT,['cost' => 11]);
        $options = array('cost' => 11);
        if (password_verify($pass, $hash))
        {
            if (password_needs_rehash($hash, PASSWORD_BCRYPT, $options))
            {
                $hash = password_hash($pass, PASSWORD_BCRYPT, $options);
            }
        }



Voir la pièce jointe 74543



FIN DU TUTORIEL



J'espère que ce tutoriel vous aura plu.
Vous n'avez plus d'excuses pour stocker vos mots de passes tels quels maintenant, faites attention aux données sensibles de vos utilisateurs. ;)

PS : Je vous ai présenté uniquement les méthodes basiques, il y a beaucoup d'autres méthodes, comme le sha256, sha1, md5 .. :p

RealityGaming Tech
Bon tuto :)
Merci @Snake's :love:
 

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
Whouah super topic *_*

Perso je met sha1(md5()); ^^
 
Inscription
6 Mai 2015
Messages
282
Réactions
77
Points
9 006
Excellent mais j'ai une question : Maintenant, comment une fois que le mot de passe hashé à été mis dans la base de données, le vérifier avec password_verify() ? Je n'ai toujours pas eu de réponses clair aux gens à qui j'ai pu demandé, donc ce que je fais : je met le mot de passe hashé dans la base de données, je hash le mot de passe reçu via le formulaire de connexion et je fais la vérification avec une recherche prepare dans la base de données.
 

Rivals

Ancien staff
Inscription
27 Août 2016
Messages
1 705
Réactions
895
Points
13 104
Ne comptez plus sur du MD5 en 2015.

Très bon tutoriel Snake's, à savoir que vis à vis de la loi il est obligatoire de crypter ou hasher les mots de passe utilisateurs.
 
Haut