Можно ли вычислить хеш строки, если он содержит этот хеш? - PullRequest
1 голос
/ 07 октября 2011

Сегодня я поймал себя на том, что пытаюсь создать документ JSON следующим образом:

{
    'a' : 1,
    'b' : 2,
    'hash' : (some hash value),
}

Где значение hash - это хэш самого документа JSON.Очевидно, что это будет непросто, потому что значение хеш-функции меняет хеш документа.Я почти уверен, что есть лучший способ сделать то, что я пытаюсь сделать, но просто ради ухмылки, мне искренне любопытно, есть ли способ сделать это.

Так есть ли способ, которым я могуустановить хэш для SHA1 / MD5 (или, на самом деле, любой обычной функции хеширования / снятия отпечатков), чтобы он был равен хешу результирующего документа?

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

Существует также проблема эквивалентных документов JSON.В большинстве случаев, например, документы:

{'a':1,'b':2}

и

{'b':2,'a':1}

эквивалентны, но их строки, вероятно, будут производить разные хэши.Это указывает на необходимость канонизации эквивалентных документов в одну и ту же форму перед применением хэш-функции.

Другая проблема возникает в документах JSON, в которых значение 'hash' (или ключ, который будет содержать хэш) означает что-тоеще, например:

{'a':1,'hash':'this is not a hash'}

Как такой документ может содержать хэш, если не использовать другое имя для ключа хеша?Действительно, это кажется невозможным.

1 голос
/ 07 октября 2011

Это довольно тесно связано с нахождением прообраза криптографически защищенной хеш-функции, и поэтому я думаю, что лучшее, что вы, вероятно, собираетесь сделать, это попробовать атаку методом "грубой силы" (начните угадывать хэши и проверяйтебудет ли f (xhy) = h исчерпывающим, пока вы не найдете h, который работает с вашими x и y, или пока не докажете, что ничего не существует).

1 голос
/ 07 октября 2011

Любой документ, который я построил со встроенным хешем, всегда исключает сам хеш из расчета.Например, при построении текстового файла первая или последняя строка является хеш-значением, а оставшаяся часть файла - это то, что хэшируется, например:

B23128AB
SomeTextHere
SomeMoreText

где Hash ("SomeTextHere \ r \ nSomeMoreText\ r \ n ") = B23128AB

Я ожидаю, что вам, вероятно, потребуется сделать то же самое для вашего объекта JSON.

Это все еще безопасно, так как если либохэш-значение или другое содержимое повреждено (неважно, какое), тогда ваша процедура проверки завершится неудачей.

...