Maison >développement back-end >tutoriel php >Risques et défis du hachage de mot de passe

Risques et défis du hachage de mot de passe

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌original
2025-02-22 08:36:11809parcourir

Risques et défis du hachage de mot de passe

Les plats clés

  • Le hachage est une fonction unidirectionnelle qui mappe les données de longueur variable à la sortie de longueur fixe, mais de simples algorithmes de hachage comme MD5 et SHA-1 sont vulnérables aux attaques en raison de vulnérabilités connues et de la faisabilité de la collision.
  • Les mots de passe de salage ajoutent une valeur unique à chaque mot de passe avant le hachage, améliorant la sécurité en empêchant des attaques telles que des tables arc-en-ciel et une force brute, mais les sels doivent être stockés en toute sécurité pour éviter l'exploitation.
  • L'étirement du mot de passe augmente la sécurité en hachant de manière itérative le mot de passe plusieurs fois, ce qui retarde les tentatives de craquer, ce qui rend les attaques par force brute plus longues et moins possibles.
  • L'utilisation d'algorithmes de hachage solides et modernes comme SHA-256 ou Bcrypt, et les techniques de mise en œuvre telles que le salage et l'étirement, sont essentielles pour améliorer la sécurité des mots de passe.
  • Malgré les améliorations des techniques de hachage, aucune méthode n'est entièrement infaillible en raison du potentiel de progrès en matière de puissance et de technique de calcul, soulignant la nécessité de mises à jour et d'évaluations continues des stratégies de stockage de mots de passe.

Dans un article passé, le hachage de mot de passe a été discuté comme un moyen de stocker en toute sécurité les informations d'identification des utilisateurs dans une application. La sécurité est toujours un sujet très controversé, de la politique et de la religion très similaires, où de nombreux points de vue existent et une «solution parfaite» pour quelqu'un n'est pas la même pour les autres. À mon avis, la rupture des mesures de sécurité d'une demande n'est qu'une question de temps. Avec la puissance et la complexité de l'ordinateur augmentant tous les jours, les applications sécurisées d'aujourd'hui ne seront pas aussi sécurisées demain.

Pour nos lecteurs qui ne connaissent pas ce qu'est un algorithme de hachage, ce n'est rien de plus qu'une fonction unique qui mappe les données de longueur variable à des données de longueur fixe. Donc, si nous analysons la définition ci-dessus, nous devons comprendre les exigences et les caractéristiques suivantes de ces algorithmes:

  • Fonction unique: la sortie ne peut pas être inversée à l'aide d'un algorithme efficace.
  • Carr les données de la longueur variable aux données de longueur fixe: ce qui signifie que l'espace de message d'entrée peut être «infini», mais l'espace de sortie ne l'est pas. Cela a l'implication que 2 ou plusieurs messages d'entrée peuvent avoir le même hachage. Plus l’espace de sortie est petit, plus la probabilité d’une «collision» entre deux messages d'entrée.

MD5 a confirmé les collisions pratiques et les probabilités de SHA1 pour atteindre une collision augmentent tous les jours (plus d'informations dans la probabilité de collision peuvent être trouvées en analysant le problème d'anniversaire classique), donc si nous devons appliquer un algorithme de hachage, nous devons utiliser le problème Ceux qui ont un plus grand espace de sortie (et une probabilité de collision négligeable), comme Sha256, Sha512, Whirlpool, etc…

Ils sont également appelés «fonctions pseudo-aléatoires», ce qui signifie que la sortie d'une fonction de hachage doit être indiscernable d'un véritable générateur de nombres aléatoires (ou TRNG).

Pourquoi le hachage simple n'est pas sûr de stocker les mots de passe

Le fait que la sortie d'une fonction de hachage ne peut pas être retournée à l'entrée à l'aide d'un algorithme efficace ne signifie pas qu'elle ne peut pas être fissurée. Les bases de données contenant des hachages de mots communs et de chaînes courtes sont généralement à notre portée avec une simple recherche Google. De plus, les cordes communes peuvent être facilement et rapidement forcées ou fissurées avec une attaque de dictionnaire.

