Avec l'augmentation des attaques en ligne, la sécurité des mots de passe devient de plus en plus importante. En tant que développeurs, nous sommes responsables de la gestion de la sécurité, du calcul des hachages et du stockage des mots de passe des utilisateurs, que l'application soit un simple jeu ou un référentiel de documents commerciaux top-secrets. PHP dispose de certains outils intégrés qui facilitent la protection des mots de passe. Dans cette section, nous verrons comment utiliser ces outils selon les mesures de sécurité modernes.
1. Trois principes de protection par mot de passe
Nous ne devons jamais connaître le mot de passe de l'utilisateur
Nous ne devons jamais connaître le mot de passe de l'utilisateur Il ne peut pas non plus y avoir de moyen d'obtenir le mot de passe de l'utilisateur. Si la base de données de l'application est piratée, vous ne souhaitez pas avoir de texte brut ou de mots de passe déchiffrables dans la base de données. À tout moment, moins vous en savez, plus vous êtes en sécurité.
Ne restreignez jamais le mot de passe de l'utilisateur
Si vous exigez que le mot de passe se conforme à un modèle spécifique, cela fournit en fait un moyen aux personnes mal intentionnées d'attaquer l'application. Si vous devez le restreindre Pour les mots de passe, je recommande de les limiter uniquement à une longueur minimale. C'est également une bonne idée de mettre sur liste noire les mots de passe couramment utilisés ou les mots de passe créés sur la base d'un dictionnaire.
N'envoyez jamais un mot de passe utilisateur par e-mail
Si vous envoyez un mot de passe à un utilisateur par e-mail, celui-ci saura trois choses : vous connaissez son mot de passe, et vous avez stocké son mot de passe en texte brut ou d'une manière qui peut être déchiffrée, vous n'avez pas à vous soucier de l'envoi de mots de passe en texte brut sur Internet.
Nous devons envoyer l'URL pour définir ou modifier le mot de passe dans l'e-mail. Les applications Web génèrent généralement un jeton unique n'est utilisé qu'une seule fois lors de la définition ou de la modification du mot de passe (comme la modification du mot de passe). , nous utilisons généralement ce jeton comme paramètre dans l'URL pour définir ou modifier le mot de passe. Lorsque l'utilisateur accède à cette URL, l'application vérifiera si le jeton est valide, s'il est valide, poursuivra l'opération. , le jeton devient invalide et ne peut pas être réutilisé.
2. Algorithme de stockage du mot de passe
La meilleure pratique concernant le stockage du mot de passe est de calculer la valeur de hachage du mot de passe plutôt que de crypter le mot de passe de l'utilisateur. Le cryptage et le hachage ne sont pas la même chose. Le cryptage est un algorithme bidirectionnel. Les données cryptées peuvent être déchiffrées, tandis que le hachage est un algorithme unidirectionnel. Les données hachées ne peuvent pas être restaurées à leur valeur d'origine et la valeur de hachage obtenue. les mêmes données sont toujours les mêmes.
Pour stocker le mot de passe de l'utilisateur dans la base de données, vous devez d'abord calculer la valeur de hachage du mot de passe, puis stocker la valeur de hachage du mot de passe dans la base de données. Si un pirate informatique pénètre dans la base de données, il le fera seulement. Si vous voyez des valeurs de hachage de mot de passe dénuées de sens, cela prendrait beaucoup de temps et de ressources de la NSA pour les déchiffrer.
Il existe de nombreux types d'algorithmes de hachage (tels que md5, SHA1, bcrypt et scrypt). Certains algorithmes sont très rapides et sont utilisés pour vérifier l'intégrité des données ; certains algorithmes sont très lents et sont conçus pour améliorer la sécurité. Utilisez des algorithmes lents et hautement sécurisés lors de la génération et du stockage des mots de passe.
Actuellement, l'algorithme le plus sécurisé est bcrypt Contrairement à md5 et SHA1, bcrypt est délibérément conçu pour être lent. Il ajoutera automatiquement du sel pour empêcher les attaques potentielles de la table arc-en-ciel. Les données sont traitées de manière répétée dans le temps pour générer un hachage particulièrement sécurisé. Dans ce processus, le nombre de fois où les données sont traitées est appelé facteur de travail. Plus la valeur du facteur de travail est élevée, plus il faut de temps pour déchiffrer le mot de passe et meilleure est la sécurité. L'algorithme bcrypt est intemporel. Si la vitesse de l'ordinateur devient plus rapide, il suffit d'augmenter la valeur du facteur de travail.
3. API de hachage de mot de passe
Grâce à l'introduction précédente, nous savons qu'il y a de nombreux éléments à prendre en compte lors du traitement des mots de passe des utilisateurs. Heureusement, PHP 5.5.0 est natif. L'API Hash (http://php.net/manual/zh/book.password.php) fournit de nombreuses fonctions faciles à utiliser, ce qui simplifie grandement l'opération de calcul des hachages de mots de passe et de vérification des mots de passe. L'API utilise l'algorithme bcrpt par défaut.
Lors du développement d'applications Web, l'API de hachage de mot de passe est utilisée à deux endroits : les utilisateurs enregistrés et la connexion de l'utilisateur. Prenons l'exemple de l'enregistrement et de la connexion de l'utilisateur fournis par Laravel pour voir comment fonctionne l'API de hachage de mot de passe PHP. fonctionne. Comment simplifier ces deux opérations.
Remarque : les fonctions intégrées d'enregistrement et de connexion des utilisateurs du framework Laraval utilisent l'API de hachage PHP pour stocker et vérifier les mots de passe.
Utilisateur enregistré
L'enregistrement de l'utilisateur est terminé dans AuthController et la création de nouveaux utilisateurs est implémentée dans la méthode create du contrôleur :
Vous pouvez voir que la fonction auxiliaire bcrypt fournie par Laravel est utilisée pour hacher le mot de passe soumis par l'utilisateur et l'enregistrer dans la base de données. La fonction bcrypt est définie comme suit :
Ici, nous pouvons voir que la méthode make sur l'instance du fournisseur de services alias hash est en fait appelée pour implémenter le mot de passe haché et saisir le HashServiceProvider. Dans la méthode register, on peut voir que la classe correspondant au hash est BcryptHasher, dans laquelle on retrouve la méthode make :
Le noyau ici est d'appeler la fonction password_hash fournie par PHP. Cette fonction reçoit trois paramètres Le premier est la valeur du mot de passe saisie par l'utilisateur, et le deuxième paramètre est l'algorithme de hachage utilisé (voir plus d'algorithmes : http : /). /php.net/manual/zh/password.constants.php), le troisième paramètre est facultatif, y compris les options de sel et de coût, qui représentent respectivement la chaîne d'interférence (sel) et le facteur de travail mentionné précédemment, le facteur de travail peut être augmenté avec l'amélioration des performances du matériel. Sinon, utilisez du sel aléatoire et un facteur de travail par défaut (le calcul de la valeur de hachage prend généralement 0,1 à 0,5 s). Si le calcul échoue, une exception est levée.
Connexion utilisateur
Dans Larval, prenons l'exemple de l'utilisation de session comme gardes et éloquent comme fournisseurs dans auth.php pour implémenter l'authentification de connexion utilisateur (en fait, les paramètres par défaut sont comme ça), la vérification de la connexion ira finalement à la méthode validateCredentials d'EloquentUserProvider :
$this->L'implémentation correspondante de hasher est également la classe BcryptHasher, vérifions sa méthode de vérification :
Le premier paramètre transmis est le mot de passe saisi par l'utilisateur, et le deuxième paramètre est la valeur de hachage du mot de passe enregistrée lors de l'enregistrement de l'utilisateur. est vide, renvoie directement false, sinon la fonction password_verify fournie par PHP est appelée. Cette fonction est utilisée pour vérifier si le mot de passe (texte brut) et la valeur de hachage correspondent. La correspondance renvoie true, sinon elle renvoie false.
Recalculer la valeur de hachage
Grâce aux étapes ci-dessus, l'utilisateur peut déjà réaliser l'authentification de connexion, mais avant de se connecter, nous devons également vérifier si le hachage du mot de passe existant la valeur a été Expiration. S’il est expiré, le hachage du mot de passe doit être recalculé.
Pourquoi devons-nous recalculer ? L'application qui nous rejoint a été créée il y a deux ans et utilisait un facteur de travail de 10. Elle en utilise désormais 20 car les ordinateurs sont plus rapides et les pirates sont plus intelligents. Les valeurs de hachage de mot de passe de certains utilisateurs peuvent encore être générées lorsque le facteur de travail est de 10. Dans ce cas, une fois l'authentification de connexion réussie, la fonction password_needs_refresh doit être utilisée pour vérifier si la valeur de hachage existante dans l'enregistrement utilisateur doit être mis à jour. Cette fonction peut garantir que les hachages de mot de passe spécifiés sont créés à l'aide des derniers algorithmes de hachage. Si vous avez vraiment besoin de recalculer la valeur de hachage du mot de passe généré, utilisez la méthode make pour générer une nouvelle valeur de hachage et mettre à jour le mot de passe d'origine dans la base de données.
Cette fonctionnalité n'est actuellement pas utilisée dans Laraval, mais la fonction correspondante a été fournie dans la classe BcryptHasher :
Adresse d'origine : https : //xueyuanjun.com/post/4764
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!