Quelle fonction de hachage cryptographique choisir?

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

  • MD5: 16 octets (le Temps de hachage 500 MO: 1462 ms)
  • SHA1: 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 remplit autrement; MD5 étant le plus rapide et RIPEMD étant le plus lent.

MD5 a l'avantage de s'adapter au type GUI D intégré. Ce qui le rend vraiment facile à utiliser pour l'identification.

MD5 est cependant vulnérable aux les attaques par collision , SHA1 est aussi vulnérable, mais à un degré moindre.

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

questions particulières Je suis vraiment curieux de voir les réponses sont:

  • Is not to be trusted? Dans des situations normales, lorsque vous utilisez L'algorithme MD5 sans intention malveillante et qu'aucun tiers n'a d'intention malveillante, vous vous attendez à des collisions (ce qui signifie deux octets arbitraires[] produisant le même hachage)

  • combien de mieux vaut RIPEMD que SHA1? (si c'est mieux) son calcul est 5 fois plus lent mais la taille de hachage est même que SHA1.

  • quelles sont les chances d'obtenir des collisions Non-malveillantes en hachant des noms de fichier (ou d'autres chaînes courtes)? (Eg. 2 noms de fichier aléatoires avec le même hachage MD5) (avec MD5 / SHA1 / SHA2xx) en général, quelles sont les probabilités de collisions Non malveillantes?

C'est le benchmark 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();
    }
129
demandé sur icktoofay 2009-04-29 06:47:23

9 réponses

en cryptographie, les fonctions de hachage fournissent trois fonctions distinctes.

  1. résistance à la Collision : comme il est difficile pour quelqu'un de trouver deux messages ( n'importe quel deux messages) qui hachent la même chose.
  2. Preimage Resistance : avec un hachage, est-il difficile de trouver un autre message qui hache la même chose? Aussi connu comme une fonction de hachage à Sens Unique .
  3. second preimage resistance : à partir d'un message, trouvez un autre message qui le hache.

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

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 n'exigent pas de résistance aux collisions. En effet, MD5 est souvent encore utilisé dans des applications où la taille et la vitesse de la clé plus petite sont bénéfiques. 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 un un défaut qui permet de trouver des collisions en théorie beaucoup moins que les 2^80 pas qu'une fonction de hachage sûre de sa longueur exigerait. L'attaque est continuellement révisée et peut être actuellement effectuée en ~2^63 pas - à peine dans le domaine actuel de la calculabilité. Pour cette raison, le NIST supprime progressivement L'utilisation de SHA1, déclarant que la famille SHA2 devrait être utilisée après 2010.

SHA2 est une nouvelle famille de fonctions de hachage créée après SHA1. Actuellement, il n'y a pas attaques connues contre les fonctions de SHA2. SHA256, 384 et 512 font tous partie de la famille SHA2, en utilisant simplement différentes longueurs de clés.

RIPEMD Je ne peux pas trop commenter, sauf pour noter qu'il n'est pas aussi couramment utilisé que les familles SHA, et 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 plutôt que celle-ci. Dans l'application que vous utilisez, il semble assez lent, ce qui le rend moins utile.

En conclusion, il n'y a pas une seule fonction - tout dépend de ce que vous en avez besoin pour. Soyez conscient des défauts avec chacun et vous serez mieux en mesure de choisir la fonction de hachage droit pour votre "151970920 scénario.

128
répondu Eric Burnett 2009-04-29 06:30:15

Toutes les fonctions de hachage sont "cassés"

le pigeonhole principle dit que si vous essayez aussi fort que vous voulez, vous ne pouvez pas tenir plus de 2 pigeons dans 2 trous (à moins que vous coupez les pigeons vers le haut). De même, vous ne pouvez pas ajuster 2^128 + 1 nombres dans 2^128 slots. Toutes les fonctions de hachage se traduisent par un hachage de taille finie, ce qui signifie que vous pouvez toujours trouver une collision si vous cherchez à travers "la taille finie" + 1 séquences. C'est juste pas possible de le faire. Pas pour MD5 et pas pour Écheveau .

MD5 / SHA1/Sha2xx n'ont pas de risque de collision