Démonstration

Voici une vidéo rapide sur la façon dont un outil comme SQLMAP peut casser les mots de passe via l'injection SQL par Bruteforce MD5 Hashs dans une base de données.

De plus, nous aurions pu juste faire les attaques les plus simples… il suffit de prendre le hachage et de Google… il y a de fortes chances que le hachage existe dans une base de données en ligne. Des exemples de bases de données de hachage sont:

  • http://www.hash-database.net/
  • https://isc.sans.edu/tools/hashsearch.html
  • http://md5online.net/
  • https://crackstation.net/

Nous devons également considérer que, puisque 2 mots de passe identiques ou plus auront en effet la même valeur de hachage, la fissuration d'un hachage vous donnera automatiquement les mots de passe de chaque utilisateur qui les a utilisés. Juste pour être clair, disons que vous avez des milliers d'utilisateurs, il est très probable qu’elles seront utilisées (si les politiques de mots de passe ne sont pas appliquées) le tristement célèbre mot de passe «123456». La valeur de hachage MD5 de ce mot de passe est «e10adc3949ba59abbe56e057f20f883e», donc lorsque vous craquez ce hachage (si vous devez même le faire) et rechercher tous les utilisateurs qui ont cette valeur dans leur champ de mot de passe, vous saurez que chacun d'eux a été utilisé le mot de passe '123456'.

Pourquoi les hachages salés ne sont pas sûrs de stocker les mots de passe

Pour atténuer cette attaque, les sels sont devenus courants mais ne sont évidemment pas suffisants pour la puissance de calcul d'aujourd'hui, surtout si la chaîne de sel est courte, ce qui le rend brutal.

La fonction de mot de passe / sel de base est définie comme:

f (mot de passe, sel) = hachage (mot de passe sel)

Afin d'atténuer une attaque par force brute, un sel doit être jusqu'à 64 caractères, cependant, afin d'authentifier un utilisateur plus tard, le sel doit être stocké en texte brut à l'intérieur de la base de données, donc:

<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>

Étant donné que chaque utilisateur aura un sel complètement différent, cela évite également le problème avec des hachages simples, où nous pourrions facilement dire si 2 utilisateurs ou plus utilisent le même mot de passe; Maintenant, les hachages seront différents. Nous ne pouvons pas non plus prendre le hachage de mot de passe directement et essayer de le rechercher sur Google. De plus, avec un long sel, une attaque par force brute est improbable. Mais, si un attaquant a accès à ce sel, soit par une attaque d'injection SQL, soit un accès direct à la base de données, une attaque brute ou un dictionnaire devient probable, surtout si vos utilisateurs utilisent des mots de passe communs (encore une fois, comme '123456'):

<span>Generate some string or get entry from dictionary
</span><span>Concatenate with salt
</span><span>Apply hash algorithm
</span><span>If generated hash == hash in database then Bingo
</span><span>else continue iterating</span>

mais même si un mot de passe est fissuré, cela ne vous donnera pas automatiquement le mot de passe pour chaque utilisateur qui pourrait l'avoir utilisé, car aucun utilisateur ne devrait avoir le même hachage stocké.

Le problème du hasard

Afin de générer un bon sel, nous devons avoir un bon générateur de nombres aléatoires. Si la fonction Rand () de PHP est automatiquement apparue dans votre esprit, oubliez-la immédiatement.

Il y a un excellent article sur le hasard dans Random.org. Autrement dit, un ordinateur ne peut pas penser des données aléatoires en soi. Les ordinateurs seraient des machines déterministes, ce qui signifie que chaque algorithme qu'un ordinateur est capable d'exécuter, étant donné exactement la même entrée, produira toujours la même sortie.

