Méthode préférée de Stockage des mots de passe En Base de données
Quelle est votre méthode préférée/type de données pour le stockage des mots de passe dans une base de données (de préférence SQL Server 2005). La façon dont je l'ai fait dans plusieurs de nos applications est d'utiliser d'abord la .NET des bibliothèques de cryptage et de les stocker dans la base de données sous forme binaire(16). Est-ce la méthode préférée ou devrais-je utiliser un autre type de données, ou d'allouer plus d'espace que 16?
- J'ai le sentiment que cela peut être une dupe, mais ce que j'ai pensé que peut-être un dupe de il s'est avéré être sur la DB connexions et pas juste le stockage de l'application/le site des connexions.
- Pourriez-vous préciser votre question, pour expliquer si vous êtes à l'aide de "cryptage" ou de "hachage" fonctions? Je pense que tu veux dire la dernière, mais la différence est très significative.
Vous devez vous connecter pour publier un commentaire.
- Je stocker le salé équivalent de hachage du mot de passe dans la base de données et de ne jamais le mot de passe, puis toujours comparer le hash généré de ce que l'utilisateur est passé en.
C'est trop dangereux pour jamais stocker le littéral de données de mot de passe n'importe où. Cela rend impossible reprise, mais quand quelqu'un oublie ou perd un mot de passe que vous pouvez courir à travers quelques vérifications et de créer un nouveau mot de passe.
varchar
colonne de base de données. Le point final d'une bonne réflexion de leur part est de définir un format de leur chaîne de hash, où le sel est inclus dans la chaîne.LA méthode préférée: ne jamais stocker les mots de passe dans votre base de données. Seuls les hachages de celle-ci. Ajouter le sel au goût.
Je fais la même chose que vous avez décrit, sauf qu'il est stocké sous forme de Chaîne. Je Base64 encode le chiffrés valeur binaire. La quantité d'espace à allouer dépend de l'algorithme de chiffrement/puissance de chiffrement.
Je pense que vous êtes en train de faire (étant donné que vous utilisez un Sel).
Avec ces mesures, vos mots de passe utilisateur sera assez bien protégés contre:
Comme le résultat d'une fonction de hachage est une série d'octets dans la plage de 0 à 255 (ou -128 à 127, selon l'signé-ness de votre 8 bits type de données), de les stocker en tant que données binaires brutes champ qui fait le plus de sens, car il est le plus compact de la représentation et ne nécessite pas de supplémentaire de codage et de décodage étapes.
Certaines bases de données ou les pilotes n'ont pas un grand soutien pour les types de données binaires, ou parfois, les développeurs ne sont pas assez familiers avec eux pour se sentir à l'aise. Dans ce cas, à l'aide d'une binaire à l'encodage du texte de Base-64 ou Base de 85, et de stocker le texte dans un champ de caractères est acceptable.
La taille du champ nécessaire est déterminée par la fonction de hachage que vous utilisez. MD5 toujours sorties de 16 octets, SHA-1 toujours les sorties de 20 octets. Une fois que vous sélectionnez une fonction de hachage, vous êtes habituellement coincé avec elle, car la modification nécessite une remise à zéro de tous les mots de passe existants. Donc, à l'aide d'une variable de taille de champ, ne pas acheter quelque chose.
Concernant la "meilleure" façon d'effectuer le hachage, j'ai essayé d'apporter beaucoup de réponses à d'autres DONC des questions sur ce sujet:
J'utilise le hachage sha du nom d'utilisateur, un guid dans le site web de config, et le mot de passe, stockées dans un varchar(40). Si ils veulent de la force brute /dictionnaire ils auront besoin de pirater le serveur web pour le guid ainsi. Le nom d'utilisateur sauts de la création d'un arc-en-ciel de la table à travers l'ensemble de la base de données si elles ne trouver le mot de passe. Si un utilisateur veut changer son nom d'utilisateur, je viens de réinitialiser le mot de passe en même temps.
Un simple hash du mot de passe, ou même (sel + mot de passe) n'est généralement pas suffisant.
voir:
http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/
et
http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords
Deux recommandent de le bcrypt algorithmes. Gratuit les implémentations peuvent être trouvés en ligne pour la plupart des langues populaires.
Vous pouvez utiliser plusieurs hachages dans votre base de données, il faut juste un peu d'effort supplémentaire. Il en vaut la peine si vous pensez qu'il y a plus reculés de la chance vous aurez besoin de l'appui de formats supplémentaires à l'avenir. Je vais souvent utiliser des entrées de mot de passe comme
{hashId}${sel}${mot de passe haché}
où "hashId" est juste un certain nombre-je utiliser en interne pour reconnaître que, par exemple, je suis en utilisant SHA1 avec un hachage motif; "sel" est encodée en base64 aléatoire de sel; et "mot de passe haché" est encodée en base64 de hachage. Si vous devez migrer les hachages, vous pouvez intercepter les personnes avec un vieux format de mot de passe et de leur faire changer leur mot de passe la prochaine fois qu'ils se connectent.
Comme d'autres l'ont mentionné, vous voulez être prudent avec votre hachages, car il est facile de faire quelque chose qui n'est pas vraiment sécurisé, par exemple, H(sel,mot de passe) est beaucoup plus faible que H(mot de passe,sel), mais en même temps vous voulez équilibrer les efforts mis dans ce avec la valeur du contenu du site. Je vais souvent utiliser H(H(mot de passe,sel),mot de passe).
Enfin, le coût de l'utilisation de l'encodage base64 les mots de passe sont modestes si on les compare aux avantages d'être en mesure d'utiliser divers outils qui attendent des données de texte. Ouais, ils devraient être plus flexibles, mais êtes-vous prêt à dire à votre patron qu'il ne peut pas utiliser son préféré outil tiers parce que vous voulez économiser quelques octets par enregistrement? 🙂
Édité pour ajouter un autre commentaire: si j'ai suggéré délibérément à l'aide d'un algorithme qui brûlait encore un 1/10e de seconde de hachage de mot de passe j'aurais de la chance d'être juste ri de mon bureau du boss. (Pas de chance? Il serait de noter quelque chose à discuter, lors de mon prochain examen annuel.) La gravure que le temps n'est pas un problème quand vous avez des dizaines, voire des centaines d'utilisateurs. Si vous êtes le poussant 100k utilisateurs, vous aurez généralement à plusieurs personnes de journalisation dans le même temps. Vous avez besoin quelque chose de rapide et fort, de ne pas lent et fort. "Mais ce que sur les informations de carte de crédit?" est tout simplement fallacieux depuis stockées les informations de carte de crédit ne devrait pas être n'importe où près de votre base de données régulièrement, et serait chiffré par l'application de toute façon, pas les utilisateurs individuels.
Si vous travaillez avec ASP.Net vous pouvez utiliser dans la composition de l'API.
Il prend en charge de nombreux types d'options de stockage, y compris; hachage unidirectionnel, bidirectionnel, chiffrement, md5 + sel. http://www.asp.net/learn/security pour plus d'info.
Si vous n'avez pas besoin de quelque chose de trop de fantaisie, ce qui est excellent pour les sites web.
Si vous ne l'utilisez pas ASP.Net voici un bon lien pour quelques articles de 4guys et codeproject
http://aspnet.4guysfromrolla.com/articles/081705-1.aspx
http://aspnet.4guysfromrolla.com/articles/103002-1.aspx
http://www.codeproject.com/KB/security/SimpleEncryption.aspx
Depuis votre question porte sur la méthode de stockage & taille je vais remédier à cela.
Type de stockage peut être binaire ou texte à la représentation (base64 est le plus commun). Binaire est plus petit, mais je trouve que travailler avec du texte plus facile. Si vous faites par l'utilisateur saler (sel par mot de passe) puis c'est plus facile à stocker le sel+hachage comme un combiné unique chaîne.
La taille est l'algorithme de hachage dépend. La sortie de MD5 est toujours de 16 octets, SHA1 est de 20 octets. SHA-256 et SHA-512 32 & 64 octets, respectivement. Si vous utilisez l'encodage de texte que vous aurez besoin d'un peu plus de stockage en fonction de la méthode de codage. J'ai tendance à utiliser Base64 car le stockage est relativement bon marché. Base64, aura besoin d'environ 33% plus grand champ.
Si vous avez par utilisateur salage, vous aurez besoin d'un espace pour le hachage. Mettre tous ensemble 64bit sel + hash SHA1 (160 bits), encodé en base64 prend 40 caractères, donc je stocke en tant que char(40).
Enfin si vous voulez bien faire les choses vous ne devriez pas utiliser un hachage unique, mais une fonction de dérivation de clé comme RBKDF2. SHA1 et MD5 sont incroyablement rapide. Même un seul thread de l'application peut hachage environ 30K à 50K mots de passe par seconde, c'est jusqu'à 200 K, les mots de passe par seconde sur un quad core de la machine. Les gpu peuvent hachage 100x à 1000x que de nombreux mots de passe par seconde.Avec une vitesse que la force brute attaque devient acceptable intrusion de la méthode. RBKDF2 vous permet de spécifier le nombre d'itérations pour régler comment "lent" votre hachage est. Le point n'est " pour amener le système à ses genoux, mais de choisir un nombre d'itérations de sorte que vous pac limite supérieure sur le hachage débit (500 hachages par seconde). Une épreuve de l'avenir de la méthode pour inclure le nombre d'itérations dans le champ mot de passe (itérations + sel + hash). Cela permettrait à l'augmentation des itérations dans le futur à suivre le rythme avec des processeurs plus puissants. Pour être encore plus souple d'utilisation varchar pour permettre potentiellement plus grand/alternative hachages dans l'avenir.
L' .Net de la mise en œuvre est RFC2892DeriveBytes
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx