17 votes

Est-il sûr de stocker des mots de passe hachés avec MD5CryptoServiceProvider en C# ?

Nous stockons des mots de passe hachés dans une table de base de données.

Nous ajoutons une valeur de sel aléatoire à chaque mot de passe et hachons en utilisant MD5CryptoServiceProvider.

Est-ce sûr? J'ai entendu dire que MD5 était "cassé".

Si ce n'est pas sûr, pouvez-vous recommander une méthode de hachage alternative à utiliser (classe spécifique du framework .NET)?

11voto

crazyscot Points 6675

La sécurité d'une fonction de hachage dépend principalement de la longueur de sa sortie (empreinte de message) : une empreinte plus longue offre une meilleure résistance aux collisions. Le paradoxe des anniversaires nous dit qu'en moyenne, vous vous attendriez à trouver une collision à partir d'une fonction de travail de la racine carrée de la taille de l'empreinte : en d'autres termes, avec une empreinte de 128 bits, un attaquant s'attendrait à réussir après 2^64 tentatives.

MD5 est critiqué par la communauté cryptographique depuis quelques années maintenant car il n'a qu'une empreinte de 128 bits, et il existe également quelques résultats cryptanalytiques intéressants qui pourraient réduire efficacement sa force. SHA1 (empreinte de 160 bits) était l'alternative préférée, mais même alors, il semble ne pas être assez long pour un adversaire bien motivé et il existe également des résultats intéressants dans la communauté de recherche. La famille SHA-2 (tailles de sortie de 224 à 512 bits) sont les fonctions de hachage préférées actuellement largement utilisées. Il y a une compétition de recherche active organisée par le NIST pour trouver un successeur au SHA-2, mais nous n'aurons pas de nouvelle norme avant 2012 environ.

Maintenant, dans le cas spécifique du stockage des mots de passe, je vois que vous utilisez un sel. C'est la pratique fortement recommandée ; sans sel, vous seriez vulnérable à une attaque de table arc-en-ciel. Je crois que cela ne vous laisse qu'avec l'attaque par force brute à considérer ; c'est là que keylength.com intervient. Il rassemble les recommandations pour les tailles de clé et d'empreinte de la communauté cryptographique et donne les échelles de temps de sécurité attendues pour divers algorithmes, en tenant compte de la puissance de calcul actuelle et de la loi de Moore. Réfléchissez à quels types d'actifs vous protégez et combien de temps vous devez sécuriser un mot de passe (avez-vous par exemple une politique de changement de mot de passe forcée?) et cela devrait répondre à peu près à la question de la taille de l'empreinte dont vous avez besoin.

Bien sûr, le meilleur stockage de mots de passe au monde ne vous aidera pas si vos utilisateurs utilisent des mots de passe faciles à deviner. Fournissez-vous des conseils à vos utilisateurs pour des mots de passe forts? Avez-vous envisagé un indicateur de force du mot de passe ou similaire?

8voto

garik Points 3600

Je pense que SHA256, SHA512 sont plus sûrs en ce moment :)

Voir wiki

7voto

caf Points 114951

Non, vous ne devriez pas utiliser MD5. Mais vous ne devriez pas non plus utiliser un seul tour de n'importe quelle fonction de hachage à usage général, aussi sécurisée soit-elle cryptographiquement ! Pas de MD5, pas de SHA-1, pas de SHA-2, pas de SHA-3.

Pourquoi ? Parce que les fonctions de hachage à usage général sont conçues pour être rapides. Et rapide, c'est exactement ce que vous ne voulez pas dans un hachage de mot de passe. Rapide signifie que lorsque les gens malveillants obtiennent votre base de données, ils peuvent lancer une attaque par dictionnaire classique contre elle en un laps de temps raisonnable.

Ce dont vous avez besoin est d'être lent. La façon la plus simple d'être lent est d'itérer des milliers de fois la fonction de hachage rapide - c'est ce que le schéma de mot de passe basé sur MD5 et SHA-1 utilisé pour stocker les mots de passe sur les systèmes de type UNIX fait (ce n'est pas juste un tour de MD5 ou SHA-1). Une autre façon est d'utiliser un primitive cryptographique conçue pour être lente - c'est ce que fait le schéma de mot de passe "bcrypt".

Cet article de Matasano, Ce que vous devez savoir sur les schémas de mot de passe sécurisés, contient des informations intéressantes sur ce sujet précis.

3voto

burca toni Points 51

Avec un sel, le MD5 est beaucoup plus sécurisé que sans, mais il est préférable d'utiliser l'un des hachages SHA comme SHA256Managed.

2voto

Buhake Sindi Points 38654

Stockage du mot de passe haché est préférable car cela cache le mot de passe aux yeux indiscrets des DBA.

Aussi, oui, MD5 a été compromis, mais il est toujours utilisé à ce jour. Si vous vous inquiétez de MD5, utilisez plutôt SHA-1 (lien MSDN ici). C'est un algorithme de hachage comme MD5 mais plus fort. Vous pouvez avoir un hachage SHA-1 allant jusqu'à 512 bits.

Voici un exemple réalisé en VB.NET (http://www.obviex.com/samples/hash.aspx).

Voici le Département de la Sécurité intérieure des États-Unis expliquant pourquoi les gens devraient abandonner MD5 (http://www.kb.cert.org/vuls/id/836068). En résumé, il est "cryptographiquement cassé".

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