148 votes

Quelle fonction de hachage cryptographique dois-je choisir ?

Le cadre .NET est livré avec 6 algorithmes de hachage différents :

  • MD5 : 16 octets (Temps pour hacher 500MB : 1462 ms)
  • SHA-1 : 20 octets (1644 ms)
  • SHA256 : 32 octets (5618 ms)
  • SHA384 : 48 octets (3839 ms)
  • SHA512 : 64 octets (3820 ms)
  • RIPEMD : 20 octets (7066 ms)

Chacune de ces fonctions a des performances différentes ; MD5 étant la plus rapide et RIPEMD la plus lente.

MD5 a l'avantage de s'intégrer dans le type Guid intégré ; et c'est la base de l'UUID de type 3 . Le hachage SHA-1 est la base de l'UUID de type 5. Ce qui les rend très faciles à utiliser pour l'identification.

MD5 est cependant vulnérable à attaques par collision SHA-1 est également vulnérable, mais à un degré moindre.

Dans quelles conditions dois-je utiliser quel algorithme de hachage ?

Les questions auxquelles je suis vraiment curieux de voir des réponses sont les suivantes :

  • Faut-il se méfier de MD5 ? Dans des situations normales, lorsque vous utilisez l'algorithme MD5 sans intention malveillante et qu'aucun tiers n'a d'intention malveillante, vous attendez-vous à TOUTES les collisions (c'est-à-dire deux octets arbitraires produisant le même hachage) ?

  • Dans quelle mesure RIPEMD est-il meilleur que SHA1 (s'il est meilleur) ? il est 5 fois plus lent à calculer mais la taille du hachage est la même que SHA1.

  • Quelles sont les chances d'obtenir des collisions non malveillantes lors du hachage de noms de fichiers (ou d'autres chaînes courtes) ? (Par exemple, 2 noms de fichiers aléatoires avec le même hachage MD5) (avec MD5 / SHA1 / SHA2xx) En général, quelles sont les chances de collisions non malveillantes ?

C'est le point de référence que j'ai utilisé :

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }

    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }

15 votes

