La meilleure façon de stocker le mot de passe dans la base de données
Je suis en train de travailler sur un projet qui a pour avoir une authentification (nom d'utilisateur et mot de passe)
Il se connecte également à une base de données, alors j'ai pensé que je voudrais stocker le nom d'utilisateur et mot de passe. Cependant, il semble que pas une bonne idée d'avoir des mots de passe comme un simple champ de texte dans une table, assis sur la base de données.
Je suis à l'aide de C# et de le connecter à un server 2008 express. Quelqu'un peut-il suggérer (avec le plus d'exemples possibles) quelle est la meilleure façon de stocker les données de ce type serait?
P. S je suis ouvert à l'idée que cette info ne pas être stockées dans la base de données si une bonne raison peut être fourni
- Quoi que vous fassiez, si vous allez avec le cryptage, ne pas stocker la clé dans le code précédent affiche mentionné. C'est juste une mauvaise pratique.
- Comment faire des mots de passe droit? " est une question vitale. C'est un problème difficile et les erreurs ont des conséquences graves (rappel de ce qui s'est passé à Tesco et LinkedIn). Je pense que cette question devrait être ré-ouvert en programmers.stackexchange.com
- Il est préférable de s'en tenir à des normes - voir en.wikipedia.org/wiki/PBKDF2 Vous n'avez qu'à trouver une application dans votre langue
- Cette question est largement répondu dans le forum sur la sécurité: security.stackexchange.com/questions/211/...
Vous devez vous connecter pour publier un commentaire.
Il est exact que de stocker le mot de passe dans un simple champ de texte est un horrible idée. Cependant, aussi loin que l'endroit va, pour la plupart des cas, vous allez rencontrer (et honnêtement, je ne peux penser à aucune des contre-exemples) le stockage de l' représentation d'un mot de passe dans la base de données est la bonne chose à faire. Par la représentation, je veux dire que vous voulez hash le mot de passe à l'aide d'un sel (qui doit être différent pour chaque utilisateur) et une sécurité 1-algorithme et de stocker que, de jeter le mot de passe d'origine. Ensuite, lorsque vous voulez vérifier un mot de passe, vous hachage de la valeur (en utilisant le même algorithme de hachage et de sel) et de la comparer à la valeur hachée dans la base de données.
Ainsi, alors que c'est une bonne chose que vous pensez à ce sujet et c'est une bonne question, c'est en fait un double de ces questions (au moins):
De clarifier un peu plus loin sur le saler peu, le danger avec simplement le hachage d'un mot de passe et le stockage, c'est que si un intrus obtient une emprise de votre base de données, ils peuvent toujours utiliser ce qui est connu comme rainbow tables pour être en mesure de "décrypter" le mot de passe (au moins ceux que l'on peut voir dans l'arc-en-ciel de la table). Pour contourner ce problème, les développeurs d'ajouter un sel de mots de passe qui, lorsqu'il est fait correctement, rend arc-en-ciel attaques tout simplement impossible à faire. Notez qu'une idée fausse commune est de simplement ajouter le même et unique long de la chaîne de tous les mots de passe; si ce n'est pas horrible, il est préférable d'ajouter unique de sels de chaque mot de passe. Lisez ceci pour en savoir plus.
Fond
Vous n'avez jamais ... vraiment ... besoin de connaître le mot de passe utilisateur. Vous voulez juste pour vérifier l'arrivée d'un utilisateur connaît le mot de passe pour un compte.
De Hachage Elle:
Stocker des mots de passe hachés (chiffrement à sens unique) sur une fonction de hachage.
Une recherche pour "c# chiffrer les mots de passe" donne une charge d'exemples.
Voir le en ligne de hachage SHA1 créateur pour avoir une idée de ce qu'est une fonction de hachage produit (Mais ne pas utiliser SHA1 une fonction de hachage, utiliser quelque chose de plus fort comme SHA256).
Maintenant, un hachage de mots de passe signifie que vous (et de la base de données des voleurs) ne devrait pas être en mesure d'inverser que de hachage de retour dans le mot de passe d'origine.
Comment l'utiliser:
Mais, dites-vous, comment puis-je utiliser cette purée jusqu'mot de passe stocké dans la base de données?
Lorsque l'utilisateur se connecte, ils vont vous remettre le nom d'utilisateur et le mot de passe (dans le texte original)
Il vous suffit d'utiliser le même code de hachage de hachage tapé un mot de passe pour obtenir le numéro de version.
Comparez les deux mots de passe hachés (base de données de hachage pour le nom d'utilisateur et le tapé en & hachage de mot de passe). Vous pouvez dire si "ce qu'ils ont tapé dans" appariés "ce que l'original utilisateur a entré son mot de passe" en comparant leurs empreintes.
Un crédit supplémentaire:
Question: Si j'avais votre base de données, ne pourrais-je pas simplement prendre un pirate, comme John the Ripper et commencer à faire des hachages jusqu'à ce que je trouve correspond à votre stockées, les mots de passe hachés?
(puisque les utilisateurs à sélectionner court, dictionnaire des mots de toute façon ... il devrait être facile)
Réponse: Oui ... oui ils le peuvent.
Donc, vous devriez " sel " vos mots de passe.
Voir la Article de wikipédia sur le sel
Voir "Comment hachage de données avec le sel" exemple en C#
Comme l'un des principaux durci salé de hachage, à l'aide d'un algorithme sécurisé tels que sha-512.
La meilleure pratique de sécurité est de ne pas stocker le mot de passe à tous (même cryptées), mais pour stocker le salé de hachage (avec un unique sel par mot de passe) du mot de passe crypté.
De cette façon, il est (quasiment) impossible de récupérer un mot de passe en clair.
J'avais recommandons de lire les articles Assez Avec Les Tables Arc-En-Ciel: Ce Que Vous Devez Savoir Sur Les Régimes De Mot De Passe Sécurisé [lien mort, copie à l'Internet Archive] et Comment Stocker En Toute Sécurité D'Un Mot De Passe.
Beaucoup de codeurs, moi y compris, pense qu'ils comprennent la sécurité et de hachage. Malheureusement, la plupart d'entre nous ne le font pas.
J'ai peut-être un peu hors-sujet, comme vous l'avez fait mention de la nécessité d'un nom d'utilisateur et le mot de passe, et ma compréhension de la question est peut l'admettre comme pas le meilleur, mais est OpenID quelque chose à considérer?
Si vous utiliser OpenID, alors vous n'avez pas à stocker des informations d'identification à tous, si je comprends la technologie correctement et les utilisateurs peuvent utiliser les informations d'identification qu'ils ont déjà, en évitant la nécessité de créer une nouvelle identité qui est spécifique à votre application.
Il peut ne pas être adaptée à l'application en question est purement pour l'usage interne, mais
RPX fournit une bonne manière de intégrons OpenID de la prise en charge d'une application.
Dans votre scénario, vous pouvez jeter un oeil à asp.net l'adhésion, il est de bonne pratique pour stocker de l'utilisateur mot de passe hashé en chaîne de caractères dans la base de données. vous pouvez vous authentifier l'utilisateur en comparant hachés entrant le mot de passe avec celui stocké dans la base de données.
Tout a été construit pour cet usage, découvrez asp.net l'adhésion
Je MD5/SHA1 le mot de passe si vous n'avez pas besoin d'être en mesure d'inverser la valeur de hachage. Lors de la connexion des utilisateurs, vous pouvez crypter le mot de passe donné et le comparer à la valeur de hachage. Les collisions de hachage sont presque impossible dans ce cas, à moins que quelqu'un accède à la base de données et voit un hachage ils ont déjà une collision pour.