524 votes

Meilleur moyen de stocker un mot de passe dans une base de données

Je travaille sur un projet qui nécessite une authentification (nom d'utilisateur et mot de passe).

Il se connecte également à une base de données, et je me suis dit que je pourrais y stocker le nom d'utilisateur et le mot de passe. Cependant, il semble que ce ne soit pas une très bonne idée de stocker les mots de passe dans un champ de texte d'une table située dans la base de données.

J'utilise C# et je me connecte à un serveur 2008 express. Quelqu'un peut-il me suggérer (avec autant d'exemples que possible) la meilleure façon 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.

1 votes

Quoi qu'il en soit, si vous optez pour le cryptage, ne stockez pas la clé dans le code, comme l'a mentionné un poster précédent. C'est une mauvaise pratique.

2 votes

Il est préférable de s'en tenir aux normes - voir fr.wikipedia.org/wiki/PBKDF2 Il vous suffit de trouver une implémentation dans votre langue.

7 votes

Cette question a reçu une réponse détaillée dans le forum sur la sécurité : security.stackexchange.com/questions/211/

458voto

Paolo Bergantino Points 199336

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

Donc, même si c'est une bonne chose que vous y pensiez et que ce soit une bonne question, il s'agit en fait d'une duplication de ces questions (au moins) :

Pour clarifier un peu plus le salage, le danger de simplement hacher un mot de passe et de le stocker est que si un intrus met la main sur votre base de données, il peut toujours utiliser ce qu'on appelle des tables arc-en-ciel pour pouvoir "décrypter" le mot de passe (du moins ceux qui apparaissent dans la table arc-en-ciel). Pour contourner ce problème, les développeurs ajoutent un sel aux mots de passe qui, lorsqu'ils sont correctement réalisés, rendent les attaques arc-en-ciel tout simplement infaisables. Notez qu'une idée fausse courante est de simplement ajouter la même chaîne unique et longue à tous les mots de passe. horrible il est préférable d'ajouter des sels uniques à chaque mot de passe. Lisez ceci pour en savoir plus.

0 votes

@Paolo Bergantino : "stocker le mot de passe dans la base de données est la chose à faire" - Je ne suis pas d'accord avec cette affirmation.

43 votes

Je voulais dire stocker le mot de passe dans la base de données plutôt que de le stocker ailleurs. En sortant cette phrase de son contexte, on a l'impression que je suis en faveur du stockage des mots de passe simples, ce qui n'est évidemment pas le cas si vous lisez le reste.

0 votes

@Paolo Bergantino : J'ai parfaitement compris ce que vous vouliez dire. Et je ne l'ai pas sorti de son contexte. La meilleure pratique est de ne pas stocker même le mot de passe ecnrypté, mais de stocker un hash salé du mot de passe crypté.

64voto

joej Points 546

Contexte Vous n'avez jamais ... vraiment ... besoin de connaître le mot de passe de l'utilisateur. Vous voulez juste vérifier qu'un utilisateur entrant connaît le mot de passe d'un compte.

Hachez-le : Stockez les mots de passe des utilisateurs en les hachant (cryptage à sens unique) via une fonction de hachage forte. Une recherche sur "c# encrypt passwords" donne une foule d'exemples.

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

Or, un mot de passe haché signifie que vous (et les voleurs de bases de données) ne devriez pas être en mesure d'inverser ce hachage pour retrouver le mot de passe original.

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

Lorsque l'utilisateur se connecte, il vous remet son nom d'utilisateur et son mot de passe (dans son texte original). Il suffit d'utiliser le même code de hachage pour hacher le mot de passe saisi et obtenir la version stockée.

Comparez donc les deux mots de passe hachés (le hachage de la base de données pour le nom d'utilisateur et le mot de passe saisi et haché). Vous pouvez dire si "ce qu'ils ont tapé" correspond à "ce que l'utilisateur original a entré pour son mot de passe" en comparant leurs hachages.

Un crédit supplémentaire :

Question : Si j'avais votre base de données, ne pourrais-je pas simplement prendre un craqueur comme John l'Éventreur 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 de toute façon des mots courts du dictionnaire... cela devrait être facile).

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

Vous devez donc "saler" vos mots de passe. Voir le Article de Wikipédia sur le sel

Voir Exemple C# : "Comment hacher des données avec un sel". (archivé)

15 votes

Bon article, à l'exception d'une chose : md5 et sha1 ont tous deux été cassés. Vous devriez probablement opter pour un algorithme plus puissant, comme par exemple la famille SHA2.

3 votes

Merci Paolo, tu as raison. Comme l'utilisation de SHA2 est aussi facile que celle de MD5 et SHA1, veuillez utiliser l'algorithme de hachage le plus puissant.

5 votes

SHA-1 n'a pas été cassé. Mais pour paraphraser Bruce Schneier : Marchez, ne courez pas, vers SHA-2.

31voto

nilamo Points 1341

Comme un hachage salé renforcé par une clé, en utilisant un algorithme sécurisé tel que sha-512.

7 votes

À mon avis, vous devriez toujours utiliser des algorithmes lents (comme Blowfish, par exemple) pour stocker les mots de passe. Cet article est une bien meilleure réponse : security.stackexchange.com/questions/211/ . Je le mets ici, car cette page apparaît toujours en bonne place dans les résultats de recherche.

2 votes

Suivre ce conseil pour le stockage des mots de passe serait une erreur monumentale.

27voto

Mitch Wheat Points 169614

La meilleure pratique en matière de sécurité consiste à ne pas stocker le mot de passe du tout (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 clair.

11 votes

Wayne, en salant avant de calculer le hachage, la table arc-en-ciel est efficacement mise en échec, à condition que le sel soit de taille suffisante.

12 votes

@Wayne Hartman : Non. Si la valeur du sel est exposée, alors vous devez générer une nouvelle rainbow table pour cette valeur de sel spécifique. L'intérêt d'une rainbow table est d'avoir des valeurs de hachage calculées à l'avance. Et personne ne disposera d'une rainbow table pour son sel spécifique.

10voto

zebrabox Points 3937

Je recommande vivement la lecture des articles Assez avec les tables arc-en-ciel : Ce que vous devez savoir sur les systèmes de mots de passe sécurisés [lien mort, copie à l'Internet Archive ] et Comment stocker un mot de passe en toute sécurité .

Beaucoup de codeurs, moi y compris, pensent qu'ils comprennent la sécurité et le hachage. Malheureusement, la plupart d'entre nous ne le comprennent pas.

1 votes

@Johan Il semble que le lien soit maintenant rompu, ce qui est dommage. Voici une alternative codahale.com/how-to-safely-store-a-password (en anglais)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X