Question:
Pouvez-vous déterminer l'ampleur des changements en comparant deux hachages?
Maria Ahmed
2020-02-19 16:45:39 UTC
view on stackexchange narkive permalink

Je me rends compte qu'une fonction de hachage est une fonction à sens unique, et que les changements dans le hachage sont supposés nous dire que les données d'origine ont changé (que tout le hachage change même au moindre changement de données).

Mais y a-t-il un moyen de savoir dans quelle mesure les données d'origine ont changé lorsque deux hachages sont différents?

Les réponses que vous obtiendrez ici s'appliquent aux fonctions de hachage cryptographique.Gardez à l'esprit qu'il existe d'autres types de fonctions de hachage avec des propriétés différentes, telles que le hachage perceptif pour les images.
Définir un "résumé différentiable" n’est pas trivial et spécifique à l’application. En gros, vous demandez un algorithme de compression à très perte.Un exemple est un programme qui prend une photo ou une image et la réduit essentiellement à (par exemple) 64x64px (donnant une «taille de hachage» de 12KiB).Ensuite, une image différente, mais visuellement similaire, ayant reçu le même traitement aura alors une représentation 64x64px très similaire et une mesure de «différence» peut alors être dérivée (par exemple en comparant des histogrammes de pixels).C’est cependant un exemple élémentaire.Voir également https://stackoverflow.com/q/6499491/159145
Surtout lorsque le sel est utilisé, il n'y a aucune chance de trouver la différence.
[w-shingling] (https://en.wikipedia.org/wiki/W-shingling).MinHash et SimHash étant des applications pratiques.
Tous les négatifs concrets ici sont dans le contexte d'une fonction de hachage sécurisée;ceci étant un site de questions / réponses InfoSec, cela a du sens.Cependant, le type de construction que vous demandez existe sous plusieurs formes et a de nombreuses applications utiles.Par exemple, [hachage sensible à la localité] (https://en.wikipedia.org/wiki/Locality-sensitive_hashing) peut être utilisé pour déterminer de manière probabiliste à quel point deux entrées sont similaires.
Peut-être que les hachages ne sont pas le moyen de découvrir la différence.Si c'est ce que vous recherchez, consultez https://en.wikipedia.org/wiki/Levenshtein_distance
@Mark +1 veuillez préciser dans une réponse?
Huit réponses:
MechMK1
2020-02-19 17:10:24 UTC
view on stackexchange narkive permalink

Non, au moins avec une bonne fonction de hachage.

Vous pouvez le tester vous-même en créant un hachage sur un ensemble de données spécifique, puis un hachage modifié sur un ensemble de données différent. Vous verrez que chaque bit de la fonction de hachage résultante a environ 50% de chances d'être retourné.

Je vais le démontrer en créant le hachage SHA-256 de la chaîne MechMK1 :

  $ echo -n "MechMK1" | sha256sum2c31be311a0deeab37245d9a98219521fb36edd8bcd305e9de8b31da76e1ddd9  

Lors de la conversion ce en binaire, vous obtenez le résultat suivant:

  00101100 00110001 10111110 00110001 00011010 00001101 11101110 1010101100110111 00100100 01011101 10011010 10011000 00100001 10010101 0010000111111011 00110110 11101101 11011000 10111100 11010011 00000101 1110100111011110 10001011 00110001 11011010 01110110 11100001 11011101 11011001  

Maintenant, je calcule le hachage SHA-256 de la chaîne MechMK3 , ce qui change un bit du entrée:

  $ echo -n "MechMK3" | sha256sum3797dec3453ee07e60f8cf343edb7643cecffcf0af847a73ff2a1912535433cd  

Une fois converti à nouveau en binaire, vous obtenez le résultat suivant:

  00110111 10010111 110111001 11011101100111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011101110111011001110111011101110111011101110111011101110111011101110111011101110111011101110110011101110111011101100111011101100111011101 11111100 11110000 10101111 10000100 01111010 0111001111111111 00101010 00011001 00010010 01010011 01010100 00110011 11001101  

J'ai comparé les deux résultats et vérifié à quelle fréquence un bit différait des deux hachages, et exactement 128 ou 50% de tous les bits différaient . Si vous souhaitez jouer vous-même avec cela et voir quel type de résultats vous obtenez, j'ai créé un programme C simple qui fait exactement cela.

Ma pensée en lisant la question était "Gee, j'espère bien que non"
Techniquement, cela ne prouve que la moitié de la question.Si le retournement d'un bit provoque le basculement de 50% de tous les bits, mais le basculement de deux bits provoque le basculement de 75% (50% + 0,5 * 50%), alors vous pouvez faire la différence en vous basant sur le fait que des différences plus importantes entraînent plus de changement.Je sais que ce n'est pas vraiment le cas, mais je pense que cela vaut la peine d'être mentionné dans cette excellente réponse par ailleurs.
@Bobson Je pense que les autres réponses, qui vont un peu plus dans la théorie sous-jacente, répondent beaucoup mieux que moi.Je voulais juste faire une démonstration pratique et encourager les gens à essayer des choses par eux-mêmes.
On m'a appris que le terme technique est [diffusion] (https://en.wikipedia.org/wiki/Confusion_and_diffusion).
@Bobson ne pensait pas là - imaginez 100 bits tous les 0.Retournez la moitié des bits au hasard.Nous avons maintenant la moitié et la moitié, 50 0 et 50 1.Maintenant, retournez à nouveau la moitié de tous les bits au hasard - la moitié (en moyenne) de ce que nous retournons sera un 0-> 1 et l'autre moitié a déjà été retournée, nous obtenons donc 1-> 0.Nous restons toujours à ~ 50% 0s et 1s, seule la distribution des bits avec une valeur de 1 change.
@Baldrickk - C'est pourquoi j'ai dit que je savais que ce n'était pas le cas.Mon point était que la réponse ne s'est pas étendue d'un bit à plusieurs bits, donc elle n'a pas exclu un algorithme où les changements des retournements de bits _ étaient_ effectivement corrélés.J'étais probablement trop pédant, cependant.
@Bobson J'ai mis à jour ma [réponse] (https://security.stackexchange.com/a/226118/86735) pour plusieurs changements de bits.Le calcul est facile avec le modèle Oracle aléatoire.
kelalaka
2020-02-19 19:01:17 UTC
view on stackexchange narkive permalink

TL: DR; Dans les fonctions de hachage cryptographique; les hachages de deux messages distincts doivent apparaître statistiquement indépendants. $


Je me rends compte que le hachage est une fonction à sens unique et que le les changements de hachage sont supposés nous indiquer que les données d'origine ont changé (que tout le hachage change, même à la moindre modification des données).

Critères d'avalanche , en plus d'être à sens unique, c'est aussi ce que nous attendons de bonnes fonctions de hachage cryptographique;

  • un petit changement dans l'entrée entraîne des changements dans chacun des bits de sortie avec une probabilité de 50%.

  • changements de bits multiples : c'est un peu délicat, si nous considérez les archives de fonctions de hachage pour modéliser une fonction pseudo-aléatoire selon le modèle d'oracle aléatoire puis nous pouvons considérer chaque changement de bit d'entrée, en moyenne, avec 50%, et peu importe combien de bits sont modifiés .

    On peut voir cela en considérant un bit, et en jetant une pièce si Head vient flip et si Tail vient ne pas retourner 50% du flipping. Maintenant, lancez une autre pièce et faites de même. Le résultat est le même (mathématiques simples).

    Bien sûr, nous ne pouvons pas réaliser le modèle d'oracle aléatoire. Par conséquent, les bits de sortie ne sont pas indépendants les uns des autres. Ils semblent être aussi longs que l'on peut trouver un distinctif et cela constituerait une attaque cryptanalytique contre la fonction de hachage. Une fois trouvé une bonne fonction de hachage cryptographique, vous la verrez dans les actualités.

Prouver qu'une fonction de hachage a des critères d'avalanche est un processus statistique que vous devez tester de nombreuses valeurs d'entrée aléatoires. Toutes les entrées et tous les compléments de bits n'ont pas pour effet de modifier la moitié du bit et ce n'est pas le comportement attendu . Vous devez également montrer que les bits de sortie sont modifiés de manière aléatoire.

Si elle n'est pas satisfaite, cette fonction de hachage peut ne pas satisfaire la résistance de pré-image, la résistance de deuxième pré-image et la résistance de collision * .

  • preimage-resistance - pour pratiquement toutes les sorties pré-spécifiées, il est impossible de trouver une entrée qui hache sur cette sortie, c'est-à-dire de trouver une pré-image x ' tel que h (x') = y lorsqu'il est donné un y pour lequel une entrée correspondante n'est pas connue.
  • 2e préimage résistance, collision faible - il est impossible de trouver une seconde entrée ayant la même sortie que n'importe quelle entrée spécifiée, c'est-à-dire, étant donné x , de trouver une 2e préimage x '! = x tel que h (x) = h (x') .
  • résistance aux collisions, collision forte - il est impossible de trouver deux entrées distinctes x , x ' qui sont hachées vers la même sortie, c'est-à-dire telles que h (x) = h (x ') .

L'échec de chacun peut provoquer des attaques, et s'il réussit, cela peut être dévastateur. Un exemple; considérez que quelqu'un trouve un deuxième message à votre message d'origine qui a la même valeur (ou le hachage des ISO du CD Linux);

  Ceci est un message signé représentant le paiement est de 1,00 $, ayez un belle journéeJe vous paierai 1 000 000,00 $ bonne journée  

Espérons que même SHA-1 et MD5 résistent à cette attaque. Par conséquent, vous pouvez supposer qu'il y a un changement dans les données si la valeur de hachage change. La probabilité qu'un texte aléatoire ait le même hachage avec votre valeur sera négligeable.

Mais y a-t-il un moyen de savoir dans quelle mesure les données d'origine ont changé lorsque deux hachages sont différents?

Espérons que non . S'il y a un seul biais qui donne des informations sur les changements qui peuvent être utilisés par des attaquants intelligents.


* Ce sont des définitions formelles et tirées de l'article fondateur de Rogaway et Shrimpton Bases de la fonction de hachage cryptographique: ...

$ Merci à FutureSecurity pour la simplification

La «résistance aux collisions» est-elle impliquée par la «résistance de la 2e préimage» ou ai-je mal compris?
@Daniel Ces définitions sont tirées de l'article fondateur de Rogaway et Shrimpton [Cryptographic Hash-Function Basics] (https://web.cs.ucdavis.edu/~rogaway/papers/relates.pdf).À la page 4, il y a un graphique simple des relations.La résistance à la collision implique une résistance de 2e pré-image.S'il n'est pas résistant à la 2ème préimage, un attaquant choisit un m1 arbitraire et calcule une seconde préimage m2 pour obtenir une collision.Notez que 2 => 1 nécessite des [soins] spéciaux (https://crypto.stackexchange.com/q/10602/18298)
Ilmari Karonen
2020-02-20 04:54:25 UTC
view on stackexchange narkive permalink

Comme les autres réponses l'ont déjà noté, la réponse est "non" pour les fonctions de hachage cryptographique. Celles-ci sont généralement conçues pour se comporter autant que possible comme une fonction parfaitement aléatoire, et toute similitude détectable dans les sorties de hachage générées pour des entrées similaires permettrait également de distinguer le hachage d'une fonction aléatoire. *

Cependant , il existe d'autres types de fonctions de hachage, telles que les hachages sensibles à la localité, pour lesquels la réponse peut au moins être "oui, parfois".

En particulier, les hachages sensibles à la localité présentent généralement des propriétés telles que «deux entrées différant au plus de δ selon une métrique de similarité auront, avec une probabilité p > 0, des hachages qui diffèrent au plus de ε ( δ ) par une autre métrique de similarité (peut-être la même). " En règle générale, la métrique de distance pour les hachages peut être quelque chose comme distance de Hamming, tandis que la métrique correspondante pour les entrées peut être par ex. modifier la distance. Le choix d'une fonction de hachage adaptée à la localité dépend principalement de la métrique de distance particulière qui vous intéresse.


*) Techniquement, la définition classique d'un hachage cryptographique sécurisé ne nécessite que la résistance aux collisions et la première et la deuxième résistance à la pré-image. Je ne vois aucun moyen évident de prouver qu'une fonction de hachage ne pourrait pas avoir ces propriétés tout en étant également sensible à la localité d'une certaine manière, bien qu'elles imposent des contraintes assez importantes. En particulier, le nombre de sorties de hachage à une distance de ε ( δ ) de toute sortie de hachage donnée H ( x ) devrait croître plus rapidement que le nombre d'autres entrées à distance δ de l'entrée correspondante x pour toute valeur raisonnable de δ , sinon, le simple fait de tester un tas d'entrées similaires entraînerait très probablement une collision. Dans tous les cas, je ne connais aucune fonction de hachage sensible à la localité qui répondrait même à cette définition plus faible de la sécurité cryptographique, et je n'ai aucune idée de ce à quoi un tel hachage pourrait ressembler s'il existait.

schroeder
2020-02-19 16:54:26 UTC
view on stackexchange narkive permalink

Je suis sûr qu'il existe un type de hachage où cela pourrait être possible, mais le but d'un hachage cryptographiquement sécurisé est de s'assurer que cela ne se produit pas. On ne devrait pas être en mesure de faire des suppositions ou des déductions sur les modifications apportées au message en fonction des modifications apportées à la sortie du hachage.

Les analystes cryptographiques mesurent cela par l ' effet d'avalanche. Les hachages forts devraient apporter de grands changements à la sortie même lorsque de minuscules changements sont apportés à l'entrée.

"Je suis sûr qu'il existe un type de hachage où cela pourrait être possible".Pour sûr!Cela existe trivialement.`base64 (input) .substring (0,10)` est techniquement une fonction de hachage.
@Cruncher Heck, il y a eu un temps où les fonctions de hachage par défaut (pour des choses comme les tables de hachage) pour `string` faisaient des choses comme" prendre les quatre premiers octets de la représentation d'octets de la chaîne et les convertir en int ".C'est assez rapide, au moins: P
@Cruncher techniquement `rot13 ()` est une fonction de hachage.Je donnais à l'OP le bénéfice du doute.
@schroeder Puisque rot13 est réversible, je ne suis pas sûr de le considérer comme une fonction de hachage.Nous pensons généralement qu'un hachage a la même taille pour chaque entrée, c'est pourquoi je n'ai pas simplement dit base64 sans la sous-chaîne.Mais de toute façon, c'est la sémantique
@Cruncher selon la définition technique, les hachages n'ont pas besoin d'être à sens unique.Les hachages unidirectionnels doivent être unidirectionnels
@schroeder `Une fonction de hachage est toute fonction qui peut être utilisée pour mapper des données de taille arbitraire à des valeurs de taille fixe .` Ceci est la première ligne de l'article de wikipedia sur la fonction de hachage.Le mappage de données de taille arbitraire à des valeurs de taille fixe sera * toujours * à sens unique (principe de casier)
@Cruncher et c'est une sur-généralisation des hachages cryptographiques.Il existe des hachages qui fournissent des longueurs variables et arbitraires.Les sorties de longueurs fixes ne sont pas une exigence pour un hachage.La plupart des hachages cryptographiques acceptés sont de longueur fixe.
@Cruncher [Fips 202] (https://dx.doi.org/10.6028/NIST.FIPS.202): * la fonction de sortie extensible SHAKE256 est une fonction mappant une chaîne de bits de longueur arbitraire à une chaîne d'une infinité de bits *.On peut toujours considérer qu'elles sont fixes dans le sens où la première sortie et les sorties suivantes sont de taille fixe si l'on considère SHAKE.La nécessité est RSA-PSS et cela nécessite une fonction de hachage non standard.Si les XOF étaient disponibles au moment de la conception, la preuve de sécurité du RSA-PSS serait beaucoup plus facile.
solumnant
2020-02-20 22:48:32 UTC
view on stackexchange narkive permalink

Oui, mais uniquement pour les hachages flous tels que ssdeep https://ssdeep-project.github.io/ssdeep/index.html qui sont spécifiquement conçus pour mesurer la similitude entre les fichiers et les hachages qui ne couvrent que certaines parties du fichier qui n'incluent pas de modifications, telles que imphash https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html. Il existe d'autres types de hachages qui ont été mentionnés dans les commentaires de la question, mais comme je ne les connais pas, leurs propriétés et leur utilisation, je ne les aborderai pas ici. N'hésitez pas à ajouter à cette réponse si vous avez d'autres types de hachages que je ne viens pas de couvrir.

En dehors des hachages spécialisés qui sont soit conçus pour suivre la similitude, soit qui ne couvrent pas toute l'entrée , la réponse serait non selon les réponses de kelalaka ou de MechMK1 à ce post. Il est possible que mes fonctions décrites ne soient pas de véritables fonctions de hachage, mais elles sont nommées comme des fonctions de hachage au sein de ma communauté.

James Kirkby
2020-02-20 15:34:14 UTC
view on stackexchange narkive permalink

Une fonction de hachage forte devrait avec un petit changement entraîner une grande différence dans le hachage de sortie, cela dit que si vous voulez vérifier la différence entre deux valeurs, vous pouvez utiliser un algorithme de distance de martelage

https://en.wikipedia.org/wiki/Hamming_distance

Graham
2020-02-21 17:16:55 UTC
view on stackexchange narkive permalink

Vous pouvez, mais ce n'est pas purement une fonction de hachage.

Les codes de correction d'erreur sont un type de fonction de hachage qui permet non seulement de modifier un message pour être détecté, mais aussi permettre de corriger ces changements. Les modifications ne peuvent être corrigées que pour un certain degré d'erreur, bien sûr. En général, plus le code de correction d'erreur est grand par rapport au message, plus les changements peuvent être détectés et corrigés.

Les codes de correction d'erreurs sont optimisés pour cette capacité à corriger les changements. Cela signifie cependant qu'ils peuvent ne pas être optimaux pour détecter les modifications apportées à un message lorsque la modification ne peut pas être corrigée. Ils sont principalement destinés à servir de hachage pour les messages où la retransmission n'est pas facilement possible, et par conséquent la récupération du message d'origine est la priorité. Ils supposent également qu'aucune attaque intentionnelle sur le message ne se produira.

Les hachages cryptographiques, ou même les hachages moins sécurisés tels que CRC, ont tendance à fonctionner différemment. En général, ils sont utilisés soit dans des situations où la retransmission d'un message défectueux peut être demandée, soit lorsqu'il existe un risque d'attaque intentionnelle et que les messages défectueux doivent être détectés et rejetés de manière robuste. Ce sont toujours des fonctions à sens unique, et le degré auquel elles sont "à sens unique" indique leur robustesse. Comme les réponses précédentes l'ont dit, un bon hachage cryptographique ne vous fournira aucune information sur le message d'origine.

"ou même les hachages moins sécurisés comme CRC ont tendance à fonctionner différemment (de ECC)" - non.Un CRC a la même structure qu'un code de correction d'erreur.En règle générale, il n'identifie pas l'erreur de manière unique, même sous une restriction telle que "erreurs sur un seul bit", mais il se prête très bien à l'exécution * a * de "correction" et à la recherche d'un message conforme au CRC.
cmm
2020-02-22 21:03:11 UTC
view on stackexchange narkive permalink

Hash ne signifie pas toujours Hash cryptographique

Vous pouvez construire une fonction de hachage spécifique à l'objectif.

Pensez à faire une comparaison octet par octet des fichiers et à incrémenter le hachage pour chaque différence. Ajoutez la différence de longueur. C'est une fonction de hachage qui fournit un calcul unidirectionnel qui se rapporte directement au degré de différence.

Si vous voulez une fonction de hachage plus intelligente, essayez "diff file1 file2 | wc -l".



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...