Sécurité PHP: où et comment stocker les mots de passe. Partie 1

Chaque année, de plus en plus d'attaques de pirates ont lieu dans le monde: des vols de cartes de crédit aux sites de piratage de boutiques en ligne. Êtes-vous sûr que vos scripts sont vraiment protégés? En prévision du début du cours «Développeur PHP Backend», notre collègue a préparé une publication intéressante sur la sécurité en PHP ...




Présentation


Le scandale Facebook et Cambridge Analytica, la fuite de correspondance du Parti démocrate américain en 2016, la violation de données de Google en 2018 et le piratage de Yahoo Voice en 2012 ne sont que quelques exemples de fuites majeures enregistrées au cours des dernières années.

Les informations à l'échelle mondiale sont désormais à notre disposition comme jamais auparavant. Si vous ne prenez pas les précautions nécessaires, les informations nous concernant (y compris les informations de nature confidentielle) peuvent également être du domaine public.

Peu importe le type de projet que vous développez: un jeu pour enfants open-source ou la commande d'une grande entreprise. Votre responsabilité en tant que développeur Web est d'assurer la sécurité de toutes vos plateformes. La sécurité est un aspect très difficile.

Le langage PHP fournit plusieurs outils et fonctions que vous pouvez utiliser pour garantir la sécurité des applications.

3 règles de sécurité par mot de passe




Les mots de passe des utilisateurs doivent vous rester inconnus.


Je me souviens encore de mes premiers pas en tant que développeur PHP. La première application que j'ai créée était un jeu où, avec mes amis, j'ai joué le rôle d'un constructeur de gratte-ciel. Chacun de nous pourrait se connecter à notre compte, acheter des constructeurs et envoyer notre équipe sur un nouveau chantier chaque semaine. J'ai créé des comptes de base: j'ai ajouté un nom d'utilisateur et un mot de passe pour chaque utilisateur et je leur ai envoyé par e-mail. Et seulement après quelques mois, j'ai réalisé à quel point c'était stupide.

La règle générale est la suivante: non seulement vous ne devez pas connaître les mots de passe de vos utilisateurs, mais vous ne devez pas non plus les reconnaître. Il s'agit d'un aspect très grave qui peut même entraîner une responsabilité légale.

Par essais et erreurs, vous arrivez toujours à la conclusion que les mots de passe n'ont pas besoin d'être stockés en texte brut ou de manière à pouvoir être facilement décryptés.

N'entrez pas de restrictions de mot de passe


Jouons un jeu. Essayez de deviner le mot de passe:

**********

Difficile, non? Essayons ceci:

P * r *** e ***

Vous savez maintenant qu'il y a une majuscule et quelques majuscules. Et si oui:

P * r *** e911

Maintenant, il vous sera beaucoup plus facile de deviner le mot de passe - car vous savez qu'il comprend une lettre majuscule, des lettres majuscules et un chiffre.

La même chose se produit lorsque vous imposez des restrictions aux utilisateurs et aux masques pour leurs mots de passe. Si votre application doit suivre un modèle spécifique, vous donnez aux intrus des conseils qu'ils peuvent utiliser contre vous.

Exiger une certaine longueur minimale de mot de passe est normal, car la longueur du mot de passe affecte le temps qu'il faut pour le récupérer. Cependant, il sera beaucoup plus utile de découvrir le fonctionnement des algorithmes et du hachage.

Soit dit en passant, la bonne réponse à l'énigme ci-dessus est «Porsche911» :)

N'envoyez jamais de mots de passe par e-mail dans leur forme la plus pure


L'une de mes premières erreurs en tant que développeur Web est que je n'ai pas appris à gérer les mots de passe à l'avance.

Imaginez que vous êtes un client et que vous embauchez un développeur pour créer un joli site de commerce électronique pour votre entreprise. Ce développeur vous a envoyé un e-mail contenant le mot de passe de votre site. Maintenant, vous savez trois choses sur votre employé:

  1. Il connaît votre mot de passe.
  2. Il stocke votre mot de passe dans sa forme la plus pure, sans utiliser de cryptage.
  3. Il ne ressent pas la moindre inquiétude lors de l'envoi de mots de passe sur Internet.

En réponse, il n'y a pas d'autre choix que de licencier un tel employé.

