Sécurité PHP: où et comment stocker les mots de passe. 2e partie

Bonjour à tous! La semaine dernière, nous avons publié la première partie de cet article, qui a provoqué un holivar grave.

L'une des principales plaintes était l'absence de mention de password_hash dans l'article, comme nous l'avions promis, la deuxième partie de ce document commencera de la même manière avec le hachage de mot de passe en utilisant password_hash . Nous vous rappelons également que la rédaction de cet article a été inspirée par le lancement d'un nouveau groupe sur le cours «Backend PHP Developer» , mais ce matériel n'a rien à voir avec le programme de formation.


Vous pouvez en apprendre davantage sur le programme de formation lors de la journée portes ouvertes , et avec l'exemple d'un webinaire gratuit sur le thème «ServerLess PHP» , vous pouvez évaluer le format des conférences.

Peut-être allons-nous conclure cette préface déjà longue et passer directement à l'article.

Hachage de mot de passe avec password_hash


Cette fonction crée un hachage de mot de passe conformément aux paramètres que nous lui avons définis. Il utilise un algorithme à sens unique.

Nous pouvons choisir le type d'algorithme à utiliser en définissant l'une des constantes de notre choix:

  • PASSWORD_DEFAULT de PHP 5.5 utilise Bcrypt comme algorithme par défaut. Cependant, au fil du temps, cela change à mesure que de nouveaux algorithmes plus sécurisés ou d'autres facteurs sont découverts.
  • PASSWORD_BCRYPT crée un hachage crypt() . Habituellement il contient 60 caractères, il peut être identifié par son identifiant au format "$ 2y $" .
  • PASSWORD-ARGON2I Argon2 est actuellement l'un des algorithmes de hachage les plus sécurisés. Il n'est disponible que si PHP a été compilé avec Argon2.
  • PASSWORD_ARGON2ID Cet algorithme de hachage appartient également à la famille Argon2 et utilise la version d'Argon2ID, pas moi. Pour que cela fonctionne, il est également nécessaire que PHP soit compilé à l'aide d'Argon2.

Cette fonction possède également un paramètre facultatif, qui consiste en un tableau associatif qui accepte plusieurs clés conformément à l'algorithme sélectionné.
Si vous préférez utiliser Bcrypt, la clé de cette séquence sera la valeur du coût.

Si vous sélectionnez un algorithme qui utilise Argon2, les clés du tableau associatif sont: memory_cost (un entier indiquant la quantité maximale de mémoire nécessaire pour calculer le hachage), time_cost (un entier indiquant le temps maximum nécessaire pour calculer le hachage) et thread (un autre entier un nombre indiquant le nombre de threads utilisés pour calculer le hachage).

Ne spécifiez pas le paramètre salt en PHP 7.0, sinon vous recevrez un avertissement concernant l'approche obsolète.

Nous savons maintenant quels éléments sont nécessaires pour utiliser la fonction password_hash() . Voyons comment le prescrire.

 echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0 

Dans un premier temps, il est recommandé de tester cette fonction sur vos serveurs et de configurer le paramètre de coût pour que l'exécution de la fonction prenne moins de 100 millisecondes sur les systèmes interactifs.

Le script de l'exemple ci-dessus vous aidera à définir la valeur de coût optimale pour votre matériel.

Vérification du mot de passe utilisateur


Vous avez donné aux utilisateurs la possibilité de s'inscrire dans votre nouvelle application, ils peuvent y entrer leur mot de passe et vous savez très bien comment gérer ce mot de passe.

En hachant les données conformément aux dernières tendances en matière de sécurité, vous ne stockez rien sous forme cryptée et votre serveur est caché dans un sous-sol de 10 mètres de profondeur.

Et maintenant

Vous devez maintenant autoriser les utilisateurs à se connecter à l'application. Pour ce faire, PHP a une fonction intégrée qui vérifie le mot de passe correspondant à la séquence hachée. Cette fonction est appelée password_verify() . Cela fonctionne comme ceci:

 $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo '  !'; } 

Elle a deux paramètres et les deux doivent avoir un format de séquence. Le premier paramètre est le mot de passe que l'utilisateur a entré dans le formulaire de connexion au compte. Le deuxième paramètre est les données directement hachées que nous consulterons.

Par conséquent, nous obtenons une valeur logique, prête à être utilisée dans les opérations conditionnelles. Ainsi, nous pouvons soit laisser l'utilisateur dans l'application ou l'informer que quelque chose s'est mal passé.

Cette fonction fonctionne car à l'étape précédente (lorsque nous avons eu le hachage du mot de passe), la valeur renvoyée par password_hash incluait l'algorithme que nous avons utilisé, cost et salt .

Ainsi, toutes les informations nécessaires à password_verify() sont à notre disposition.

L'algorithme du système d'enregistrement des utilisateurs sur PHP


J'espère que vous comprenez maintenant les mesures de sécurité que les développeurs PHP prennent lors de la manipulation des mots de passe.

Vous devez d'abord vérifier une post-demande, puis sélectionner et calculer le nombre d'utilisateurs dont les données correspondent aux données saisies.

Si tout s'est bien passé, nous vérifions le mot de passe et envoyons l'utilisateur à la page d'accueil. Sinon, par exemple, sur Javascript, nous affichons une fenêtre d'avertissement avec une notification d'erreur.

Conclusion


Vous savez maintenant comment garantir la sécurité de votre application et comment gérer correctement les mots de passe. Suivre des recommandations utiles n'est pas seulement une norme que vous devez suivre, mais un chemin de développement qui devrait être agréable à suivre.
Apprenez de nouvelles techniques similaires à la façon dont vous venez d'apprendre. Ajoutez des fonctionnalités supplémentaires et expérimentez avec le code jusqu'à ce que vous obteniez d'excellentes compétences en développement Web - que ce soit PHP ou tout autre langage qui ouvre pas moins de possibilités!

Lire la première partie

Source: https://habr.com/ru/post/fr475874/


All Articles