web-dev-qa-db-fra.com

Combien de temps un hachage doit-il être pour être absolument sécurisé?

Existe-t-il une sorte de règle pour déterminer la taille d'un hachage pour garantir la sécurité (c'est-à-dire exactement un message mappé à un hachage donné) d'un message? Quelque chose qui peut être appliqué à n'importe quel message, comme un numéro 32 bits ou un mot de passe à 8 lettres ASCII.

18
SecurityStudent

exactement un message correspond à un hachage donné

Cela n'est pas possible en raison du principe du pigeonnier. Tant que le message d'entrée de la fonction de hachage peut être plus grand que le hachage lui-même, il est garanti que certains messages entrent en collision les uns avec les autres et mappent sur le même hachage. C'est normal et ce n'est pas un problème pour la sécurité des hachages en soi.

Il vous suffit de vous assurer que la fonction de hachage est si grande que intentionnellement trouver de telles collisions (une attaque par collision) est impossible à calculer. Un condensé de hachage de n bits a une résistance aux collisions de n/2 morceaux. Pour atteindre une sécurité de 128 bits contre une attaque par collision, il est donc nécessaire d'avoir un condensé de hachage de 256 bits. Ceci, bien sûr, en supposant que le hachage est cryptographiquement sécurisé ( comme SHA-256 ) afin d'éviter qu'il n'y ait des attaques qui prennent un raccourci et puissent trouver des collisions plus facilement que par force brute.

87
forest