Lorsqu'un nombre aléatoire est demandé à l'ordinateur, il obtient généralement des entrées de plusieurs sources, comme les variables d'environnement (date, heure, # des octets lus / écrits, de disponibilité…), puis appliquez des calculs sur eux pour produire Données aléatoires . C'est la raison pour laquelle les données aléatoires données par un algorithme sont appelées pseudo aléatoires et il est donc important de se différencier d'une véritable source de données aléatoires. Si nous pouvons en quelque sorte recréer les conditions exactes présentes au moment de l'exécution d'un générateur de nombres pseudo-aléatoires (ou PRNG), nous aurons automatiquement le numéro généré d'origine.

De plus, si un PRNG n'est pas correctement implémenté, il est possible de découvrir des modèles dans les données générées. Si des modèles existent, nous pouvons prédire le résultat… Prenez par exemple le cas de la fonction Rand () de PHP sur Windows, comme documenté ici. Bien qu'il ne soit pas clair quelle version PHP ou Windows est utilisée, vous pouvez immédiatement dire qu'il y a quelque chose qui ne va pas en regardant le bitmap généré en utilisant Rand ():

Risques et défis du hachage de mot de passe

Comparez à l'image de sortie d'un trng:

Risques et défis du hachage de mot de passe

Même si le problème a été résolu sur Php> = 5, Rand () et même MT_RAND () sont toujours considérés comme très inadéquats à des fins liées à la sécurité.

Si vous avez besoin de générer des données aléatoires, veuillez utiliser OpenSSL_RANDOM_PSEUDO_BYTES () disponible en tant que php 5> = 5.3.0, il a même le drapeau crypto_strong qui vous dira si les octets sont suffisamment sécurisés.

Voici un échantillon de code rapide pour générer des chaînes aléatoires à l'aide d'OpenSSL_RANDOM_PSEUDO_BYTES ()

<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>

L'étirement du mot de passe peut être efficace si bien fait

Pour atténuer davantage les attaques par force brute, nous pouvons implémenter la technique d'étirement du mot de passe. Il s'agit juste d'un algorithme itératif ou récursif qui calcule une valeur de hachage encore et encore en soi, généralement des dizaines de milliers de fois (ou plus).

Risques et défis du hachage de mot de passe

Cet algorithme doit itérer suffisamment afin d'effectuer tous les calculs en au moins 1 seconde (le hachage plus lent signifie également que l'attaquant devra attendre).

Afin de casser un mot de passe sécurisé par l'étirement, l'attaquant doit:

  1. Connaître le nombre d'itération exact, toute déviation produira des hachages entièrement différents.
  2. devrait attendre au moins 1 seconde entre chaque tentative.

Cela rend une attaque improbable… mais pas impossible. Afin de surmonter le délai de 1 seconde, un attaquant doit avoir des spécifications matérielles plus élevées que l'ordinateur pour lequel l'algorithme a été réglé, ce qui pourrait signifier un coût élevé, de sorte que l'attaque devient prohibitive.

Vous pouvez également utiliser des algorithmes standard, comme PBKDF2 qui est une fonction de dérivation de clés basée sur un mot de passe

<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>

Il existe également des algorithmes à forte intensité de mémoire comme Bcrypt (via la fonction crypte ()) et Scrypt

<span>Generate some string or get entry from dictionary
</span><span>Concatenate with salt
</span><span>Apply hash algorithm
</span><span>If generated hash == hash in database then Bingo
</span><span>else continue iterating</span>

où $ coûte est le facteur de travail, et $ sel est une chaîne aléatoire que vous pouvez générer en utilisant la fonction sécurisée_rand () ci-dessus.

Le facteur de charge de travail dépend totalement du système cible. Vous pouvez commencer par un facteur de «09» et l’augmenter jusqu'à ce que l'opération se termine en environ. 1 seconde.

à partir de php 5> = 5.5.0, vous pouvez utiliser la nouvelle fonction Password_Hash (), qui utilise BCrypt comme méthode par défaut pour le hachage.

Il n'y a pas encore de support Scrypt dans PHP, mais vous pouvez consulter l'implémentation de Scrypt de Domback.

