L'évolution du hachage de mot de passe
Vous avez peut-être entendu des conseils pour choisir les algorithmes de hachage de mot de passe, mais avez-vous réfléchi à pourquoi ils sont recommandés ? Dans cet article, nous explorerons l'évolution des algorithmes de hachage de mots de passe et les raisons qui les sous-tendent.
Introduction
Le hachage de mots de passe, comme son nom l'indique, consiste à calculer une valeur de hachage à partir d'un mot de passe. La valeur de hash est généralement stockée dans une base de données, et pendant le processus de connexion (login), la valeur de hash du mot de passe entré par l'utilisateur est calculée et comparée à la valeur de hash stockée dans la base de données. S'ils correspondent, l'utilisateur est authentifié.
Avant de plonger dans l'évolution des algorithmes de hachage de mots de passe, il est important de comprendre pourquoi c'est nécessaire.
Les mots de passe en texte brut : Un risque majeur pour la sécurité
Imaginez être un utilisateur d'un site web où vous avez enregistré un compte. Un jour, le site web est piraté et la base de données est dévoilée. Si le site web stocke les mots de passe en texte brut, le pirate peut directement accéder à votre mot de passe. Étant donné que beaucoup de gens réutilisent les mêmes mots de passe sur plusieurs sites web, le pirate peut utiliser ce mot de passe pour accéder sans autorisation à vos autres comptes. La situation devient encore pire si vous utilisez le même mot de passe ou un mot de passe similaire pour votre compte de messagerie, car le pirate peut réinitialiser votre mot de passe et prendre le contrôle de tous vos comptes associés.
Même sans violation de données, dans les grandes équipes, toute personne ayant accès à la base de données peut voir les mots de passe. En comparaison avec d'autres informations, les mots de passe sont très sensibles, et vous ne voulez certainement pas que quiconque y ait accès.
Le stockage des mots de passe sans hachage est une erreur de débutant. Malheureusement, si vous recherchez "fuite de mot de passe en texte brut", vous constaterez que des grandes sociétés comme Facebook, DailyQuiz, et GoDaddy ont toutes subi des fuites de mots de passe en texte brut. Il est probable que de nombreuses autres entreprises aient fait la même erreur.
Encodage v.s. Chiffrement v.s. Hachage
Ces trois termes sont souvent confondus, mais ce sont des concepts distincts.
Encodage
L'encodage est la première chose à exclure pour le stockage des mots de passe. Par exemple, Base64 est un algorithme d'encodage qui convertit les données binaires en une chaîne de caractères :
Connaître l'algorithme d'encodage permet à n'importe qui de déchiffrer la chaîne encodée et de récupérer les données originales :
Pour les pirates, la plupart des algorithmes d'encodage sont équivalents au texte brut.
Chiffrement
Avant que le hachage ne gagne en popularité, le chiffrement était utilisé pour stocker les mots de passe, comme avec AES. Le chiffrement implique l'utilisation d'une clé (ou d'une paire de clés) pour chiffrer et déchiffrer les données.
Le problème avec le chiffrement est évident dans le terme "déchiffrer". Le chiffrement est réversible, ce qui signifie que si un pirate obtient la clé, il peut déchiffrer le mot de passe et récupérer le mot de passe en texte brut.
Hachage
La différence principale entre le hachage, l'encodage et le chiffrement est que le hachage est irréversible. Une fois qu'un mot de passe a été haché, il ne peut pas être déchiffré pour retrouver sa forme originale.
En tant que propriétaire d'un site web, vous n'avez pas réellement besoin de connaître le mot de passe lui-même, tant que l'utilisateur peut se connecter avec le bon mot de passe. Le processus d'enregistrement peut être simplifié comme suit :
- L'utilisateur entre le mot de passe.
- Le service utilise un algorithme de hachage pour calculer la valeur de hachage du mot de passe.
- Le service stocke la valeur de hachage dans la base de données.
Lorsque l'utilisateur se connecte, le processus est le suivant :
- L'utilisateur entre le mot de passe.
- Le service utilise le même algorithme de hachage pour calculer la valeur de hachage du mot de passe.
- Le service compare la valeur de hachage avec la valeur de hachage stockée dans la base de données.
- Si les valeurs de hachage correspondent, l'utilisateur est authentifié.
Ces deux processus évitent de stocker les mots de passe en texte brut, et comme le hachage est irréversible, même si la base de données est compromise, le pirate ne peut obtenir que des valeurs de hachage qui apparaissent comme des chaînes aléatoires.
Pack de démarrage des algorithmes de hachage
Le hachage peut sembler être la solution idéale pour le stockage des mots de passe, mais ce n'est pas si simple. Pour comprendre pourquoi, explorons l'évolution des algorithmes de hachage de mots de passe.
MD5
En 1992, Ron Rivest a conçu l'algorithme MD5, un algorithme de somme de contrôle qui peut calculer une valeur de hachage de 128 bits à partir de n'importe quelle donnée. MD5 a été largement utilisé dans divers domaines, dont le hachage de mots de passe. Par exemple, la valeur de hachage MD5 de "123456" est :
Comme mentionné précédemment, la valeur de hachage apparaît comme une chaîne aléatoire et est irréversible. De plus, MD5 est rapide et facile à mettre en œuvre, ce qui en fait l'algorithme de hachage de mot de passe le plus populaire.
Cependant, les avantages de MD5 sont aussi ses faiblesses dans le hachage de mots de passe. Sa vitesse le rend vulnérable aux attaques par force brute. Si un pirate possède une liste de mots de passe courants et vos informations personnelles, il peut calculer la valeur de hachage MD5 de chaque combinaison et les comparer aux valeurs de hachage dans la base de données. Par exemple, il pourrait combiner votre date de naissance avec votre nom ou le nom de votre animal de compagnie.
De nos jours, les ordinateurs sont nettement plus puissants qu'avant, ce qui facilite la force brute des hachages de mots de passe MD5.
Famille SHA
Alors, pourquoi ne pas utiliser un autre algorithme qui génère des valeurs de hachage plus longues ? La famille SHA semble être un bon choix. SHA-1 est un algorithme de hachage qui génère des valeurs de hachage de 160 bits, et SHA-2 est une famille d'algorithmes de hachage qui génère des valeurs de hachage de 224 bits, 256 bits, 384 bits et 512 bits. Voyons la valeur de hachage SHA-256 de "123456" :
La valeur de hachage SHA-256 est beaucoup plus longue que MD5, et elle est également irréversible. Cependant, il y a un autre problème : si vous connaissez déjà la valeur de hachage, comme celle ci-dessus, et si vous voyez la même valeur de hachage dans la base de données, vous savez que le mot de passe est "123456". Un pirate peut créer une liste de mots de passe courants et leurs valeurs de hachage correspondantes, et les comparer aux valeurs de hachage dans la base de données. Cette liste est connue sous le nom de table arc-en-ciel.
Salt
Pour atténuer les attaques par table arc-en-ciel, le concept de sel a été introduit. Le sel est une chaîne aléatoire qui est ajoutée au mot de passe avant le hachage. Par exemple, si le sel est "sel", et que vous voulez utiliser SHA-256 pour hacher le mot de passe "123456" avec le sel, au lieu de simplement faire :
Vous feriez :
Comme vous pouvez le voir, le résultat est totalement différent du hachage sans sel. En règle générale, chaque utilisateur se voit attribuer un sel aléatoire lors de l'inscription, qui est stocké dans la base de données à côté de la valeur de hachage. Pendant le processus de connexion, le sel est utilisé pour calculer la valeur de hachage du mot de passe entré, qui est ensuite comparée à la valeur de hachage stockée.
Itération
Malgré l'ajout de sel, la valeur de hachage reste susceptible aux attaques par force brute à mesure que le matériel devient plus puissant. Pour rendre cela plus difficile, on peut introduire l'itération (c'est-à-dire l'exécution de l'algorithme de hachage plusieurs fois). Par exemple, au lieu d'utiliser :
Vous pourriez utiliser :
L'augmentation du nombre d'itérations rend la force brute plus difficile. Cependant, cela affecte également le processus de connexion, car il devient plus lent. Par conséquent, un équilibre entre la sécurité et les performances doit être trouvé.
Pause à mi-temps
Faisons une pause et résumons les caractéristiques d'un bon algorithme de hachage de mot de passe :
- Irreversible (résistance à l'image de départ)
- Difficile à forcer à briser
- Résistant aux attaques par table de rainbow
Comme vous l'avez peut-être remarqué, le sel et l'itération sont nécessaires pour satisfaire toutes ces exigences. Le problème est que ni MD5 ni la famille SHA n'ont été spécifiquement conçus pour le hachage de mots de passe ; ils sont largement utilisés pour les contrôles d'intégrité (ou "sommes de contrôle"). En conséquence, chaque site web peut avoir sa propre implémentation de sel et d'itération, ce qui rend la standardisation et la migration difficiles.
Algorithmes de hachage de mots de passe
Pour résoudre ce problème, plusieurs algorithmes de hachage ont été spécialement conçus pour le hachage de mots de passe. Jetons un coup d'œil à certains d'entre eux.
bcrypt
bcrypt est un algorithme de hachage de mot de passe conçu par Niels Provos et David Mazières. Il est largement utilisé dans de nombreux langages de programmation. Voici un exemple de valeur de hachage bcrypt :
Bien qu'il apparaisse comme une autre chaîne aléatoire, il contient des informations supplémentaires. Décortiquons-le :
- La première section
$2y
indique l'algorithme, qui est2y
. - La deuxième section
$12
indique le nombre d'itérations, qui est12
. Cela signifie que l'algorithme de hachage sera exécuté 212=4096 fois (itérations). - La troisième section
wNt7lt/xf8wRJgPU7kK2ju
est le sel. - La dernière section
GrirhHK4gdb0NiCRdsSoAxqQoNbiluu
est la valeur de hachage.
bcrypt a quelques limitations :
- La longueur maximale du mot de passe est de 72 octets.
- Le sel est limité à 16 octets.
- La valeur de hachage est limitée à 184 bits.
Argon2
Compte tenu des débats et des limitations des algorithmes de hachage de mots de passe existants, un concours de hachage de mots de passe a été organisé en 2015. Passons les détails, concentrons-nous sur le gagnant : Argon2.
Argon2 est un algorithme de hachage de mots de passe conçu par Alex Biryukov, Daniel Dinu et Dmitry Khovratovich. Il introduit plusieurs nouveaux concepts :
- De mémoire difficile : L'algorithme est conçu pour être difficile à paralléliser, rendant le force brutale avec les GPUs difficile.
- De temps difficile : L'algorithme est conçu pour être difficile à optimiser, rendant le force brutale avec les ASICs (circuits intégrés spécifiques à une application) difficile.
- Résistant aux attaques par canaux annexes : L'algorithme est conçu pour résister aux attaques par canaux annexes, comme les attaques de temporisation.
Il existe deux versions principales d'Argon2, Argon2i et Argon2d. Argon2i est le plus sûr contre les attaques par canaux annexes, tandis qu'Argon2d offre la plus grande résistance aux attaques de craquage par GPU.
-- Argon2
Voici un exemple d'une valeur de hachage Argon2 :
Décortiquons-le :
- La première section
$argon2i
indique l'algorithme, qui estargon2i
. - La deuxième section
$v=19
indique la version, qui est19
. - La troisième section
$m=16,t=2,p=1
indique le coût de la mémoire, le coût en temps et le degré de parallélisme, qui sont16
,2
, et1
. - La quatrième section
$YTZ5ZnpXRWN5SlpjMHBDRQ
est le sel. - La dernière section
$12oUmJ6xV5bIadzZHkuLTg
est la valeur de hachage.
Dans Argon2, la longueur maximale du mot de passe est de 232-1 octets, le sel est limité à 232-1 octets et la valeur de hachage est limitée à 232-1 octets. Cela devrait suffire pour la plupart des scénarios.
Argon2 est maintenant disponible dans de nombreux langages de programmation, comme node-argon2 pour Node.js et argon2-cffi pour Python.
Conclusion
Au fil des ans, les algorithmes de hachage de mots de passe ont connu une évolution significative. Nous devons beaucoup à la communauté de sécurité pour ses décennies d'efforts pour rendre Internet plus sûr. Grâce à leurs contributions, les développeurs peuvent prêter plus attention à la construction de meilleurs services sans se soucier de la sécurité du hachage des mots de passe. Même s'il est impossible d'atteindre une sécurité à 100% dans un système, nous pouvons employer diverses stratégies pour minimiser les risques associés.
Si vous souhaitez éviter les tracas de la mise en œuvre de l'authentification et de l'autorisation, n'hésitez pas à essayer Logto gratuitement. Nous fournissons des solutions sûres (nous utilisons Argon2!), fiables et évolutives, vous permettant de vous concentrer sur la construction de votre produit.