Meilleures Pratiques: le Salage & parsemant les mots de passe?
Je suis tombé sur une discussion dans laquelle j'ai appris que ce que j'avais fait n'était pas en fait le salage des mots de passe, mais émaillant eux, et depuis, j'ai commencé à faire les deux avec une fonction comme:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Ignorant la choisi l'algorithme de hachage (je veux que ce soit une discussion de sels & poivrons et pas des algorithmes spécifiques, mais je suis en utilisant un sécurisée), est-ce une option sécuritaire, ou devrais-je faire quelque chose de différent? Pour ceux peu familiers avec les termes:
-
Un sel est généré de façon aléatoire une valeur habituellement stockés par la chaîne de caractères dans la base de données conçu pour rendre impossible l'utilisation des tables de hachage pour craquer des mots de passe. Que chaque mot a son propre sel, ils doivent tous être brute forcé individuellement afin de les casser; cependant, comme le sel est stocké dans la base de données avec le hash du mot de passe, une base de données de compromis, c'est perdre les deux.
-
Un poivre est un site statique de la valeur stockée séparément à partir de la base de données (généralement codé en dur dans l'application du code source) qui est destiné à être secret. Il est utilisé de sorte qu'un compromis de la base de données n'entraînerait pas la totalité de la demande du mot de passe de la table pour être brute forceable.
Est-ce que je suis en manque et c'est le salage & parsemant mon mots de passe de la meilleure option pour protéger mon de sécurité de l'utilisateur? Est-il un potentiel d'une faille de sécurité à le faire de cette façon?
Remarque: Supposons pour les besoins de la discussion que l'application & base de données sont stockés sur des machines distinctes, ne pas partager les mots de passe etc. donc une violation du serveur de base de données ne signifie pas automatiquement une violation de l'application serveur.
- Pas tout à fait un doublon, mais très liés: stackoverflow.com/questions/16594613/...
- Cross site en double: security.stackexchange.com/q/3272/2113
Vous devez vous connecter pour publier un commentaire.
Ok. Vu que j'ai besoin d'écrire à propos de ce plus et plus, je vais faire une dernière réponse canonique sur le poivre seul.
L'Apparente À L'Envers De Poivrons
Il semble assez évident que les poivrons doivent faire les fonctions de hachage plus sûr. Je veux dire, si l'attaquant obtient seulement votre base de données, puis de vos utilisateurs, les mots de passe doivent être sécurisés, droit? Semble logique, non?
C'est pourquoi beaucoup de gens croient que les poivrons sont une bonne idée. Il "a du sens".
La Réalité De Poivrons
Dans la sécurité et la cryptographie royaumes, "faire sens" n'est pas suffisant. Quelque chose doit être prouvé et faire sens pour être considéré comme sûr. En outre, il a à être mises en œuvre dans un maintenable façon. Le système le plus sécurisé qui ne peut pas être maintenue est considéré comme dangereux (parce que si une partie quelconque de la sécurité tombe en panne, l'ensemble du système tombe à l'eau).
Et les poivrons fit ni prouvable ou la maintenable modèles...
Problèmes Théoriques Avec Des Poivrons
Maintenant que nous avons mis en scène, regardons quel est le problème avec les poivrons.
Nourrir un hachage dans un autre peut être dangereux.
Dans votre exemple, vous ne
hash_function($salt . hash_function($pepper . $password))
.Par expérience, nous savons que "l'alimentation" un résultat du hachage dans une autre fonction de hachage peut diminuer l'ensemble de la sécurité. La raison en est que les deux fonctions de hachage peut devenir une cible de l'attaque.
C'est pourquoi les algorithmes comme PBKDF2 utilisation d'opérations spéciales pour les combiner hmac (dans ce cas).
Le point est, que même si elle n'est pas une grosse affaire, il n'est également pas une chose banale pour simplement jeter autour. Crypto systèmes sont conçus pour éviter les "doit travailler" cas, et plutôt se concentrer sur la "conçu pour fonctionner des" cas.
Même si cela peut sembler purement théorique, il est en fait pas. Par exemple, Bcrypt ne peut pas accepter l'arbitraire des mots de passe. Donc, en passant
bcrypt(hash(pw), salt)
peut en effet entraîner dans une mesure plus faible de hachage quebcrypt(pw, salt)
sihash()
renvoie une chaîne binaire.De Travail À L'Encontre De La Conception
La façon bcrypt (mot de passe et d'autres algorithmes de hachage) ont été conçues pour fonctionner avec du sel. Le concept de poivre n'a jamais été lancée. Cela peut sembler une banalité, mais il ne l'est pas. La raison en est que le sel n'est pas un secret. C'est juste une valeur qui peut être connu à un attaquant. Un poivre d'autre part, par la définition même de chiffrement secret.
Le mot de passe actuel algorithmes de hachage (bcrypt, pbkdf2, etc) tous sont conçus pour seulement prendre une valeur secrète (le mot de passe). L'ajout d'un autre secret dans l'algorithme n'a pas été étudié à tous.
Qui ne signifie pas qu'il n'est pas sûr. Cela signifie que nous ne savons pas si c'est sûr. Et la recommandation générale avec la sécurité et la cryptographie, c'est que si nous ne savons pas, il ne l'est pas.
Donc, jusqu'à ce que les algorithmes sont conçus et approuvés par les cryptographes pour une utilisation avec le secret des valeurs (poivrons), les algorithmes actuels ne doit pas être utilisé avec eux.
La Complexité Est L'Ennemi De La Sécurité
Croyez le ou non, La Complexité Est L'Ennemi De La Sécurité. Faire un algorithme qui semble complexe peut être sécurisé, ou il peut ne pas l'être. Mais les chances sont tout à fait significatif qu'il n'est pas sécurisé.
Des Problèmes Importants Avec Les Poivrons
Il n'est Pas facile à gérer
Votre mise en œuvre de poivrons s'oppose à la possibilité de tourner le poivre clé. Depuis le poivre est utilisé à l'entrée, à la manière d'une fonction, vous pouvez ne jamais modifier le poivre pour la durée de vie de la valeur. Cela signifie que vous aurez besoin de venir avec un peu bancale hacks pour l'obtenir à l'appui de rotation de la clé.
C'est extrêmement important comme il est requis à chaque fois que vous stockez des secrets cryptographiques. N'ayant pas de mécanisme pour faire tourner les touches (périodiquement, et après une rupture) est une énorme faille de sécurité.
Et le poivre approche serait d'exiger que chaque utilisateur soit d'avoir leur mot de passe complètement invalidé par une rotation, ou attendre jusqu'à leur prochaine connexion à tourner (qui peut-être jamais)...
Qui rend fondamentalement votre approche immédiate d'un no-go.
Il Vous Oblige À Rouler Votre Propre Crypto
Depuis pas de cours d'algorithme prend en charge le concept de poivre, elle exige que l'on soit pour composer des algorithmes ou d'inventer de nouveaux à l'appui de poivre. Et si vous ne pouvez immédiatement voir pourquoi c'est vraiment une mauvaise chose:
JAMAIS rouler votre propre crypto...
La Meilleure Façon De
Donc, sur tous les problèmes décrits ci-dessus, il y a deux façons de gérer la situation.
Suffit D'Utiliser Les Algorithmes Qu'Ils Existent
Si vous utilisez bcrypt ou scrypt correctement (avec un coût élevé), tous les, mais le plus faible dictionnaire de mots de passe doivent être statistiquement coffre-fort. Le record actuel pour le hachage bcrypt au coût de 5 est 71k hachages par seconde. À ce rythme, même un 6 caractère aléatoire de mot de passe prendre des années à se fissurer. Et compte tenu de mon minimale recommandée coût est de 10, ce qui réduit les hash par seconde par un facteur de 32. Donc, nous serions en train de seulement environ 2200 hachages par seconde. A ce rythme, la même certains de dictionnaire des phrases ou des modificaitons peuvent être sûrs.
En outre, nous devrions être à la vérification de ces faibles classes de mots de passe à la porte et ne pas leur permettre de. Comme le craquage de mot de passe devient de plus en plus avancé, donc si le mot de passe exigences de qualité. C'est encore une statistique de jeu, mais avec une bonne technique de stockage, et des mots de passe forts, tout le monde devrait être pratiquement très fort...
Chiffrer La Sortie De Hachage Avant Le Stockage
Il existe dans le domaine de la sécurité d'un algorithme conçu pour gérer tout ce que nous avons dit ci-dessus. C'est un algorithme de chiffrement par bloc. Il est bon, parce que c'est réversible, de sorte que nous pouvons faire pivoter les touches (yay!!! la maintenabilité!). C'est bien parce qu'ils sont utilisés comme prévu. C'est bien car il donne à l'utilisateur aucune information.
Voyons que la ligne à nouveau. Disons qu'un attaquant connaît votre algorithme (qui est nécessaire pour la sécurité, sinon c'est la sécurité par l'obscurité). Avec un traditionnel poivre approche, l'attaquant peut créer une sentinelle mot de passe, et comme il sait le sel et la sortie, il peut la force brute du poivre. Ok, c'est un long shot, mais c'est possible. Avec un algorithme de chiffrement, l'attaquant n'obtient rien. Et puisque le sel est aléatoire, une sentinelle mot de passe n'est pas à même de l'aider. De sorte que le meilleur de ce qu'il reste, c'est l'attaque de la forme cryptée. Ce qui signifie qu'ils ont d'abord attaquer votre hachage chiffré pour récupérer la clé de chiffrement, puis attaque les tables de hachage. Mais il y a un beaucoup de la recherche dans l'attaque d'algorithmes, nous avons donc besoin de s'appuyer sur cela.
TL/DR
De ne pas utiliser des poivrons. Il ya une foule de problèmes avec eux, et qu'il existe de meilleures manières: ne pas utiliser n'importe quel serveur-côté secret (oui, c'est ok) et le cryptage de la sortie de hachage à l'aide d'un algorithme de chiffrement par bloc avant le stockage.
hash_function
avait qu'une seule entrée et de Suhosin en a parlé comme d'une sécurité de fonction de hachage, ce qui implique quelque chose comme Sha256. Et pour la fonction de hachage sûre onewayness est un but explicite. Vous n'obtiendrez pas une réduction formelle de la preuve, mais il est absurde de croire que les$password |-> hash_function($salt.hash_function($pepper.$password))
serait moins univoques quepassword |-> hash_function($salt.$password)
. Et, se référant à l'autorité, de la Cryptographie Ingénierie conseille l'utilisation de l'Sha256(Sha256(m)) au lieu d'une seule application pour contrer la longueur de l'extension de la propriété.password_hash
a bien moins de complexité que d'utiliser une bibliothèque comme mcrypt pour crypter le mot de passe par la suite.Fist nous devrions parler de la exact de l'avantage de poivre:
Un scénario typique serait d'injection de code SQL, jeté les sauvegardes, les serveurs... Ces situations ne sont pas aussi rare que cela puisse paraître, et souvent pas sous votre contrôle (serveur d'hébergement). Si vous utilisez...
...des mots de passe forts sont bien protégés. Il est presque impossible de brute forcer un mot de passe fort dans ces conditions, même lorsque le sel est connu. Le problème ce sont les mots de passe faibles, qui font partie d'une force brute dictionnaire ou dérivent d'entre eux. Une attaque par dictionnaire qui va révéler ces très rapide, parce que vous ne tester que la plupart des mots de passe communs.
La deuxième question est comment appliquer le poivre ?
Souvent recommandé d'appliquer un poivron, est de combiner le mot de passe et le poivre, avant de la transmettre à la fonction de hachage:
Il y a un autre encore mieux si:
Cela permet non seulement d'ajouter un serveur côté secret, il permet aussi d'échanger des dollars serverSideKey, si cela devait être nécessaire. Cette méthode implique un peu plus de travail, mais si le code existe (bibliothèque) il n'y a aucune raison de ne pas l'utiliser.
AES_ENCRYPT($passwordHash, $serverSideKey)
appel aussi être un moyen approprié de mise en œuvre?Le point de sel et de poivre est d'augmenter le coût d'un pré-calculé de recherche de mot de passe, appelé un arc-en-ciel de la table.
En général en essayant de trouver une collision pour une seule valeur de hachage est dur (en supposant que la valeur de hachage est sécurisé). Cependant, à court de tables de hachage, il est possible d'utiliser l'ordinateur pour générer tous les possible de hachages dans une recherche sur un disque dur. Cela s'appelle un arc-en-ciel de la Table. Si vous créez une table arc-en-ciel que vous pouvez ensuite aller dans le monde et de trouver rapidement plausable mots de passe pour tout (non salées unpeppered) de hachage.
Le point de poivre est de faire de l'arc-en-ciel table ont besoin de pirater votre mot de passe unique de la liste. Donc perdre plus de temps sur l'attaquant pour construire l'arc-en-ciel de la table.
Le point de la le sel, cependant, est de faire de l'arc-en-ciel de la table pour chaque utilisateur doit être unique pour l'utilisateur, ce qui augmente encore la complexité de l'attaque.
Vraiment le point de la sécurité informatique n'est presque jamais à le faire (mathématiquement) impossible, juste mathématiquement et physiquement impossible (par exemple dans des systèmes sécurisés il faudrait tout l'entropie dans l'univers (et plus) pour calculer un unique mot de passe utilisateur).
root
sur notre serveur de base de données, vous n'avez toujours pas accès à notre serveur d'application), qui en cachant de poivre dans le code source (dans notre fichier de config) serait de fournir une sécurité supplémentaire.Ne pouvez pas voir le stockage d'une valeur codée en dur dans votre code source comme ayant toute sécurité pertinence. C'est la sécurité par l'obscurité.
Si un hacker acquiert de votre base de données, il sera en mesure de commencer brute forcer les mots de passe utilisateur. Il ne faudra pas longtemps pour que hacker pour identifier votre poivre si il parvient à casser un peu les mots de passe.
md5($pepper.$password)
(note: je ne sais pas utiliser MD5 sur un site, c'est pour les fins de l'exemple), mon mot de passe estcat
, mon hachage est2d1ec2609e8265e64f2dbf6a697ebbfe
. Qu'est-ce que mon poivre? Au mieux ici, tout ce que vous pouvez faire est d'essayer de "force brute" ma (typiquement de 64 caractères) de poivre.