Comment puis-je mettre en œuvre le sel dans mon login pour les mots de passe?
Je veux mettre en œuvre un sel dans mon système de connexion mais je suis un peu confus sur la façon dont cela est censé fonctionner. Je ne comprends pas la logique derrière elle. Je comprends md5 est un algorithme et toutes les fonctions que j'ai rencontré semblent pour hacher le tout. Si c'est le cas, comment peut-on obtenir le mot de passe de retour pour la comparaison? Ma grande question est, comment est-saler un des utilisateurs de mot de passe plus sûr que juste le hachage du mot de passe? Si une base de données n'a jamais été compromise, le hachage, ainsi que le sel est à la base de données. N'est-ce pas tout ce qu'un hacker aurait besoin?
J'ai aussi trouvé un autre post ici sur ALORS, où un autre développeur a dit :
"Assurer votre sel et de l'algorithme sont
stockées séparément de la base de données"
Je voudrais stocker le sel dans la base de données. Est-ce vraiment un problème si je le fais?
Je suis à la recherche d'un peu d'aide pour comprendre comment cela fonctionne et quelles sont les meilleures pratiques pourrait être. Toute aide est grandement appréciée.
EDIT:
Je tiens à remercier tout le monde pour leurs réponses et les idées. Même si j'ai peut-être plus confus maintenant, il a certainement été une expérience d'apprentissage pour moi. Merci encore les gars.
- Bienvenue DONC. Grande première question.
- stackoverflow.com/questions/873403/net-impl-of-bcrypt
- Liés à lire: L'arc-en-ciel de la Table Est Mort
Vous devez vous connecter pour publier un commentaire.
Une fonction de hachage retourne toujours la même valeur pour la même chaîne d'entrée. Disons que mon utilisateur (Alice) a le mot de passe
secret
. Le hachagesecret
à l'aide demd5()
conduit à la suite de hachageÀ l'aide d'un dictionnaire (une liste de mots courants et mot de passe) ou l'un des différents sites que vous offrir ce service, l'attaquant (Mallory) peut facilement trouver le mot de passe est secret lorsqu'il voit dans son dictionnaire de
5ebe2294ecd0e0f08eab7690d2a6ee69 = secret
.Le processus de salage avant le hachage rend plus difficile d'utiliser une attaque par dictionnaire sans connaître votre sel. Considérez les points suivants:
L'résultant de hachage est maintenant
b58ad809eece17322de5024d79299f8a
mais Alice mot de passe est toujourssecret
. Maintenant, si Mallory obtient ses mains sur le salé de hachage, les chances sont qu'elle ne va pas trouver la réponse dans son dictionnaire. Si elle le fait, le dictionnaire lui donner la mauvaise réponse.Ne jamais stocker une statique de sel dans votre base de données. De préférence, les stocker avec votre configuration de l'application (qui d'ailleurs ne devrait pas être disponible sur le web).
Si vous allez utiliser une dynamique de sel, vous allez avoir besoin d'utiliser la base de données. Utiliser une valeur non nulle de la colonne de l'existant valide les données de votre sel (blowfish-chaîne cryptée de nom d'utilisateur basée sur un secret de la clé de chiffrement est généralement cryptographique sécurisé). Ne pas utiliser une colonne séparée pour le sel. Si vous ne pouvez pas utiliser une colonne existante, incorporer le sel dans la même colonne que votre hash. Par exemple, utiliser les 32 premiers caractères de votre 128-bits de sel, puis les 40 dernières pour votre 160 bits de hachage. La fonction suivante va générer un tel hash:
Si un intrus pénètre dans votre base de données en utilisant SQL injection, au moins les hachages il/elle récupère ne sera pas utile car il/elle n'aura pas accès à la configuration de votre application. Si votre serveur est enracinée, c'est assez beaucoup de jeu sur n'importe ce que vous faites.
Remarque: Il existe d'autres types d'attaques possibles sur
md5()
qui est pourquoi vous utilisez le plus sûr algorithme de hachage,sha1()
par exemple. Ou, mieux encore, utiliser la Portable PHP cadre de hachage de mot de passe, qui a été conçu avec la sécurité à l'esprit et est rétro-compatible avec pratiquement n'importe quel version de PHP.bcrypt
. Les dictionnaires n'existe pas pour elle aussi. Ils sont un peu moins disponible. Je suis désolé de le dire, des dictionnaires est une faiblesse qu'aucun algorithme de hachage peut résoudre. Si je ne peux pas casser votrebcrypt
de hachage assez de temps avec une machine, je vais obtenir un cluster. Si il n'est toujours pas assez rapide, je vais louer un bot net. Et vous ne savez pas combien de temps nous allons être en mesure de hachage unebcrypt
de hachage dans un an. Sa supposée de la sécurité à travers la lenteur est déjà cassé, j'ai peur.salt
.totally
jeu plus, à partir du code source, vous pouvez étudier toutes les injections et les pannes que vous pouvez effectuer, que DB reste assez protégés 🙂test.php
de l'0.1 distribution de phppass.test.php
sont ici: cvsweb.openwall.com/cgi/cvsweb.cgi/projects/phpass Le code-block n'est pas là. Donc, je maintiens ma demande initiale.Le point de sel est d'empêcher les attaquants d'amortir le coût d'une attaque en force brute sur l'ensemble des sites (ou, mieux encore, lors de l'utilisation d'un autre sel pour chaque utilisateur: tous les utilisateurs d'un site) à travers précalculées rainbow tables.
Avec la plaine de hachage, un attaquant peut calculer une telle table une fois (une très longue, coûteuse) et ensuite l'utiliser pour trouver rapidement les mots de passe pour n'importe quel site. Quand un site utilise un fixe, le sel, l'attaquant a pour calculer une nouvelle table spécialement pour ce site. Quand un site utilise une autre de sel pour chaque utilisateur, l'attaquant peut cesser de s'embêter avec "rainbow tables" - il va falloir que par la force brute de chaque mot séparément.
Stocker les sels séparément n'est pas nécessaire pour profiter de cet avantage. En théorie, il serait encore plus sûr, car elle permettrait de neutraliser la faiblesse de dictionnaire ou à court de mots de passe. Dans la pratique, il n'en vaut pas la peine avec car à la fin de la journée, vous avez besoin d'accéder à l'sels quelque part pour vérifier les mots de passe. Aussi, en essayant de les séparer conduirait à des systèmes plus complexes et les plus complexes, un système est, les plus de possibilités pour des trous de sécurité y sont.
Edit: Mes recommandations concrètes:
Oublier à l'aide de sels (en partie pour la raison que vous mentionnez), l'utilisation bcrypt à la place:
Pour une bonne explication, voir: http://codahale.com/how-to-safely-store-a-password/
bcrypt
est la meilleure façon d'aller jusqu'à preuve cassé. Tout algorithme de hachage, par la pure définition d'un algorithme de hachage, signifie une entrée = une sortie. La vitesse ne donne pas toute la sécurité (qui sait à quelle vitesse nous allons être capables de calculer en un an). Et si un ordinateur n'est pas suffisant pour forcer votrebcrypt
de hachage, eh bien, je vais lancer mon logiciel sur un flipper botnet pour obtenir le résultat. Mon point étant quebcrypt
n'est pas plus sécurisé que n'importe quel sel+hash autour.bcrypt
est unique par mot de passe de sel inclus dans la version finale de hachage. Il prend soin de tout, donc tout est correct avec elle.Autres réponses sont bonnes, donc je vais juste jeter dans un point de détail que personne n'a mentionné. Vous ne voulez pas utiliser le même sel pour chaque mot de passe parce qu'alors, si deux personnes ont le même mot de passe, ils ont le même hash. Est d'exposer des informations qu'un attaquant peut exploiter.
Vous pouvez utiliser le même sel pour chaque utilisateur, ainsi que Juraj est une bonne idée de combiner le mot de passe avec d'autres non-évolution des champs de base de données (propre à un utilisateur). Mais attention, car cette information est liée au mot de passe. Si vous étiez à hacher le nom d'utilisateur + mot de passe afin de garantir un hachage unique, vous ne seriez pas en mesure de changer le nom d'utilisateur sans créer un nouvel utilisateur et d'exiger d'eux pour définir un nouveau mot de passe.
Comme un exemple d'avoir un unique sel par l'utilisateur et de le ranger aux côtés du hachage de mot de passe, je vais souligner /etc/shadow sur votre système Linux.
Ici, le oL5TTZxL est le sel et RhfGUZSbFwQN6jnX5D.Ck/ est le hachage. La plaine de texte mot de passe est racine dans ce cas, et l'algorithme de hachage mon système est le MD5 BSD algorithme de mot de passe. (systèmes plus récents que le mien ont de meilleurs algorithmes de hachage)
Vous n'avez pas le mot de passe à des fins de comparaison. Vous chiffrer le mot de passe lors de leur tentative de connexion et de comparer la valeur stockée avec la nouvelle valeur chiffrée.
Comme vous l'avez mentionné, les algorithmes de hachage travailler qu'un seul sens (ou seulement si elles sont assez fortes :-D)
Pour votre question au sujet de salage, je vous recommande de le hachage d'un mot de passe avec un statique sel chaîne et certains dynamique de données à partir de la base de données, qui devrait pas changer après une fois créé
C'est un très sûr moyen de stocker des mots de passe, car même si la base de données est compromise, les hackers/crackers encore besoin pour obtenir votre statique de la chaîne de hachage et besoin de deviner comment vous avez appliqué tous les saler..
Par exemple, disons que vous avez un
users
tableau avec les colonnes:colonnes id et created_at après une fois rempli ne doit jamais être changé..
de sorte que lorsque vous le hachage du mot de passe utilisateur, vous pouvez le faire aussi simple que:
J'espère que cela aide 🙂 cheers
Hachage des mots de passe est destinée à conserver les mots de passe secret de votre propre administrateur(s).
1) de la tenue de texte en clair les mots de passe de votre base de données serait bien, à l'exception de vos mots de passe peut être utilisé par l'administrateur pour accéder à un autre système.
2) Vous pouvez utiliser un seul global de sel, qui est combiné avec des mots de passe (en ajoutant ou XORing) et ensuite de hachage pour le stockage dans la base de données. Mais qui est vulnérable à un administrateur malveillant ET un arc-en-ciel de table conçu pour que l'une de sel.
3) Vous pouvez avoir une sel pour chaque utilisateur: La base de données sera utilisée pour stocker le sel, et le hachage dérivé du mot de passe/le sel de la combinaison. Cela permettra d'éviter un arc-en-ciel de l'attaque, mais les attaques par force brute sera toujours possible.
4) Enfin, vous pouvez garder votre fonction de hachage d'un secret en utilisant une vitesse limitée de matériel de hachage solution.
Qui est aussi bon que vous pouvez faire. En raison de la nature humaine, les mots de passe ont un domaine limité et sont vulnérables à des attaques de force brute. Nous essayons d'empêcher les administrateurs de obtenir une prise de l'utilisateur mots de passe et ensuite de les utiliser sur d'autres systèmes, ils ne devraient pas avoir accès.
Quelques autres remarques:
a) Vous pouvez utiliser bcrypt sur le mot de passe/le sel de la combinaison de ralentir l'attaquant de l'attaque par force brute. Mais puisque nous sommes en supposant que les administrateurs, ils peuvent être patient.
b) Garder le sel séparé du hachage de mot de passe n'est pas une défense efficace, nous sommes en supposant que les administrateurs, après tout.
c) à l'Aide de données existantes comme un sel est un peu mieux, mais je doute que les données existantes comme beaucoup d'entropie aléatoires de sel.
Salage d'un utilisateur mot de passe est peut-être plus sûr que juste le hachage du mot de passe, car il peut protéger contre de précalcul des attaques.
Par exemple, si un pirate obtient l'accès à votre base de données, et les mots de passe ne sont pas salés, alors il peut aussi regarder la hachages dans sa base de données de hachages (voir http://en.wikipedia.org/wiki/Rainbow_table) pour obtenir les mots de passe d'origine.