toutes les fonctions de hachage ont des collisions, c'est un fait de la vie. En rencontrant ces collisions par accident est l'équivalent de gagnant la loterie intergalactique . C'est-à-dire, personne ne gagne intergalactique loterie , c'est juste pas la façon la loterie fonctionne. Vous ne tomberez pas sur un accident MD5/SHA1 / SHA2XXX hash, EVER. Chaque mot dans chaque dictionnaire, dans toutes les langues, hache à une valeur différente. Chaque nom de chemin, sur chaque machine de la planète entière a un différent hachage MD5/SHA1/SHA2XXX. Comment puis-je savoir que vous pouvez demander. Comme je l'ai dit, Personne ne gagne la loterie intergalactique, jamais.

Mais. .. Le MD5 est cassé.

parfois le fait que son cassée n'a pas d'importance .

comme il il n'y a pas de stands connus pré-image ou seconde attaque pré-image sur MD5.

qu'y a-t-il de cassé dans MD5? Il est possible pour un tiers de générer 2 messages, dont l'un est mauvais et L'autre est bon que les deux hachent à la même valeur. ( Collision attaque )

néanmoins, la recommandation actuelle de la RSA est de ne pas utiliser MD5 si vous avez besoin de pré-résistance à l'image. Les gens ont tendance à err sur le côté de la prudence quand il s'agit d'algorithmes de sécurité.

quelle fonction de hachage utiliser dans .NET?

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

répétez ceci après moi, il n'y a pas de risque de collisions MD5 , les collisions malveillantes peuvent être soigneusement conçues. Même s'il n'y a pas de pré-image connue attaques à ce jour sur MD5 la ligne des experts en sécurité est que MD5 ne doit pas être utilisé là où vous devez vous défendre contre des attaques pré-image. idem pour SHA1 .

gardez à l'esprit, tous les algorithmes ne doivent pas se défendre contre les attaques pré-image ou de collision. Prenez le cas trivial d'une recherche de premier passage pour les fichiers dupliqués sur votre HD.

  • utilisez la fonction basée sur SHA2XX si vous voulez un hash cryptographiquement sécurisé fonction.

personne n'a jamais trouvé de collision SHA512. JAMAIS. Ils ont essayé vraiment dur. 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 reçu la même attention que SHAX et MD5. SHA1 et RIPEMD sont vulnérables aux attaques d'anniversaire. Ils sont tous les deux plus lents que le MD5 sur .NET et viennent dans la taille de 20 octets maladroite. C'est inutile d'utiliser ces fonctions, oubliez-les.

SHA1 les attaques par collision sont en baisse de 2^52, sa ne va pas être trop long jusqu'à ce que SHA1 les collisions sont dans la nature.

pour des informations à jour sur les diverses fonctions de hachage ont un regard sur la fonction de hachage zoo .

Mais attendez, il ya plus de

ayant une fonction de hachage fast peut être une malédiction. Par exemple: un usage très courant pour les fonctions de hachage est le stockage de mot de passe. Essentiellement, vous calculez le hachage d'un mot de passe combiné avec une chaîne aléatoire connue (pour empêcher les attaques de l'arc-en-ciel) et 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, très efficacement deviner les mots de passe en utilisant la force brute. Chaque combinaison il essaie prend seulement une fraction de milliseconde, et il peut essayer des centaines de milliers de mots de passe une seconde.

pour contourner ce problème, l'algorithme bcrypt peut être utilisé, il est conçu pour être lent de sorte que l'attaquant sera fortement ralenti si attaquer un système en utilisant bcrypt. Récemment scrypt a fait un certain titre et est considéré par certains d'être plus efficace que bcrypt, mais je ne sais pas d'une implémentation .Net.

100
répondu Sam Saffron 2017-05-23 12:34:50

mise à jour:

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

Réponse Originale:

