Utilisez toujours un algorithme de hachage de mot de passe: Argon2 , scrypt , bcrypt ou PBKDF2 .
Argon2 a remporté le concours de hachage de mot de passe 2015. Scrypt , bcrypt et PBKDF2 sont des algorithmes plus anciens qui sont considérés comme moins préférés maintenant, mais toujours fondamentalement solides, donc si votre plate-forme ne prend pas encore en charge Argon2, il est acceptable d'utiliser un autre algorithme pour l'instant.
Ne stockez jamais un mot de passe directement dans une base de données. Ne le cryptez pas non plus: sinon, si votre site est piraté, l'attaquant obtient la clé de décryptage et peut donc obtenir tous les mots de passe. Les mots de passe DOIVENT être hachés .
Un hachage de mot de passe a des propriétés différentes d'un hachage de table de hachage ou d'un hachage cryptographique. N'utilisez jamais un hachage cryptographique ordinaire tel que MD5, SHA-256 ou SHA-512 sur un mot de passe. Un algorithme de hachage de mot de passe utilise un sel , qui est unique (non utilisé pour un autre utilisateur ou dans la base de données de quelqu'un d'autre). Le sel est nécessaire pour que les attaquants ne puissent pas simplement pré-calculer les hachages des mots de passe courants: avec un sel, ils doivent recommencer le calcul pour chaque compte. Un algorithme de hachage de mot de passe est intrinsèquement lent - aussi lent que possible. La lenteur blesse beaucoup plus l'attaquant que vous car l'attaquant doit essayer de nombreux mots de passe différents. Pour plus d'informations, consultez Comment hacher en toute sécurité les mots de passe .
Un hachage de mot de passe code quatre informations:
- Un indicateur de l'algorithme utilisé. Cela est nécessaire pour l' agilité : les recommandations cryptographiques changent avec le temps. Vous devez pouvoir passer à un nouvel algorithme.
- Un indicateur de difficulté ou de dureté. Plus cette valeur est élevée, plus le calcul est nécessaire pour calculer le hachage. Cela devrait être une valeur de configuration constante ou globale dans la fonction de changement de mot de passe, mais elle devrait augmenter avec le temps à mesure que les ordinateurs s'accélèrent, vous devez donc vous souvenir de la valeur de chaque compte. Certains algorithmes ont une seule valeur numérique, d'autres y ont plus de paramètres (par exemple pour régler séparément l'utilisation du CPU et l'utilisation de la RAM).
- Le sel. Étant donné que le sel doit être unique au monde, il doit être stocké pour chaque compte. Le sel doit être généré de manière aléatoire à chaque changement de mot de passe.
- Le hachage proprement dit, c'est-à-dire la sortie du calcul mathématique dans l'algorithme de hachage.
De nombreuses bibliothèques incluent une fonction de paire qui regroupe commodément ces informations en une seule chaîne: une qui prend l'indicateur d'algorithme, l'indicateur de dureté et le mot de passe, génère un sel aléatoire et renvoie la chaîne de hachage complète; et celui qui prend un mot de passe et la chaîne de hachage complète comme entrée et renvoie un booléen indiquant si le mot de passe était correct. Il n'y a pas de norme universelle, mais un codage commun est
$ algorithme $ paramètres $ sel $ sortie
où algorithm
est un nombre ou une chaîne alphanumérique courte codant le choix de l'algorithme, parameters
est une chaîne imprimable et salt
et output
sont codés en Base64 sans se terminer =
.
16 octets suffisent pour le sel et la sortie. (Voir par exemple les recommandations pour Argon2 .) Encodé en Base64, c'est 21 caractères chacun. Les deux autres parties dépendent de l'algorithme et des paramètres, mais 20 à 40 caractères sont typiques. Cela représente un total d' environ 82 caractères ASCII ( CHAR(82)
, et pas besoin d'Unicode), auxquels vous devez ajouter une marge de sécurité si vous pensez qu'il sera difficile d'agrandir le champ plus tard.
Si vous codez le hachage dans un format binaire, vous pouvez le réduire à 1 octet pour l'algorithme, 1 à 4 octets pour la dureté (si vous codez en dur certains des paramètres) et 16 octets chacun pour le sel et la sortie , pour un total de 37 octets. Disons 40 octets ( BINARY(40)
) pour avoir au moins deux octets de rechange. Notez qu'il s'agit d'octets 8 bits, pas de caractères imprimables, en particulier le champ peut inclure des octets nuls.
Notez que la longueur du hachage est complètement indépendante de la longueur du mot de passe.