Système utilisateur et mots de passe: Je regardais via des trucs MD5, et je me demande quelle est la pratique normale / bonne pratique des mots de passe. En ce moment, je pense que les gens supercryptent les mots de passe et stockent les hachages. Si oui, comment vérifie le mot de passe fonctionne? Je n'ai que le mot de passe d'entrée passe à nouveau sur le processus de cryptage, puis vérifiez le hachage avec celui stocké, correct? P>
Cette question peut contredire ce qui précède, mais si mon sel devait-il être une valeur générée au hasard? Si oui, quand peut-il être utile? P>
EDIT: strong> autres que les mots de passe, dans un système utilisateur, que doivent être cryptés comme une bonne pratique? Crypyt-ils des noms d'utilisateur ou autre chose? P>
11 Réponses :
"correct?"
Si vous avez besoin d'une réponse binaire: p>
Une réponse binaire n'est pas si mauvaise!
Vous devez stocker un hachage de votre mot de passe au lieu de la chaîne lisible réelle, envisagez également d'utiliser "Salting" pour plus de sécurité P>
Tout d'abord, vous créez un sel.
Les exemples de note sont écrits en php em> p> sel le mot de passe p> 1000 in 0.468002796173 XOR
1000 in 0.465842008591 XOR
1000 in 0.466115951538 XOR
1000 in 0.498080968857 CAT
1000 in 0.506876945496 CAT
1000 in 0.500174045563 CAT
Le salage puis la conservation du sel de la base de données ne peut pas vraiment aider - quelqu'un pourrait facilement trouver le sel et i> le hachage s'ils devaient obtenir un accès à la base de données. Dans mon expérience, la meilleure façon de le faire est de seler le mot de passe à l'aide d'une combinaison d'autres informations sur l'utilisateur qui ne peut pas changer (leur clé primaire, leur nom d'utilisateur, etc.), de sorte que le mot de passe soit salé mais que quelqu'un gagne db L'accès ne saurait pas comment.
Que signifie la carotte ^ code>?
@Doug: C'est un xor code> Opérateur bitwise.
@1crediiman: Vous appelez cela expérience i>, je l'appelle Sécurité par Obscurity i>. Stocker le sel n'est pas un problème, car son objectif est d'aider contre les attaques de hachage pré-calculées. Pour une base de données fissurée (où l'attaquant obtient Hash + Sel), vous comptez sur la sécurité de votre algorithme.
@1crediiman: True, mais à moins d'avoir accès au code, ils devraient savoir comment j'utilise le sel. En plus de cela, ils auraient toujours besoin d'un accès au mot de passe - qu'ils n'ont toujours pas. Si vous avez utilisé la clé principale, ils auraient également accès à cela.
Je pensais qu'un sel était utilisé comme mis à part le processus de cryptage pour créer un hachage et pas seulement collé juste derrière le hachage?
@Doug: Il est utilisé dans le processus hachage i> pour créer un hachage. Vous avez besoin du sel pour dériver le hachage, c'est pourquoi vous le stockez.
@JOSH K: Ceci est un peu sur-le-dessus: $ hachage = sha1 (sha1 ($ mot de passe) ^ $ sel); code>,
$ hash = sel ($ mot de passe. $ Sel ); code> fonctionnerait aussi bien dans la pratique (et plus rapide). En outre, la seule raison pour laquelle je puisse penser à
SHA1 (Microtime (Microtime ()) CODE> est de le contraindre à quelque chose qui peut s'adapter à votre colonne et
SUBSTR (STR (Microtime ()), 0 , 160) code> fonctionnerait également bien (et plus vite), bien que je doute
microtime () code> donne un numéro de> 160 chiffres quand même. Bien sûr, vous risquez d'être intentionnellement ralentissement (il faudrait donc plus de temps pour craquer), mais la performance devrait au moins être mentionnée.
@Brendan: la performance est négligeable. Vraiment. Microtime ne revient pas plus de 160 caractères, ajoutant le sous-truissant / STR est inutile. xor code> est une opération cohérente. En fait, je suis allé jusqu'à courir un test rapide sur cette i> lien et le fonctionnement code> XOR code> est plus rapide. Accordé non par beaucoup (0,04 sec pour 100 000 hachages i>), mais plus vite. Je vous invite à essayer ceci vous-même.
@Brenden: viens y penser que je dois remettre en question quelqu'un qui pense que jouer trois opérations de chaîne distinctes i> ( substr code>,
str code>,
,
. code>) est plus rapide qu'un opérateur bitwise. C'est tout simplement stupide.
Quelqu'un peut-il commenter toutes les différences de sécurité entre l'ajout / préparé votre sel au secret et le xor du sel avec le secret?
@Josh k, je ne voulais pas dire l'opérateur bitwise, c'est évidemment plus rapide. Je voulais dire comment tu hachage le mot de passe et le sel, puis les hachage à nouveau. Je viens d'utiliser l'opérateur de concaténation à chaîne parce que je n'ai pas d'indice ce que xor code> une chaîne et un int ferait. Quant à la performance, faire un
substr code>,
str code>,
. Code> est beaucoup plus rapide que
SHA1 () code>, et comme vous mentionné, le
substr () code> et
str () code> ne sont pas vraiment nécessaires. J'ai donné cela comme un exemple d'un moyen beaucoup plus rapide d'installer le nombre dans un espace spécifique (bien que j'ai réalisé après que vous voudriez tronquer le début, pas la fin).
@Frank Farmer: Il n'y a probablement aucune différence pratique. Je viens d'utiliser la concaténation parce que l'idée de xor code> une chaîne n'a aucun sens pour moi. Ce que mon commentaire était sur la hausse du mot de passe et du sel deux fois, ce qui n'est pas nécessaire (à moins que vous ne vouliez que le hachage soit plus lent, ce qui est parfois utile).
-1 Comme vos réponses aux deux modifications sont incorrectes; Un HASH cryptographique n'est pas identique à un Général HASH (Donc, pour notre contexte, multiplier par 10 est pas i> un hash). Les hachages cryptographiques doivent être (entre autres) Compulissement d'une manière circurée - ce n'est pas le Identique que le Définition mathématique d'un sens.
Un hachage ne peut jamais été inversé! Si vous souhaitez récupérer la valeur d'origine, vous devez bruteforcer. Voir un haché comme une estimation unique pour l'entrée donnée. (Il y a plus d'une entrée possible pour la même session (HASH)).
@VDV: Je n'ai jamais dit qu'un hasch peut être inversé.
@Blueraja: Pardonne-moi de faire tomber la définition d'un hachage cryptographique.
@Brendan: Je veux une petite taille de la colonne tout encore que le sel est disponible pour que je puisse leur rendre unique. Si vous souhaitez chicaner sur les performances, vous prenez en train de stocker une chaîne (et non de la hacher) et de stocker le hasch qui vous convient. 100000 hachages en une demi-seconde (et qui appelle SHA1 () code> trois fois par hasard). Il n'y a pas de problème de performance.
@Frank Farmer: Il n'y a pas de différence. Je préfère simplement xor code>.
@JOSH K, vous manquez complètement mon point. Hachage plusieurs fois n'est pas seulement deux fois plus lent, c'est aussi inutile. Vous avez peut-être raison de dire que la performance n'est pas une préoccupation, mais pourquoi les gaspiller des cycles du processeur lorsque la manière plus simple est également plus rapide? De plus, tout en écrivant une référence rapide pour montrer cela, j'ai réalisé que microtime () code> n'est pas le meilleur moyen de le faire. En utilisant
$ sel = rand (0, 4294967295); code> est 3x plus rapide, 40x moins d'espace (4 octets
non signé INT code> vs 160 octet
Char code>), Et tout aussi bien (puisque le sel n'a pas besoin d'être cryptographiquement de toute façon). Exemple: Pastebin.com/ryjabwt0
Tout ce que cela se passe sur ce qui est plus rapide ... En ce qui concerne le hachage de mot de passe, lent est meilleur. Un algorithme de hachage lent signifie une attaque de force brute prend beaucoup plus de temps à accomplir.
@keithJgrant: incorrect. Ce n'est que si ils savent comment les hachages sont créés, bien que vous puissiez supposer qu'ils le font.
La pratique standard avec les mots de passe consiste à ne pas stocker le mot de passe d'origine n'importe où. Les mots de passe UNIX utilisés pour être cryptés avec «crypt» qui utiliseraient un sel aléatoire. Le sel lui-même a été stocké dans les deux premiers caractères du mot de passe crypté. Lorsque l'utilisateur entrait son mot de passe, le système utiliserait les deux caractères du mot de passe crypté en tant que sel pour chiffrer le mot de passe saisi et si le résultat crypté était identique au mot de passe crypté stocké, c'était une correspondance. Des choses similaires peuvent être faites avec des mots de passe MD5. P>
C'est pourquoi de bons sites ne vous enverront jamais votre mot de passe, mais aussi réinitialiser votre mot de passe à une valeur unique unique - car ils ne connaissent pas votre mot de passe. P>
Pour développer cela un peu: un hachage de MD5 est une fonction à sens unique - si vous utilisez la même valeur que vous obtenez le même hachage, mais vous ne pouvez pas prendre le hachage et la transformer en valeur. Il y a une petite chance mais finie que deux valeurs produiront le même hachage (la chance devient plus grande que les chaînes initiales sont plus grandes ou plus le hachage est), mais ils choisissent les algorithmes de hachage pour faire des chances que deux cordes choisissent comme les mots de passe hachaud à la même valeur presque infinitésimal. Vous pouvez penser à un hasch à sens unique comme une grille de viande - vous pouvez regarder la viande qui sort de votre meuleuse de viande et voyez si c'est une vache, un agneau ou un cochon, mais vous ne pouvez pas passer à travers l'inverse et récupérer une vache. p>
À cause de cela, personne ne peut récupérer votre mot de passe car il n'est jamais stocké nulle part sur son système, seulement un hasch de celui-ci. P>
Pourriez-vous perdre plus de lumière sur cette dernière partie de ne jamais vous envoyer votre mot de passe?
@Doug: Ne jamais envoyer par e-mail signifie "jamais envoyer un email". N'envoyez pas un mot de passe et des informations d'identification de l'utilisateur. De nombreux endroits envoient des mots de passe par courrier électronique, ce qui est une mauvaise chose.
@ S.Lott: Ce n'est pas vraiment ce que je demandais. J'ai compris la partie "Never e-mailing de votre mot de passe", mais comment allez-vous "réinitialiser votre mot de passe à une seule valeur unique"?
D'accord, c'est ce que je pense. S'ils demandent une réinitialisation de mot de passe, je voudrais simplement créer une valeur aléatoire (avec @ $! Symboles) et transmettez-la via le processus de cryptage pour stocker le hachage, puis envoyez-leur la valeur aléatoire pour eux pour vous connecter et modifier leur mot de passe?
@Doug, cela fonctionnerait certainement, bien que vous deviez probablement utiliser un autre système d'authentification (comme une question de sécurité) avant de réinitialiser le mot de passe au cas où quelqu'un a été détourné de leur email. Les questions de sécurité ne sont pas aussi sécurisées que les banques semblent penser qu'elles sont, mais nous n'avons pas vraiment beaucoup mieux.
Il existe de nombreuses variantes sur ce thème. P>
Pour de bonnes informations, veuillez lire ceci: http://fr.wikipedia.org/wiki/digest_access_authentication . P>
Ensuite, lisez ceci: https://www.rfc-editor.org/rfc/rfc2617 p>
Généralement: vous stockez uniquement un digest. Jamais un mot de passe. P>
Après RFC2617, vous devez stocker une digère de nom d'utilisateur, de royaume et de mot de passe. P>
Le client ("agent") prend nom d'utilisateur, mot de passe, royaume, etc., et crée un digest, qu'il envoie à votre serveur. P>
Votre serveur, basé sur le nom d'utilisateur, lève la version de la Digest. P>
Si leur Digest == Le Digest enregistré sur le serveur, vous êtes d'accord sur le mot de passe (et tout le reste). P>
Si leur digestez! = Le digest enregistré sur le serveur, vous n'êtes pas d'accord sur le mot de passe (ou quelque chose d'autre). Ce qui signifie qu'ils n'ont pas obtenu le royaume ou le nom d'utilisateur, ni ils n'ont pas eu la nonce droite, ou quelque chose d'autre s'est trompé. Ils ne peuvent pas être de confiance. P>
Le RFC2617 complet comprend d'autres données pour calculer une digère d'autres éléments et le mot de passe Digest pour être absolument sûr que le client effectue la réponse. P>
La raison pour laquelle vous stockez un mot de passe haché est que si une personne parvient à récupérer les données de votre table utilisateur, elles ne peuvent toujours pas se connecter. Un hachage à sens unique ne peut pas être déchiffré (pas même par le personne qui le crypté!) Il est donc très difficile d'utiliser le mot de passe haché pour quoi que ce soit. p>
Parce que vous ne pouvez pas éventuellement déchiffrer le mot de passe dans la base de données, vous devez prendre le mot de passe saisi et répéter le même processus sur le hayh, puis comparez les valeurs hachées pour trouver une correspondance. Pour cette raison, votre sel ne peut pas vraiment être totalement aléatoire car vous finirez par obtenir différents résultats. P>
En plus de cela, vous ne voulez pas vraiment qu'un mot de passe soit transmis sous sa forme non cryptée, c'est pourquoi les pages de connexion sont normalement des pages HTTPS. P>
Un hasch aller simple peut être fissuré facilement - c'est pourquoi la salage est dans le. Les attaques de dictionnaire contre un mécanisme de hachage connu (comme MD5) sont rapidement grâce aux dictionnaires précomptes de Hugh.
@Tomtom: tandis qu'un hasch peut être fissuré, ce n'est pas "facile". Il faut du temps et des ressources et le succès dépend de la "force" du mot de passe.
@Sohne: le sel peut être aussi aléatoire que vous le souhaitez. Il suffit de le stocker dans la base de données.
@JOSH K: Comment peut-il être aléatoire? Si cela devait être aléatoire, comment puis-je ré-créer le même hachage (le hachage est-il le bon terme?) Pour vérifier la base de données?
Parce que vous stockez le sel. Voir mon exemple. Le sel aléatoire est généré lorsque le mot de passe est stocké la première fois i>. Les tentatives de connexion suivantes utilisent le sel qui a été stocké.
Ahh je vois. Cela dépend de la façon dont vous utilisez le sel.
Exactement. L'idée de sel est que le hachage de "mot de passe" n'est pas le même pour 2 utilisateurs, sinon je peux exécuter une attaque de dictionnaire simple, car je peux recomputer les hatupes.
@Joshk - Vous ne stockez pas dans la même table dans un champ appelé "sel" êtes-vous?
@Sohnee: Non, ça s'appelle "des arbres que j'aime."
@JOSH K: Donc, il n'y a donc aucun problème à le stocker dans la même table avec un champ appelé sel droit?
@Doug: Il ne devrait pas y avoir si vous avez un faible sel.
2e edit: Qu'est-ce qu'un hash unidirectionnel? Je veux dire, techniquement, je ne peux pas renverser l'ingénieur mon code source? Peut-être que c'est une mauvaise question parce que je ne sais pas grand chose sur le hachage à sens unique. P> blockQuote>
"D'une manière" en cryptographie signifie "difficile à inverser". Mettez simplement, cela signifie que si je vous donne
sha1 (mot de passe) code>, vous ne pouvez pas trouver
mot de passe code> dans une quantité de temps raisonnable. P>
Ceci s'appelle Compulissement d'une manière circublique . Beaucoup de gens confondent cela pour une autre définition d'un sens (de mathématiques) signifiant "Pas un- à un ", qui ne s'applique pas ici. P>
Je vous conseille fortement de l'utilisation de MD5. Pour plus d'informations, lisez le Section Wikipedia [MD5] Security . Je recommande d'utiliser l'algorithme de hachage SHA-1 à la place. P>
Évitez d'utiliser des hachages MD5 si vous le pouvez, car il est assez défectueux. P>
Les alternatives sont SHA1, voire mieux SHA256 ou SHA512. P>
Cette question peut contredire le ci-dessus, mais mon sel devrait-il être un Valeur générée au hasard? Si oui, quand peut-il être utile? p> blockQuote>
Les sels doivent être aléatoires. Leur seule utilisation est de faire des attaques de force brute sur les hachages beaucoup plus chers. Quelque chose appelé une "table arc-en-ciel" (qui est un nom de fantaisie pour une base de données où quelqu'un a haché à l'avance de mots de passe possibles et vous permet de rechercher des mots de passe si vous connaissez le hachage) permet de prendre des coups de mot de passe non salés les dans des mots de passe dans une fraction d'une seconde dans de nombreux cas. P>
Un sel modérément de taille peut augmenter la complexité d'une attaque de force brute précalisée de manière exponentielle. Pour chaque peu de données aléatoires dans votre sel, vous double du temps requis pour une attaque de force brute précalisée. Pour chaque valeur de sel unique dans votre base de données, l'attaquant doit recommencer lorsque vous attaquez le mot de passe protégé par ce sel. P>
Si vous aviez 1kb de sel aléatoire pour chaque mot de passe de l'utilisateur, les hachages précomptes seraient sur la fenêtre. Vous n'avez aucune incidence sur la quantité de temps qu'il faudrait à la force du mot de passe d'un seul utilisateur. P>
Une façon de faire la vie de la force de force brutale plus difficile consiste à faire du processus de hachage intensive informatique (par exemple 5000 tours de SHA1 (sel + SHA1 (sel + SHA1 (sel + Mot de passe))))))))))))). Vous devez seulement faire cela pour chaque tentative de connexion. L'attaquant doit le faire pour chaque combinaison de mot de passe sel + qu'ils veulent deviner. Vous devez décider si c'est quelque chose qui vaut la peine de répondre à vos besoins. La réponse est probablement non. P>
édition: autre que les mots de passe, dans un utilisateur système, quoi d'autre devrait être crypté comme une bonne pratique? Est-ce qu'ils cryptent Noms d'utilisateur ou quoi que ce soit d'autre? P> blockQuote>
Je suis paranoïaque, mais je dirais des informations que vous avez le propriétaire du site dont vous n'avez pas besoin pendant que l'utilisateur n'est pas connecté doit être crypté avec une dérivée du mot de passe de l'utilisateur. Ainsi, les attaquants n'ont pas accès parce que vous n'avez pas accès. P>
Pour un système de traitement de commande en ligne, par exemple, vous aurez peut-être besoin de leur adresse postale, de leur nom et de la dernière commande non cryptée, mais leur historique de commande et leur couleur préférée peut être crypté avec leur mot de passe de compte. P>
Notez que si vous faites cela, et ils perdent leur mot de passe, les informations protégées sont également perdues. P>
2e edit: Qu'est-ce qu'un hash unidirectionnel? je méchant, techniquement, je ne peux pas inverser Ingénieur mon code source? Peut-être que c'est une mauvaise question parce que je ne sais pas beaucoup sur le hachage à sens unique. P> blockQuote>
Un hachage est une méthode permettant de jeter systématiquement des informations. Disons que vous commencez par une chaîne et produisez des "srsflcdos" en jetant tout sauf chaque quatrième caractère. Le texte que j'ai "haché" pourrait être: "Spear Si le poisson se trouve calmement. Ne vous asseyez pas!", Ou cela pourrait être: "Supercalifragilisticepsialidetitude". Il n'y a aucun moyen de prouver de chaque sens. P>
Les hachages cryptographiques font beaucoup plus de mélange et d'autres transformations ainsi que de jeter, de les rendre plus sécurisées pour de petites quantités de données d'entrée et d'éviter de fuir tous les faits sur les données d'entrée. À titre d'exemple d'un hachage non sécurisé, si vous savez que lorsque l'entrée contient la lettre A, le 12 bit du hachage est 1, vous exposez des informations sur le texte d'origine et que le résultat n'est pas un hachage cryptographiquement sécurisé. < / p>
Le principe est que vous ne pouvez pas renverser ingénieur un processus si entre chaque transformation, vous jetez des informations essentielles pour annuler la transformation précédente. Un MD5SUM produit 128 bits de sortie, que vous ayez mis 1 bit ou 12 pétaoctes d'informations. Vous ne pouvez évidemment pas compresser 12 pétatabytes en 128 bits. Les informations sont donc clairement jetées dans le processus de calcul du hachage. P>
Assurez-vous de connaître la distinction entre «cryptage» et «hachage»!
Cela vous dérangerait-il d'expliquer cela s'il vous plaît?
Le cryptage implique de prendre une valeur et de l'exécuter à travers un certain ensemble de processus afin de générer une autre valeur, de sorte que la valeur initiale est (espérons-le) inconnue de toute personne sans le décryptage approprié (qui modifie la valeur de la valeur). Le hachage, d'autre part, est simplement une méthode de mappage de valeurs longues ou grosses à de petites tableaux / tables.
@Raven Dreamer merci
Stackoverflow.com/questions/287517 / ... Voir cette question, qui a des réponses bien informées.