Le fait que vous mentionniez que md5 s'inscrit dans le format GUID (16 octets) suggère un malentendu fondamental. Un hash n'est pas garanti unique, mais il est rare (et difficile à falsifier s'il est utilisé dans un sens cryptographique) et dérivé de la chose dont il est le hash, alors qu'un GUID est, lui, unique mais sans rapport avec le contenu de la chose qu'il identifie. Ils sont utilisés à des fins très différentes.

2 votes

C'est vrai que ça n'a rien à voir, c'est juste un fait pratique et spécifique à la mise en œuvre. Je comprends que l'on ne peut pas faire tenir l'infini dans 16 octets. Vous pouvez avoir des collisions avec n'importe quel algorithme de hachage.

5 votes

De plus, un guide est unique dans la pratique. En théorie, si vous continuez à générer des guides, vous obtiendrez des doublons.

147voto

Eric Burnett Points 1122

En cryptographie, les fonctions de hachage assurent trois fonctions distinctes.

  1. Résistance aux collisions : A quel point est-il difficile pour quelqu'un de trouver deux messages ( tout deux messages) qui ont le même hachage.
  2. Résistance à la préimpression : Étant donné un hachage, à quel point est-il difficile de trouver un autre message qui a le même hachage ? Aussi connu sous le nom de fonction de hachage à sens unique .
  3. Résistance au second préimage : Compte tenu d'un message, trouver un autre message qui hashera la même chose.

Ces propriétés sont liées mais indépendantes. Par exemple, la résistance à la collision implique la résistance à la seconde préimage, mais pas l'inverse. Pour toute application donnée, vous aurez des exigences différentes, nécessitant une ou plusieurs de ces propriétés. Une fonction de hachage destinée à sécuriser les mots de passe sur un serveur ne nécessitera généralement qu'une résistance à la préimage, alors que les digests de messages requièrent les trois propriétés.

Il a été démontré que le MD5 n'est pas résistant aux collisions, mais cela n'empêche pas son utilisation dans des applications qui ne nécessitent pas de résistance aux collisions. En effet, le MD5 est encore souvent utilisé dans des applications où la taille réduite de la clé et la vitesse sont avantageuses. Cela dit, en raison de ses défauts, les chercheurs recommandent l'utilisation d'autres fonctions de hachage dans de nouveaux scénarios.

SHA1 a une faille qui permet de trouver des collisions en théoriquement beaucoup moins que les 2^80 étapes qu'une fonction de hachage sécurisée de cette longueur exigerait. L'attaque est continuellement révisée et peut actuellement être réalisée en ~2^63 étapes - tout juste dans le domaine actuel de la calculabilité (en avril 2009). C'est pour cette raison que le NIST élimine progressivement l'utilisation de SHA1 et déclare que la famille SHA2 devrait être utilisée après 2010.

SHA2 est une nouvelle famille de fonctions de hachage créée à la suite de SHA1. Actuellement, il n'existe aucune attaque connue contre les fonctions SHA2. SHA256, 384 et 512 font toutes partie de la famille SHA2, mais utilisent des longueurs de clé différentes.

Je ne peux pas trop commenter RIPEMD, sauf pour noter qu'il n'est pas aussi couramment utilisé que les familles SHA et qu'il n'a donc pas été examiné de près par les chercheurs en cryptographie. Pour cette seule raison, je recommande l'utilisation des fonctions SHA. Dans l'implémentation que vous utilisez, elle semble également assez lente, ce qui la rend moins utile.

En conclusion, il n'y a pas une seule fonction optimale - tout dépend de ce dont vous avez besoin. Soyez conscient des défauts de chacune d'entre elles et vous serez mieux à même de choisir la bonne fonction de hachage pour votre scénario.

1 votes

J'apprécie vraiment que vous entriez dans ce niveau de détail. C'est très utile.

1 votes

Pour certaines applications, même une fonction de hachage de qualité non cryptographique peut être appropriée. Le PO n'a jamais mentionné si c'était spécifiquement pour les mots de passe, ou pour l'authentification par défi-réponse, ou pour les jetons d'accès, ou simplement pour indexer un tas de chaînes/fichiers. La performance, d'autre part, est une préoccupation pour l'OP...

118voto

Sam Saffron Points 56236

Toutes les fonctions de hachage sont "cassées".

Le site principe du pigeonnier dit qu'en essayant autant que possible, on ne peut pas faire rentrer plus de 2 pigeons dans 2 trous (à moins de couper les pigeons en morceaux). De même, vous ne pouvez pas faire tenir 2^128 + 1 nombres dans 2^128 emplacements. Toutes les fonctions de hachage aboutissent à un hachage de taille finie, ce qui signifie que vous pouvez toujours trouver une collision si vous recherchez dans des séquences de "taille finie" + 1. Il n'est tout simplement pas possible de le faire. Pas pour MD5 et pas pour Skein .

MD5/SHA1/Sha2xx n'ont aucun risque de collision.

Toutes les fonctions de hachage ont des collisions, c'est une réalité. Rencontrer ces collisions par accident est l'équivalent de gagner la loterie intergalactique . C'est à dire, Personne ne gagne à la loterie intergalactique. ce n'est pas comme ça que la loterie fonctionne. Vous ne rencontrerez jamais un hachage MD5/SHA1/SHA2XXX accidentel, JAMAIS. Chaque mot de chaque dictionnaire, dans chaque langue, est haché à une valeur différente. Chaque nom de chemin, sur chaque machine de la planète entière, a un hachage MD5/SHA1/SHA2XXX différent. Comment puis-je le savoir, me demanderez-vous ? Eh bien, comme je l'ai déjà dit, personne ne gagne à la loterie intergalactique, jamais.

Mais... MD5 est cassé

Parfois, le fait qu'il soit cassé n'a pas d'importance .

A l'heure actuelle, il n'y a pas de attaques de pré-image ou de seconde pré-image sur MD5.

Vous vous demandez peut-être ce qui cloche avec le MD5 ? Il est possible pour une tierce partie de générer 2 messages, l'un étant MAUVAIS et l'autre étant BON, qui sont tous deux hachés à la même valeur. ( Attaque par collision )

Néanmoins, la recommandation actuelle de RSA est de ne pas utiliser MD5 si vous avez besoin d'une résistance à la pré-image. Les gens ont tendance à pécher par excès de prudence lorsqu'il s'agit d'algorithmes de sécurité.

Alors quelle fonction de hachage dois-je utiliser dans .NET ?

  • Utilisez MD5 si vous avez besoin de la vitesse/taille et ne vous souciez pas des attaques d'anniversaire ou de pré-image.

Répète après moi, il n'y a pas de risque de collisions MD5 les collisions malveillantes peuvent être soigneusement conçues. Même si aucune attaque par pré-image n'est connue à ce jour sur le MD5, les experts en sécurité estiment que le MD5 ne doit pas être utilisé lorsque vous devez vous défendre contre les attaques par pré-image. Il en va de même pour SHA1 .

N'oubliez pas que tous les algorithmes n'ont pas besoin de se défendre contre les attaques par pré-image ou par collision. Prenons le cas trivial d'une recherche au premier passage de fichiers en double sur votre disque dur.

  • Utilisez la fonction basée sur SHA2XX si vous souhaitez une fonction de hachage sécurisée sur le plan cryptographique.

Personne n'a jamais trouvé de collision SHA512. JAMAIS. Ils ont pourtant essayé très fort. De même, personne n'a jamais trouvé de collision SHA256 ou 384. .

  • N'utilisez pas SHA1 ou RIPEMD à moins que ce ne soit pour un scénario d'interopérabilité.

RIPMED n'a pas fait l'objet de la même attention que SHAX et MD5. SHA1 et RIPEMD sont tous deux vulnérables aux attaques d'anniversaire. Elles sont toutes deux plus lentes que MD5 sur .NET et se présentent sous la forme maladroite de 20 octets. Il est inutile d'utiliser ces fonctions, oubliez-les.

Les attaques de collisions SHA1 sont tombées à 2^52, il ne faudra pas attendre longtemps avant que les collisions SHA1 ne se produisent dans la nature.

Pour obtenir des informations actualisées sur les différentes fonctions de hachage, consultez le site suivant la fonction de hachage zoo .

Mais attendez, il y a plus

Avoir un rapide La fonction de hachage peut être une malédiction. Par exemple, une utilisation très courante des fonctions de hachage est le stockage des mots de passe. Essentiellement, vous calculez le hachage d'un mot de passe combiné à une chaîne aléatoire connue (pour empêcher les attaques de type "rainbow") et vous stockez ce hachage dans la base de données.

Le problème est que, si un attaquant obtient un dump de la base de données, il peut, de manière très efficace, deviner les mots de passe en utilisant la force brute. Chaque combinaison qu'il essaie ne prend qu'une fraction de milliseconde, et il peut essayer des centaines de milliers de mots de passe par seconde.

Pour contourner ce problème, l bcrypt peut être utilisé, il est conçu pour être lent, de sorte que l'attaquant sera fortement ralenti s'il attaque un système utilisant bcrypt. Récemment, scrypt a fait les gros titres et est considéré par certains comme plus efficace que bcrypt mais je ne connais pas d'implémentation .Net.

0 votes

Si MD5 et SHA-1 ont tous deux été affaiblis, MD5 est beaucoup plus faible que SHA-1, tout en étant à peine plus rapide. Des collisions MD5 réelles ont été trouvées et utilisées pour des exploits dans le monde réel (falsification de certificats CA), mais pour autant que je sache, aucune collision SHA-1 réelle n'a été trouvée (bien que le nombre d'opérations ait été considérablement réduit par rapport à la force brute). Et étant donné que MD5 est beaucoup plus faible, je ne serais pas surpris que des attaques de seconde préimage apparaissent plus tôt pour MD5 que pour SHA-1. Par conséquent, je pense que vous devriez utiliser SHA-1 si vous avez besoin de vitesse et non de résistance aux collisions, et sinon utiliser une des familles SHA-2.

