web-dev-qa-db-fra.com

Meilleur moyen de stocker le mot de passe dans la base de données

Je travaille sur un projet qui doit avoir une authentification (nom d'utilisateur et mot de passe)

Il se connecte également à une base de données, j'ai donc pensé y stocker le nom d'utilisateur et le mot de passe. Cependant, il semble que ce n’est pas une bonne idée d’avoir des mots de passe comme un simple champ de texte dans une table située dans la base de données.

J'utilise C # et me connecte à un serveur express 2008. Quelqu'un peut-il suggérer (avec autant d'exemples que possible) quel serait le meilleur moyen de stocker ce type de données?

P.S Je suis ouvert à l'idée que cette information ne soit pas stockée dans la base de données si une bonne raison peut être fournie

440
Crash893

Vous avez raison de dire que stocker le mot de passe dans un champ de texte brut est une idée horrible . Cependant, en ce qui concerne l'emplacement , dans la plupart des cas que vous rencontrerez (et honnêtement, je ne peux penser à aucun contre-exemple. ) stockant la représentation d'un mot de passe dans la base de données est la bonne chose à faire. Par représentation, je veux dire que vous voulez hacher le mot de passe en utilisant un salt (qui devrait être différent pour chaque utilisateur) et un algorithme sécurisé à sens unique et enregistrez ce que , jetant le mot de passe original. Ensuite, lorsque vous souhaitez vérifier un mot de passe, hachez la valeur (en utilisant le même algorithme de hachage et le même sel) et comparez-la à la valeur hachée de la base de données.

Donc, bien que vous pensiez que c’était une bonne chose et que c’est une bonne question, c’est en fait un duplicata de ces questions (au moins):

Pour clarifier un peu la question du salage, le danger de simplement hacher un mot de passe et de le stocker est que si un intrus récupère votre base de données, il peut toujours utiliser ce que l'on appelle tables Rainbow to être capable de "décrypter" le mot de passe (au moins ceux qui apparaissent dans la table Rainbow). Pour contourner ce problème, les développeurs ajoutent un sel aux mots de passe, ce qui, lorsqu'il est correctement effectué, rend les attaques Rainbow tout simplement irréalisables. Notez qu'une idée fausse commune est simplement d'ajouter la même chaîne longue et unique à tous les mots de passe. Bien que ce ne soit pas horrible , il est préférable d’ajouter des sels uniques à chaque mot de passe. Lisez ceci pour plus.

384
Paolo Bergantino

Arrière-plan Vous n'avez jamais ... vraiment ... besoin de connaître le mot de passe de l'utilisateur. Vous voulez simplement vérifier qu'un utilisateur entrant connaît le mot de passe d'un compte.

Le hachage: Stocke les mots de passe des utilisateurs hachés (chiffrement à sens unique) via une fonction de hachage renforcée. Une recherche sur "mots de passe de chiffrement c #" donne une charge d'exemples.

Voir le créateur de hachage SHA1 en ligne pour une idée de ce qu'une fonction de hachage produit (mais n'utilisez pas SHA1 comme fonction de hachage, utilisez quelque chose de plus fort, tel que SHA256).

Maintenant, un mot de passe haché signifie que vous (et les voleurs de bases de données) ne devriez pas pouvoir inverser ce hachage dans le mot de passe d'origine.

Comment l'utiliser: Mais, vous dites, comment puis-je utiliser ce mot de passe condensé stocké dans la base de données?

Lorsque l'utilisateur se connecte, il vous communiquera le nom d'utilisateur et le mot de passe (dans son texte d'origine). Vous utilisez simplement le même code de hachage pour hacher le mot de passe saisi pour obtenir la version stockée.

Alors, comparez les deux mots de passe hachés (hachage de la base de données pour le nom d'utilisateur et le mot de passe saisi et haché). Vous pouvez déterminer si "ce qu'ils ont tapé" correspond "à ce que l'utilisateur d'origine a saisi pour leur mot de passe" en comparant leurs hachages.

Crédit supplémentaire:

Question: Si j'avais votre base de données, je ne pourrais pas simplement prendre un cracker comme John the Ripper et commencer à faire des hachages jusqu'à ce que je trouve des correspondances avec vos mots de passe stockés et hachés? (puisque les utilisateurs choisissent des mots courts, les mots du dictionnaire de toute façon ... ça devrait être facile)

Réponse: Oui ... oui, ils le peuvent.

Donc, vous devriez "saler" vos mots de passe. Voir le article de Wikipedia sur le sel

Voir exemple "Comment hacher des données avec salt" C #

49
joej

En tant que hachage salé durci par clé, en utilisant un algorithme sécurisé tel que sha-512.

30
nilamo

La meilleure pratique de sécurité consiste à ne pas stocker du tout le mot de passe (même crypté), mais à stocker le hachage salé (avec un sel unique par mot de passe) du mot de passe crypté.

De cette façon, il est (pratiquement) impossible de récupérer un mot de passe en texte clair.

26
Mitch Wheat

Je recommande vivement de lire les articles Assez avec les tables Rainbow: Ce que vous devez savoir sur les schémas de mots de passe sécurisés [lien mort, copie sur Internet Archive ] et - Comment stocker en toute sécurité un mot de passe .

Beaucoup de codeurs, y compris moi-même, pensent comprendre la sécurité et le hachage. Malheureusement, la plupart d'entre nous ne le faisons pas.

10
zebrabox

Je suis peut-être un peu hors sujet, car vous avez mentionné la nécessité d’un nom d’utilisateur et d’un mot de passe, et ma compréhension de la question n’est certes pas la meilleure, mais OpenID mérite-t-il d’être envisagé?

Si vous utilisez OpenID, vous ne stockez aucune information d'identification si je comprends bien la technologie et les utilisateurs peuvent utiliser les informations d'identification qu'ils possèdent déjà, ce qui vous évite de créer une nouvelle identité propre à votre application.

Il peut ne pas convenir que l’application en question soit purement à usage interne bien que

RPX fournit un moyen simple et agréable d'intégrer le support OpenID dans une application.

6
Crippledsmurf

Dans votre scénario, vous pouvez consulter l'appartenance à asp.net. Il est recommandé de stocker le mot de passe de l'utilisateur en tant que chaîne hachée dans la base de données. vous pouvez authentifier l'utilisateur en comparant le mot de passe entrant haché avec celui stocké dans la base de données.

Tout a été construit à cet effet, consultez adhésion asp.net

3
Ray Lu

Je voudrais MD5/SHA1 le mot de passe si vous n'avez pas besoin de pouvoir inverser le hachage. Lorsque les utilisateurs se connectent, vous pouvez simplement chiffrer le mot de passe et le comparer au hachage. Les collisions de hachage sont presque impossibles dans ce cas, sauf si quelqu'un a accès à la base de données et voit un hachage pour lequel il a déjà eu une collision.

2
waiwai933