qu'en est-il de l'application de techniques de chiffrement?

hachage et chiffrement (ou cryptage ) sont des termes qui sont souvent confus. Comme je l'ai mentionné précédemment, le hachage est une fonction pseudo-aléatoire, tandis que le cyphering est généralement un ‘Pseudo-Random Permutation’ . Cela signifie que le message d'entrée est tranché et modifié de telle manière que la sortie ne se distingue pas d'un TRNG, mais la sortie peut être transformée à nouveau en entrée d'origine. Cette transformation est effectuée en utilisant une clé de chiffrement, sans laquelle il devrait être impossible de transformer la sortie en un message d'origine.

Le chiffre a une autre grande différence par rapport au hachage. Alors que l'espace de message de sortie du hachage est fini, l'espace de message de sortie de la diffusion est infini, car la relation entre l'entrée et la sortie est 1: 1, les collisions ne doivent donc pas exister.

Il faut être très prudent sur la façon d'appliquer correctement les techniques de chiffrement, penser qu'en appliquant un algorithme de chiffrement aux données sensibles est suffisant pour le garder en sécurité est considéré comme mauvais, car de nombreux problèmes qui pourraient entraîner des fuites de données. En règle générale, vous ne devriez jamais envisager d'appliquer votre propre implémentation de cryptage

Récemment, Adobe a eu une fuite de données massive de la base de données de leur utilisateur, car ils ont incorrectement appliqué des techniques de chiffrement et je les prends comme exemple de ce qu'il ne faut pas faire. J'essaierai d'être aussi simple que possible, en gardant les choses vraiment simples.

Considérez le schéma suivant:

Risques et défis du hachage de mot de passe

Disons que le contenu en texte brut de la table est le suivant:

Risques et défis du hachage de mot de passe

Maintenant, quelqu'un d'Adobe a décidé de chiffrer les mots de passe, mais a fait deux grosses erreurs:

  1. a utilisé la même touche de chiffre d'affaires pour crypter les mots de passe
  2. a décidé de quitter le champ Hint du mot de passe en texte brut

Disons par exemple qu'après avoir appliqué un algorithme d'enceinte au champ de mot de passe, nos données ressemblent maintenant à ce qui suit:

Risques et défis du hachage de mot de passe

Bien que les mots de passe ne puissent pas être simplement déchiffrés, et nous ne pouvons pas connaître la clé de chiffrement utilisée de manière simple, en examinant les données que nous pouvons remarquer que les enregistrements 2 et 7 partagent le même mot de passe, ainsi que 3 et 6… C'est là que le champ HinT de mot de passe entre en jeu.

Enregistrer 6 L'indice est "Je suis One!" qui ne nous donne pas beaucoup d'informations, mais l'enregistrement de 3 L'indice de 3 fait ... nous pouvons deviner en toute sécurité que le mot de passe est "Queen". Les records 2 et 7 conseils ne donnent pas beaucoup d'informations seuls, mais si nous les regardons ensemble, combien de vacances ont le même nom qu'un film effrayant? Nous avons maintenant accès au compte de chacun qui a utilisé «Halloween» comme mot de passe.

Pour atténuer le risque de fuites de données, il est préférable de passer aux techniques de hachage, mais si vous devez utiliser des techniques de cryptage pour stocker les mots de passe, nous pouvons utiliser un cryptage modifiable. Le terme a l'air fantaisiste, mais est très simple.