1 votes

Brian, il est clair que dans les prochaines années, les gens seront en mesure d'exécuter des attaques par collision sur SHA1, ce qui rendra SHA1 aussi utile que MD5. L'affaire des certificats CA est une attaque par collision, de même dans quelques années, les gens seront en mesure d'exécuter la même attaque sur les certificats CA SHA1. L'attaque dépend d'une partie malveillante qui crée un certificat MAUVAIS et un certificat BON. Il n'y a pas d'attaques par primage connues sur MD5 et le fait qu'il y ait des attaques par collision ne rend pas les attaques par primage plus ou moins probables.

0 votes

Il s'agit bien moins de savoir quel hachage vous utilisez pour les mots de passe, que de savoir ce qui est haché. Si votre sel est connu, votre base de données est immédiatement vulnérable à une attaque par dictionnaire ; si votre sel est procédural, et que votre système de fichiers est compromis, vous êtes (à nouveau) vulnérable ; si votre sel est omis, vous êtes à nouveau compromis. La sécurité en question est, quoi qu'il arrive, CE QUI est haché. Je n'aborderai pas la question des certificats, car je n'y ai jamais eu affaire en tant que programmeur (IE, création, compréhension, etc.).

36voto

Ethan Heilman Points 4459

Mise à jour :

Les temps ont changé, nous avons un gagnant SHA3. Je vous recommande d'utiliser keccak (alias SHA3 ) vainqueur du concours SHA3.

Réponse originale :

