Sécurisez vos mots de passe en PHP

Snake's

Administrateur
Ancien staff
Inscription
5 Juin 2012
Messages
8 792
Réactions
6 916
Points
29 965
RGCoins
0

SÉCURISEZ VOS MOTS DE PASSE EN PHP



You must be registered for see images attach


Salut à tous, :membre:

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


You must be registered for see images attach




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.


You must be registered for see images attach






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:

You must be registered for see images attach



You must be registered for see images attach






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;


You must be registered for see images attach





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



You must be registered for see images attach




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
 

SamirMG

Développeur sous android , ios et web
Premium
Inscription
20 Novembre 2012
Messages
5 304
Réactions
1 033
Points
14 029
RGCoins
0
Bien fait mais centre le texte :D
 

Orgs64

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

SÉCURISEZ VOS MOTS DE PASSE EN PHP



You must be registered for see images attach


Salut à tous, :membre:

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


You must be registered for see images attach




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.


You must be registered for see images attach






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:

You must be registered for see images attach



You must be registered for see images attach






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;


You must be registered for see images attach





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



You must be registered for see images attach




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:
 

Kilian'

Développeur HTML5/CSS3 - PHP
Premium
Inscription
16 Août 2012
Messages
3 503
Réactions
990
Points
17 711
RGCoins
0
Pas mal le tutoriel :D
 

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 712
Réactions
8 501
Points
32 425
RGCoins
0
Whouah super topic *_*

Perso je met sha1(md5()); ^^
 
Inscription
6 Mai 2015
Messages
282
Réactions
77
Points
9 006
RGCoins
0
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 706
Réactions
897
Points
13 104
RGCoins
0
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.
 
Inscription
6 Mai 2015
Messages
282
Réactions
77
Points
9 006
RGCoins
0
Rivals, aurait tu un avis sur la question que j'ai posé s'il te plaît ?
 
Haut