Cela dépend beaucoup de ce que vous voulez réaliser. Tout d'abord, comme l'a déjà souligné Forest, ce que vous voulez réellement en termes d'une seule carte d'entrée, un hachage est - dans le cas général - impossible. Il c'est possible dans des cas particuliers si le hachage est aussi long que l'entrée, ou plus. Puisque vous avez mentionné des entiers 32 bits, il existe en effet des hachages d'entier à entier 32 bits.
Notez cependant que le nombre possible d'entrées est si petit à 32 bits que la construction d'une table de recherche est en fait tout à fait réalisable (ne prend que 32 Go, donc sur l'ordinateur que j'utilise actuellement, la table de recherche s'intégrerait complètement dans la RAM!). Inutile de dire que ce n'est pas le cas, et ne peut probablement pas être sécurisé, quel que soit l'algorithme réel que vous utilisez.

Si vous prévoyez d'identifier quelque chose (comme un fichier ou une chaîne) avec le hachage, et la falsification malveillante n'est pas une considération ou du moins pas votre première priorité, alors vous pouvez à peu près considérer 64 bits "assez bien" et 128 bits "absolument sûrs".
CRC32 qui ne fournit même pas les garanties fournies par les hachages cryptographiquement sécurisés a été accepté comme "assez bon" pour distinguer les choses et identifier de manière fiable les modifications accidentelles pendant de nombreuses années (et 64 bits est un ordre de grandeur complètement différent contre 32 !!!). IDs sont de 128 bits, et ils sont considérés comme "uniques" quand ils ne le sont clairement pas. Mais pour toutes les questions pratiques, ils le sont.
J'allais ajouter ce GIT, qui est utilisé entre autres pour héberger le noyau Linux et d'autres logiciels liés à la sécurité utilisés dans milliards d'appareils (ce qui en fait une cible très intéressante pour une attaque ) utilise des hachages 128 bits pour séparer et sécuriser les éléments, mais c'est en fait 160 bits ...

Maintenant, si la falsification malveillante est une préoccupation, vous très probablement voulez un sécurisé = algorithme de hachage (donc CRC ne fera pas l'affaire), mais vous n'avez pas nécessairement besoin de plus de bits. Cela dépend simplement de ce que vous voulez protéger, de la durée et du type d'attaque.
Siphash ou Cityhash (par défaut, dans la configuration originale/commune, il y a aussi des variantes 32 et 128 bits) ne sont que 64 bits. Ce qui est très bien et absolument sûr si vous l'utilisez, par exemple pour assurer l'intégrité de certains messages de taille raisonnable que vous envoyez sur Internet. Un attaquant suffisamment puissant pourrait-il éventuellement trouver une collision dans les 15 à 20 minutes? Sûr. Mais peu importe, après 15 minutes, il est 14 minutes et 59 secondes trop tard pour qu'il fasse quelque chose avec.
Il est, d'autre part, pas du tout très bien si vous prévoyez de l'utiliser pour quelque chose qui est stocké pendant une plus longue période.

Dans ce cas, vous voulez au moins 128, mieux 160 bits, et pour dire avec une certitude raisonnable "absolument sûr", vous aurez besoin de 256 bits ou plus, encore une fois cela dépend Que exactement vous voulez. AES-CGM, qui est considéré comme "assez bon pour à peu près tout le monde" a au plus 128 bits (jusqu'à 96).

Votre attaquant peut-il choisir deux entrées, donc une attaque d'anniversaire est applicable? Dans ce cas, 128 bits ne valent que 64 bits (ou, si les projections tiennent, 42 bits sur les ordinateurs quantiques). C'est certainement un peu maigre et pas suffisant pour dire "assez bien", encore moins "absolument sûr".

Êtes-vous seulement préoccupé par les attaques seconde pré-image, c'est-à-dire que vous devez choisir l'une des entrées? Dans ce cas, 128 bits seront "très bien", 160 bits "incassables" et 256 bits "ridiculement incassables". Sauf si l'algorithme lui-même est cassé, c'est.

tl; dr
Dans l'ensemble, si vous préférez une réponse inconditionnelle qui ne vous oblige pas à prendre en compte les conditions préalables, vous devriez considérer que cette réponse est 256 ou plus .
256 bits est du domaine du "ridiculement impossible", mais il faut considérer que les algorithmes se cassent avec le temps, donc un algorithme de 256 bits pourrait ne vaut qu'une charge de travail de 2 ^ 140 ou 2 ^ 150 dans 10-20 ans, il n'y a aucun moyen de le savoir. Si vous êtes un peu paranoïaque, cela ne vous suffira peut-être pas de dire "absolument sûr" (bien que pour la plupart des gens, je pense que c'est encore assez).

Par conséquent, sans connaître votre niveau de paranoïa, je dis "256 ou plus". Quelques bits supplémentaires ne coûtent pas vraiment cher, mais ils ont un impact énorme. Faites-en 384 ou même 512, pourquoi pas. Si un algorithme de 512 bits est très, très significativement cassé et affaibli à une charge de travail de, disons 2 ^ 300, et les ordinateurs hyper-quantiques-super-magiques inventés par des extraterrestres para-dimensionnels peuvent, en appliquant mathématiquement et physiquement impossible magic, réduisez encore cela à une charge de travail de 2 ^ 150 bits, alors vous êtes encore à peu près prêt.

12
Damon

La taille de sortie d'une fonction de hachage place une limite supérieure sur son niveau de sécurité. Les trois propriétés principales que toute fonction de hachage cryptographique devrait avoir sont la résistance aux attaques par collision, première image et deuxième image.

Si un algorithme a une sécurité n - bit, cela signifie qu'il n'y a pas d'attaque qui casse les propriétés de sécurité pertinentes, ce qui nécessiterait beaucoup moins de 2 n étapes (approximativement et en moyenne) pour réussir. Si n est suffisamment grand, alors nous pouvons être pratiquement certains que personne n'a assez de puissance de calcul pour attaquer un système.

À partir d'une fonction de hachage avec une sortie n - bit, nous pouvons nous attendre à une sécurité allant jusqu'à n - bit lorsqu'il s'agit d'attaques de pré-image, mais non supérieur. On pourrait hypothétiquement rechercher une pré-image par force brute et réussir après, en moyenne, 2 n essaie.)

Pour la résistance aux collisions, cependant, le problème d'anniversaire signifie que vous auriez besoin de 2 * n bits au lieu de n bits.

Nous visons souvent une sécurité de 128 bits, ce qui signifie que la plus petite taille de résumé acceptable est de 256 bits. La sécurité 128 bits vous laisse une marge de sécurité suffisamment grande pour que vous soyez probablement toujours en sécurité en utilisant quelques bits de sortie en moins, mais utiliser trop peu de bits est risqué.

Remarque: Il s'agit d'une limite supérieure. Même si des algorithmes comme Murmur3, CityHash, xxHash et d'autres peuvent prétendre être de haute qualité et avoir de longues sorties, ils n'offrent pas de sécurité significative.

Ne choisissez certainement pas un algorithme basé uniquement sur sa taille de sortie. La taille de sortie détermine uniquement la résistance théorique maximale d'un hachage. Pas sa force réelle.

Au lieu de cela, choisissez une fonction de hachage résistante aux collisions que les gens conviennent comme sûre, par exemple. Blake-2, SHA-3, Skein ou SHA-2.

Remarque 2: Si vous utilisez quelque chose comme SHA-512, vous pouvez alors traiter l'algorithme comme si des entrées distinctes aboutiraient toujours à des sorties uniques. Avec une probabilité presque égale à un, vous n'obtiendrez pas de résumés en double pour un ensemble d'entrées du monde réel.

La probabilité réelle de voir des résumés en collision dépend à la fois du nombre de messages que vous essayez de hacher et du nombre de sorties possibles. Le nombre de messages distincts que vous pouvez essayer de hacher est naturellement limité car votre pouvoir de calculer des hachages est limité.

Les fonctions de hachage ne sont pas vraiment injectives, mais les développeurs de logiciels peuvent utiliser une grande fonction de hachage résistante aux collisions et la traiter comme si c'était vrai. La possibilité de produire par inadvertance une ou plusieurs collisions est techniquement non nulle, mais le cerveau d'une personne ne peut pas comprendre à quel point c'est incroyablement improbable.

4
Future Security

Si nous devons l'avoir pour que chaque résumé de message corresponde exactement à un message, alors notre résumé doit être aussi grand que le message le plus long possible.

Nous prenons le message comme un entier géant à N bits et calculons un autre entier à N bits à l'aide d'une fonction inversible. Une façon de le faire serait de crypter le message avec un chiffrement symétrique (dont la clé spécifie alors la fonction de hachage).

Bien sûr, les hachages qui sont aussi longs que le message le plus long ne sont pas pratiques, car une exigence clé pour les résumés de messages est qu'ils sont d'une petite taille fixe, qui est souvent beaucoup plus petite que les messages digérés eux-mêmes.

Cependant, si pour une raison quelconque vous avez besoin de convertir un petit message en un code exempt de collisions et dont le message est difficile à récupérer, ce qui précède serait un moyen de le faire.

1
Kaz