Voici ce qu'un développeur Web devrait faire:

  1. Créez une page dans votre application web où l'utilisateur peut saisir son e-mail au cas où il aurait oublié le mot de passe et ainsi demander un nouveau mot de passe.
  2. Votre application générera des droits d'accès uniques et la liera à l'utilisateur qui a fait la demande (j'utilise personnellement un identifiant individuel universel).
  3. L'application enverra à l'utilisateur un e-mail avec un lien menant au droit d'accès.

Dès que l'utilisateur suit le lien, l'application confirme le bon accès et permet à l'utilisateur de changer le mot de passe.

Voyez comment la sécurité de l'application a augmenté avec ces étapes simples? Si vous le souhaitez, nous pouvons encore augmenter le niveau de sécurité en ajoutant un délai entre la demande et la définition d'un nouveau mot de passe.

Comment hacher les mots de passe des utilisateurs




Les mots de passe d'une application Web doivent être hachés et non chiffrés. Le cryptage est un algorithme bidirectionnel. La séquence est chiffrée, que vous pouvez ensuite déchiffrer et réutiliser. Cette technique est souvent utilisée en renseignement pour obtenir des informations auprès d'alliés.

Le hachage suggère que la séquence ne peut pas être renvoyée en texte brut. C'est le but ultime de tout le processus.

Pour atteindre différents objectifs, de nombreux algorithmes ont été développés: certains sont caractérisés par une grande vitesse, d'autres sont très fiables. Cette technologie est en constante évolution et, au cours des dernières années, a subi de nombreux changements. Maintenant, nous allons en considérer les trois variétés les plus populaires dans l'ordre chronologique.

SHA-1


C'était historiquement la première fonction de hachage. L'acronyme SHA-1 signifie «Safe Hashing Algorithm», développé par la US National Security Agency.

SHA-1 était bien connu et largement utilisé en PHP pour créer une chaîne hexadécimale de 20 octets avec une longueur de 40 caractères.

L'industrie SSL utilise SHA-1 pour les signatures numériques depuis plusieurs années. Ensuite, après avoir identifié certaines faiblesses, Google a décidé qu'il était temps de passer à SHA-2.
La première version de l'algorithme a été déconseillée en 2005. Par la suite, de nouvelles versions ont été développées et adoptées pour utilisation: SHA-2, SHA-2 et SHA-256.

Bcrypt


Bcrypt, qui n'est pas le résultat du développement naturel de SHA, a réussi à attirer un large public en raison de son niveau de sécurité.

Cet algorithme extrêmement lent a été créé pour créer les séquences de hachage les plus sécurisées. Dans le processus de hachage des données, il passe par plusieurs cycles qui, en informatique, sont décrits par l'indicateur des coûts salariaux. Plus le taux de travail est élevé, plus il sera coûteux pour un pirate d'obtenir un mot de passe.

Il y a une bonne nouvelle: à l'avenir, nous pourrons utiliser des machines plus puissantes capables de passer plus rapidement plus de cycles.

Argon2


Il s'agit d'un nouvel algorithme de hachage à la mode développé par Alex Biryukov, Daniel Dinu et Dmitry Hovratovich de l'Université du Luxembourg. En 2015, il a remporté le concours de hachage de mot de passe.

Argon2 est présenté en 3 versions:

  1. Argon2d accède à un tableau de mémoire, ce qui réduit la mémoire et la surcharge de temps. Cependant, il présente un risque d'attaque via des canaux tiers.
  2. Argon2i est l'opposé d'Argon 2d. Il est optimisé pour les attaques sur les canaux tiers et accède à la mémoire de manière indépendante du mot de passe.
  3. Argon2id est une version intermédiaire entre deux versions précédentes.

Cette fonction a 6 paramètres: séquence de mots de passe, sel, coût de la mémoire, coût du temps, facteur de parallélisme (nombre maximum autorisé de threads parallèles), longueur de hachage.

Dans la deuxième partie de l'article, je vais vous dire comment utiliser ce hachage en PHP en utilisant les fonctions intégrées, et maintenant je veux inviter tout le monde au serveur de web gratuit en ligne "ServerLess PHP", dans lequel nous allons nous familiariser avec le concept Serverless, parler de son implémentation dans AWS, de l'applicabilité, prix. Nous analyserons les principes d'assemblage et de lancement, ainsi que la construction d'un TG-bot simple basé sur AWS Lambda.

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


All Articles