J'ai trouvé cela Présentation Comment Facebook stocke les mots de passe des clients et comment ils font l'authentification.
Cette diapositive montre comment ils ont des mots de passe hachés:
Est-ce une bonne idée de faire de telles opérations avec un mot de passe cru? N'est-il pas "Sécurité par obscurité"? A le sens de faire de telles opérations avec PBKDF2
Comme nous allons utiliser?
Dans l'un des commentaires que vous avez écrites:
Je demande si quelque chose comme ça a du sens maintenant en 2018. Nous allons utiliser PBKDF2 HMAC-SHA-256 avec 8 octets Sel, nous discutons de ce que le schéma de hachage utilise.
La réponse à cela est non. La seule partie qui devrait être reproduite à partir de la solution Facebook utilise une fonction de mémoire-mémoire et la poivrée de cryptoService. Les MD5
et HMAC
pièces ne pas ajouter à la sécurité. (Ils sont assez inoffensifs cependant.)
Vous ne devriez pas utiliser PBKDF2. Pour que vous préférez préférer:
Quant à savoir si la méthode Facebook est une sécurité par obscurité. Non, mais la partie HMAC et probablement la partie MD5 sont redondantes. La partie cryptoservice
utilise probablement un HSM. Cela devrait permettre que le mot de passe soit crypté/déchiffré sans exposer nécessairement la clé de cryptage sur le type de pirates informatiques pouvant voler une base de données de mot de passe-hachage. L'utilisation d'algorithmes de cryptage traditionnels avec une clé secrète ne compte pas comme obscurité. Le mot de passe doit encore être Hashed au cas où la clé est jamais divulguée. C'est ce que le scrypt est pour, mais maintenant argon2 devrait être préféré.
EDIT: Voir les commentaires. Comme présenté dans la diapositive, le mot de passe n'est pas crypté. Le HMAC est d'une manière, tout comme le hachage. L'alternative du cryptage après hachage est utile car elle permet de remplacer la clé. Les utilisateurs doivent entrer leur mot de passe si vous modifiez la clé avec cette configuration Facebook, en plus des paramètres de sel ou de scrypte. Si vous chiffrez le hash, vous pouvez déchiffrer et re-chiffrer sans demander à l'utilisateur de saisir leur mot de passe. (Si votre clé est jamais divulguée ... mais vous ne pouvez pas refaire un mot de passe sans l'original.)
Utilisez également 20 octets de sel. Ou au moins 16.
Cette construction "oignon" peut être dangereuse et ne devrait être faite que si vous avez suffisamment de critiques, il ajoute toutefois plusieurs propriétés favorables par rapport au hachage simple:
Le premier MD5 non salé peut être effectué par des clients ou des serveurs frontaux. Il normalise Charset et Longueur et obtient des mots de passe tôt sans être trop intensif de la CPU.
Le sel est lu dans la base de données de l'utilisateur, de sorte qu'il n'est pas présent sur le client, ceci est le premier ajoute HMAC.
Le service Crypto (ou meilleur HSM) défend contre la force brute (comme la clé secrète n'est pas connue). En fait, cela prédit les recommandations du Nist à faire exactement cela. Cette poivrée n'est pas souvent faite car elle nécessite une configuration système compliquée (HSM ou Isolation de processus) - quelque chose que Facebook peut se permettre.
Étant donné que l'étape de poivre pourrait être compromise par des initiés, les données sont ensuite transmises au SCRYPT, une fonction conçue pour effectuer des tests de force brute de mots de passe plus chers.
L'étape finale pourrait ne pas être nécessaire, ou peut-être qu'il est utilisé pour ajouter une certaine diversification (SHA2 au lieu de SHA1).
Il ressemble un peu à l'huile de serpent en avant, mais les étapes peuvent être expliquées raisonnables. Si vous le comparez à la (beaucoup plus faible) GLIBC-SHA2 VOODOOO, il est vraiment propre.
BTW1: L'authentificateur mémorable est généralement une mauvaise chose, de tels schémas ne peuvent réduire que le risque de les manipuler.
BTW2: La faiblesse de la collision de SHA1 ne s'applique pas aux constructions HMAC et la taille de hachage de MD5 courte ne fait pas mal d'ici (car les mots de passe ont presque toujours moins d'entropie). Ce serait plus risqué pour la dérivation principale, mais ce n'est pas la tâche à accomplir.