La persistance des mots de passe au sein d'une application se fait généralement via une base de données, ou une base d'annuaire LDAP.
Ce stockage doit être réalisé de manière sécurisée. En effet, en cas de compromission de cette base (si elle a été récupérée ou rendue publique par un attaquant), les mots de passe seront directement révélés s’ils sont stockés en clair, ou s'il sont insuffisamment protégés.
L'accès à la base de données doit bien évidemment être sécurisé :
Cette sécurisation est insuffisante et peut ne pas empêcher l'accès aux données (mots de passe).
En effet, les principales failles viennent de l'application en elle même, à partir d'utilisateurs authentifiés, de manière régulière, ou avec usurpation :
La sécurisation du système de stockage doit donc s'accompagner d'une méthode de sécurisation des données sensibles, au cas ou le premier rempart de protection aurait sombré ou aurait été contourné (principe de défense en profondeur).
Principe :
Le chiffrement (cryptage) est réversible : une données chiffrée peut être remise en clair (décryptage).
Il se base sur deux éléments : l’algorithme et la clé.
L’algorithme est un ensemble de règles qui détermine le mode de chiffrement. La clé permet de déterminer la configuration du chiffrement. Pour déchiffrer, il faut connaître l'algorithme et la clé (en case de chiffrement symétrique : 1 seule clé).
Le chiffrement de mots de passe n'est pas sécurisé, dans la mesure où :
Pour les autres données (autres que le mot de passe) qui nécessite une sécurisation, le chiffrement est une bonne solution.
Le hachage est un procédé qui utilise un algorithme pour convertir du texte en clair en valeurs numériques :
son inversion est impossible la forme hachée est appelée empreinte Deux textes identiques produisent la même empreinte Avec stockage de l'empreinte du mot de passe, le mécanisme d'authentification est le suivant :
Réception du mot de passe à tester Hachage de ce mot de passe Comparaison avec l'empreinte stockée en base Si les 2 mots de passe sont identiques sous leur forme hachée, le mot de passe est bon.
MD5 : Message-Digest Algorithm 5 SHA : Secure Hash Algorithm (sha1 (déprécié), sha-256, sha-384, sha-512) Argon2 (memory hard) bcrypt (avec sel, basé sur Blowfish)
Vétusté de certains algorithmes :
Exemple :
possibles collisions avec MD5 : 2 mots différents produisent la même empreinte Rainbow tables : Tables de correspondance entre mots et empreintes (consultables sur internet) Comparaison possible des hashs et déduction si toute la base est accédée
Pour contrer les deux failles précédentes, la solution est d'ajouter une chaîne (grain de sel), de préférence aléatoire, au mot de passe avant de le hacher.
Le même mot de passe ne produit plus jamais la même empreinte, mais comme la chaîne utilisée comme sel est accessible au programme, on peut toujours hacher un mot de passe fourni pour le comparer au mot de passe stocké.
Il est recommandé d’utiliser un sel choisi aléatoirement pour chaque compte et d’une longueur d’au moins 128 bits. Utiliser une fonction de dérivation de mots de passe memory-hard pour pénaliser les attaques par force brute.