Disons que nous avons des milliers d'utilisateurs et que nous voulons crypter tous les mots de passe. Comme nous l'avons vu, nous ne pouvons pas utiliser la même clé de cryptage pour chaque mot de passe, car les données seront à des risques (et d'autres attaques sophistiquées deviennent possibles). Cependant, nous ne pouvons pas utiliser une clé unique pour chaque utilisateur, car le stockage de ces clés deviendra un risque de sécurité en soi. Ce que nous devons faire est de générer une seule clé et d'utiliser un «tweak» qui sera unique à chaque utilisateur, et la clé et le tweak ensemble seront la clé de cryptage pour chaque enregistrement. Le plus simple des ajustements disponibles est la clé principale, qui, par définition, est unique à chaque enregistrement du tableau (bien que je ne recommande pas de l'utiliser, c'est juste pour démontrer le concept):

f (clé, primaire) = Key PrimaryKey

ci-dessus, je concaténe simplement à la fois la touche de chiffrement et la valeur de la clé primaire pour générer la clé de chiffrement finale, mais vous pouvez ( et devriez ) un algorithme de hachage ou une fonction de dérivation de la clé. De plus, au lieu d'utiliser la clé primaire comme ajustement, vous voudrez peut-être générer un nonce (similaire à un sel) pour que chaque enregistrement soit utilisé comme tweak.

Après avoir appliqué un cryptage modifiable au tableau des utilisateurs, il ressemble maintenant à ce qui suit:

Risques et défis du hachage de mot de passe

Bien sûr, nous avons toujours le problème du mot de passe, mais maintenant chaque enregistrement a une valeur unique, il n'est donc pas évident quels utilisateurs utilisent le même mot de passe.

Je tiens à souligner que le chiffrement n'est pas la meilleure solution, et doit être évité si possible pour stocker les mots de passe car de nombreuses faiblesses peuvent être injectées… vous pouvez et devriez vous en tenir à des solutions éprouvées (comme Bcrypt) pour stocker les mots de passe, mais Gardez à l'esprit que même les solutions éprouvées ont leurs faiblesses.

Conclusion

Il n'y a pas de solution parfaite et le risque que quelqu'un brisant nos mesures de sécurité augmente chaque jour. Cependant, les études et les recherches de sécurité des cryptographies et des données se poursuivent, avec la définition récente relative des fonctions d'éponge, notre boîte à outils continue de croître tous les jours.

Questions fréquemment posées (FAQ) sur le hachage du mot de passe

Quelle est la différence entre le hachage de mot de passe et le chiffrement?

Le hachage et le chiffrement du mot de passe sont deux méthodes différentes utilisées pour sécuriser les données, mais elles servent des objectifs différents. Le chiffrement est une fonction bidirectionnelle; Ce qui est crypté peut être déchiffré avec la clé appropriée. Cela signifie que si quelqu'un a accès à la clé de chiffrement, il peut décrypter les données. D'un autre côté, le hachage est une fonction à sens unique qui se précipite en texte brut pour produire un digestion de message unique. Même un petit changement dans l'entrée produira un changement aussi drastique de sortie que la nouvelle valeur de hachage ne ressemblera pas à l'ancienne. Cela rend impossible de régénérer les données d'origine de la valeur de hachage, ce qui rend le hachage plus sûr pour le stockage des mots de passe.

Comment le hachage du mot de passe du sel améliore-t-il la sécurité?

Un sel est une données aléatoire qui est utilisé comme une entrée supplémentaire à une fonction unidirectionnelle qui hache les données, un mot de passe ou une phrase secrète. Les sels sont utilisés pour protéger les mots de passe en stockage. La fonction principale des sels est de se défendre contre les attaques du dictionnaire ou contre les attaques de table arc-en-ciel pré-calculées. En ajoutant un sel unique, le hachage devient unique à chaque utilisateur, même si deux utilisateurs ont le même mot de passe. Cela signifie que même si un pirate a accès à la valeur de hachage, il ne peut pas casser le mot de passe sans le sel unique.

Quel est le risque d'utiliser des algorithmes de hachage faibles?

Algorithmes de hachage faibles, Comme MD5 et SHA-1, sont sensibles aux attaques. Ils ont des vulnérabilités connus et peuvent être fissurés relativement facilement avec une puissance de calcul moderne. Par exemple, ils sont vulnérables aux attaques de collision, où deux entrées différentes produisent la même sortie de hachage. Cela compromet l'intégrité des données. Par conséquent, il est recommandé d'utiliser des algorithmes de hachage plus forts comme SHA-256 ou BCrypt qui offrent un niveau de sécurité plus élevé.

Comment l'étirement du mot de passe augmente-t-il la sécurité?

L'étirement du mot de passe est une technique utilisée pour augmenter pour augmenter pour augmenter la sécurité? La sécurité des mots de passe stockés. Cela se fait en appliquant une fonction de hachage cryptographique au mot de passe de l'utilisateur, avec un sel, puis en ré-échouant le résultat plusieurs fois. Ce processus augmente le temps nécessaire aux mots de passe de hachage, ce qui peut dissuader les attaquants qui comptent sur de nombreuses tentatives rapides pour deviner le mot de passe.

Qu'est-ce qu'une attaque de table arc-en-ciel?

Une attaque de table arc-en-ciel est un type de piratage dans lequel l'attaquant utilise une table arc-en-ciel, une table pré-composée pour inverser les fonctions de hachage cryptographique, pour casser les mots de passe hachés. La table arc-en-ciel contient toutes les permutations possibles en texte en clair des mots de passe chiffrés. Cette méthode est efficace contre le hachage de base, mais l'ajout d'un sel unique à chaque hachage de mot de passe peut empêcher les attaques de table arc-en-ciel.

Pourquoi est-il important de garder l'algorithme de hachage secret?

Bien qu'il soit crucial de Gardez l'algorithme de hachage secret, ce n'est pas toujours possible, en particulier avec des algorithmes largement utilisés. La sécurité d'un bon système de hachage ne dépend pas du secret de l'algorithme; Au lieu de cela, il repose sur le secret et le caractère aléatoire du sel ajouté au hachage. Même si les attaquants connaissent l'algorithme, sans le sel, ils ne peuvent pas inverser le mot de passe du hash.

Quel est le rôle d'un poivre dans le hachage du mot de passe?

Un poivre peut être pensé de la seconde, sel secret, ajouté pour augmenter la sécurité des mots de passe stockés. Bien qu'un sel soit généralement stocké dans la base de données à côté du mot de passe haché, un poivre est gardé secret et stocké séparément, souvent dans le code d'application. Cela signifie que même si un attaquant a accès à la base de données, sans le poivre, il ne peut pas casser les mots de passe.

À quelle fréquence dois-je mettre à jour ou modifier l'algorithme de hachage?

La fréquence de mise à jour Ou la modification de l'algorithme de hachage dépend de plusieurs facteurs, notamment la sensibilité des données que vous protégez et de l'état de technologie actuel. En règle générale, si un algorithme de hachage plus sécurisé devient largement accepté, ou si des vulnérabilités se trouvent dans l'algorithme actuel, il est temps de mettre à jour. Restez toujours informé des derniers développements de la cryptographie pour assurer une sécurité maximale.

Quel est l'impact des fonctions de hachage sur les performances de mon application?

Les fonctions de hachage, en particulier les fonctions sécurisées, peuvent être calculées par calcul Intensif et peut avoir un impact sur les performances de votre application. Cependant, cet impact est généralement négligeable par rapport aux avantages de sécurité. Le retard causé par une fonction de hachage sécurisée peut en fait signifier dissuasif aux attaquants, car il ralentit les tentatives de deviner le mot de passe.

Comment puis-je assurer la sécurité maximale des mots de passe utilisateur?

Pour garantir une sécurité maximale des mots de passe utilisateur, suivez ces meilleures pratiques: utilisez un algorithme de hachage fort, sécurisé et à jour; Ajoutez un sel unique à chaque hachage de mot de passe; Envisagez d'ajouter un poivre; et implémenter l'étirement du mot de passe. De plus, appliquez des politiques de mot de passe solides pour vos utilisateurs, telles que la longueur minimale et un mélange de caractères, de nombres et de symboles.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Symfony dans Drupal 8Article suivant:Symfony dans Drupal 8