par ordre de faible à fort, je dirais:

  1. RIPEMD cassé, ne doit jamais être utilisé comme peut être vu dans ce pdf
  2. MD-5 Cassé, ne doit jamais être utilisé, peut être cassé en 2 minutes avec un ordinateur portable
  3. SHA-1 cassé, ne devrait jamais être utilisé, est cassé en principe, les attaques sont de mieux en mieux par semaine
  4. SHA-2 faible, sera probablement cassé dans les prochaines années. quelques faiblesses ont été trouvés. notez que généralement plus la taille de la clé est élevée, plus la fonction de hachage est difficile à briser. Alors que la taille de la clé = la force n'est pas toujours vrai, c'est surtout vrai. Donc SHA-256 est probablement plus faible que SHA-512.
  5. écheveau aucune faiblesse connue, est un candidat pour SHA-3 . Elle est relativement nouvelle et donc non testée. il a été mis en œuvre dans un tas de langues.
  6. MD6 aucune faiblesse connue, est un autre candidat pour SHA-3. Probablement plus fort que Skien, mais plus lent sur les machines à noyau simple. Comme Skien, il n'a pas été testé. Quelque les développeurs soucieux de la sécurité l'utilisent, dans mission critical roles .

personnellement J'utiliserais MD6, parce qu'on ne peut jamais être trop paranoïaque. Si la vitesse est un vrai problème, je regarderais Skein, ou SHA-256.

33
répondu Ethan Heilman 2014-03-14 07:20:45

que vous utilisez dépend vraiment de ce que vous l'utilisez. Si vous voulez juste s'assurer que les fichiers ne sont pas corrompus en transit et ne sont pas que préoccupé par la sécurité, aller pour rapide et petit. Si vous avez besoin de signatures numériques pour des accords de renflouement fédéral de plusieurs milliards de dollars et si vous avez besoin de s'assurer qu'ils ne sont pas forgés, allez-y fort pour mystifier et ralentir.

2
répondu tvanfosson 2009-04-29 02:53:04

j'aimerais ajouter (avant que md5 ne soit déchiré) que j'utilise encore md5 de façon intensive malgré son brokennessessence écrasante pour beaucoup de crypto.

aussi longtemps que vous ne vous souciez pas de protéger contre les collisions (vous êtes encore sûr d'utiliser md5 dans un hmac ainsi) et que vous voulez la vitesse (parfois vous voulez un hachage plus lent), alors vous pouvez toujours utiliser md5 en toute confiance.

2
répondu Mike Boers 2009-04-29 02:53:54

En MD5 de la défense, il n'y a aucun moyen connu pour produire un fichier d'un arbitraire de hachage MD5. L'auteur original doit planifier à l'avance pour avoir une collision. Ainsi, si le destinataire fait confiance à l'expéditeur, MD5 est très bien. MD5 est cassé si le signataire est malveillant, mais il n'est pas connu pour être vulnérable aux attaques d'homme-dans-le-milieu.

2
répondu rlbond 2009-04-29 05:10:05

Ce serait une bonne ideea de prendre un coup d'oeil à la BLAKE2 de l'algorithme.

comme il est décrit, il est plus rapide que MD5 et au moins aussi sûr que SHA-3. Il est également mis en œuvre par plusieurs applications logicielles , y compris WinRar.

1
répondu Florin Mircea 2016-08-21 21:33:58

Je ne suis pas un expert dans ce genre de choses, mais je suis à la hauteur de la communauté de sécurité et beaucoup de gens là-bas considèrent le hachage md5 cassé. Je dirais que celui qui à utiliser dépend de la sensibilité des données et de l'application spécifique. Vous pourriez être en mesure de s'en tirer avec un peu moins de hachage sécurisé tant que la touche est bonne et forte.

0
répondu blueintegral 2009-04-29 02:54:47

Voici mes suggestions pour vous:

  1. vous devriez probablement oublier MD5 si vous prévoyez des attaques. Il ya beaucoup de tables arc-en-ciel pour eux en ligne, et les sociétés comme la RIAA ont été connus pour être en mesure de produire des séquences avec des hachures équivalentes.
  2. utilisez un sel si vous le pouvez. Inclure la longueur du message dans le message peut rendre très difficile de faire un hachage utile collision.
  3. en règle générale, plus de bits signifie moins de collisions (par le principe du trou de cochon) et plus lent, et peut-être plus sûr (à moins que vous ne soyez un génie des mathématiques qui peut trouver des vulnérabilités).

voir ici pour un papier détaillant un algorithme pour créer des collisions md5 en 31 secondes avec un ordinateur de bureau Intel P4.

http://eprint.iacr.org/2006/105

0
répondu Unknown 2009-04-30 20:22:27