Dans l'ordre du plus faible au plus fort je dirais :

  1. RIPEMD BROKEN, Ne devrait jamais être utilisé comme on peut le voir dans ce pdf
  2. MD-5 BROKEN, Ne devrait jamais être utilisé, peut être brisé en 2 minutes avec un ordinateur portable
  3. SHA-1 BROKEN, ne devrait jamais être utilisé, est cassé en principe, les attaques s'améliorent de semaine en semaine.
  4. SHA-2 WEAK, sera probablement cassé dans les prochaines années. Quelques faiblesses ont été constatées. Notez que généralement, plus la taille de la clé est élevée, plus la fonction de hachage est difficile à casser. Si la taille de la clé = force n'est pas toujours vraie, elle l'est le plus souvent. Ainsi, SHA-256 est probablement plus faible que SHA-512.
  5. Skein PAS DE FAIBLESSES CONNUES, est un candidat pour SHA-3 . Il est assez récent et n'a donc pas été testé. Il a été mis en œuvre dans un grand nombre de langues.
  6. MD6 NO KNOWN WEAKNESSES, est un autre candidat pour SHA-3. Il est probablement plus puissant que Skien, mais plus lent sur les machines à un seul cœur. Comme Skien, il n'a pas été testé. Certains développeurs soucieux de la sécurité l'utilisent, dans le cadre de leur travail. rôles critiques de mission .

Personnellement, j'utiliserais MD6, car on n'est jamais trop paranoïaque. Si la vitesse est un réel souci, je regarderais Skein, ou SHA-256.

6 votes

Je ne mettrais pas Skein et MD6 si haut dans la liste ; ce n'est pas pour rien que le concours SHA-3 ne sera pas terminé avant la fin 2012. Il faut beaucoup de temps et beaucoup d'yeux pour être convaincu qu'une fonction de hachage est réellement susceptible d'être sûre, et aucune de ces fonctions n'existe depuis assez longtemps pour cela.

0 votes

Je suis d'accord avec vos sentiments, mais je pense que la communauté est dans une position étrange. Toutes les fonctions de hachage utilisées sont dangereusement proches d'être cassées (peut-être, peut-être, pas SHA2 256-512) et pourtant nous devons attendre 2012 pour choisir un remplacement. Choisissez votre poison : faible/cassé ou non testé (la plupart des candidats du NIST ne sont pas publics depuis plus de 6 mois) ? Choix difficile.

6 votes

RIPEMD est cassé, mais RIPEMD-128/160/256 sont différents, et pas cassés.

2voto

tvanfosson Points 268301

Le choix de l'un ou l'autre dépend vraiment de l'usage que vous en faites. Si vous voulez simplement vous assurer que les fichiers ne sont pas corrompus en cours de transfert et que la sécurité ne vous préoccupe pas outre mesure, optez pour le format rapide et petit. Si vous avez besoin de signatures numériques pour des accords de sauvetage fédéraux de plusieurs milliards de dollars et que vous devez vous assurer qu'elles ne sont pas falsifiées, optez pour un système lent et difficile à falsifier.

1 votes

Souvent, lorsque je discute de solutions à un problème, je mentionne que j'utilise MD5 pour une identité rapide (hachage d'une chaîne), on me dit "mais md5 est cassé ... ne l'utilisez pas, utilisez sha1" .... Je n'adhère pas vraiment à cette idée, mais je me demande s'il y a quelque chose de si fondamentalement défectueux avec certains des hashs les plus faibles qu'ils devraient être évités ... par exemple dans des cas réels où des données normales produisent des collisions.

0 votes

Étant donné que le MD5 a fonctionné sans problème pour des millions de personnes pendant quinze ans, je pense qu'il vous convient si la sécurité du hachage n'est pas cruciale.

2 votes

@sambo MD5 fonctionne très bien dans presque tous les cas, sauf lorsque la sécurité ou l'intégrité de votre système est en jeu. dépend de sur la prévention des collisions.

2voto

Mike Boers Points 3999

J'aimerais ajouter (avant que md5 ne soit mis en pièces) que j'utilise toujours md5 de manière intensive, malgré son caractère brisé pour de nombreuses crypto-monnaies.

Tant que vous ne vous souciez pas de la protection contre les collisions (vous pouvez toujours utiliser md5 en toute sécurité dans un hmac) et que vous voulez la vitesse (parfois vous voulez un hachage plus lent), vous pouvez toujours utiliser md5 en toute confiance.

0 votes

@Mike Je suis d'accord avec vous sur ce point, c'est un peu ce que je cherchais avec cette question, c'est quelque chose sur les fonctions de hachage plus faibles si fondamentalement brisées qu'elles ne devraient jamais être utilisées.

0 votes

En outre, si les données ou la sécurité requise des données ont une durée de vie plus courte que la période de craquage (quelques minutes de nos jours, je crois), le MD5 convient parfaitement. La question est de savoir si le MD5 est utile en fonction de la situation, mais s'il l'est toujours.

0 votes

@annakata - Gardez à l'esprit que vous devriez également éviter de réutiliser les clés dans plusieurs messages pour que le système soit utilisable dans ces circonstances.

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