Есть ли библиотека, которая будет создавать строку, которая будет хешировать (SHA1) для заданного ввода?

Мне интересно, можно ли найти блок текста, который будет хэшировать до известного значения. В частности, я ищу функцию CreateDataFromHash(), которую можно было бы вызвать следующим образом:

unsigned char myHash[] = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
unsigned int length = 10000;
CreateDataFromHash(myHash, length);

Здесь CreateDataFromHash вернет строку длиной 10000, содержащую произвольные данные, которые будут хешированы в myHash с помощью SHA1.

Спасибо.


person user1188404    schedule 23.03.2012    source источник
comment
Если бы существовал способ сделать это за разумное время, шифрование не сработало бы.   -  person Collin    schedule 23.03.2012
comment
Хорошая попытка, АНБ. Вам просто нужно будет провести собственное исследование.   -  person Matt K    schedule 23.03.2012
comment
Вы должны использовать грубую силу. См. stackoverflow.com/questions/7031288/   -  person Patrick Lorio    schedule 23.03.2012
comment
зачем вам это нужно ... может быть, если бы мы знали, чего вы пытаетесь достичь, мы могли бы предложить альтернативные способы, потому что, как вы можете прочитать ниже, у вас будет очень тяжелое время (очень долгое время журнала в что) сделать это   -  person scibuff    schedule 23.03.2012
comment
На самом деле, в MD5 и SHA1 есть уязвимости, но я думаю, что все они полагаются на исходный текст, который хешируется до этого значения, и они все равно занимают неимоверное количество процессорного времени.   -  person Matt K    schedule 23.03.2012
comment
@mkb: на самом деле существует атака столкновений против MD5, которая может выполняться примерно за час даже на более старой машине (например, Pentium IV).   -  person Jerry Coffin    schedule 23.03.2012
comment
кроме забавы и исследования, может ли кто-нибудь придумать не гнусную причину, чтобы хотеть найти хеш-коллизию? Даже если вы ответите, что я хочу проверить надежность моего существующего хэша, мой ответ будет таким: если вы беспокоитесь о безопасности своего хэша, используйте более сильный хэш.   -  person Walter Stabosz    schedule 23.03.2012
comment
Этот конкретный хэш является sha1 пустой строки.   -  person President James K. Polk    schedule 24.03.2012
comment
Обратите внимание, что, хотя функция SHA-1 была ослаблена, не известно ни об одном столкновении SHA-1 (по состоянию на 25 марта 2012 г.). Расчет коллизий SHA-1 в настоящее время является академическим, и если IAIK Gratz является каким-либо примером, академические исследования также терпят неудачу. Однако он был достаточно ослаблен, чтобы переключиться на SHA-2 или 3 для подписей.   -  person Maarten Bodewes    schedule 25.03.2012
comment
mkb, я на самом деле знаю исходный хеш и исходные данные, так что вы знаете какие-нибудь ссылки, чтобы прочитать его?   -  person user1188404    schedule 26.03.2012


Ответы (5)


В общем, не существует известного простого или даже умеренно сложного способа сделать это.

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

Например, этот метод суммирования MD5 найдет коллизии (но не входные данные для заданного вывода). примерно за 8 часов на компьютере с частотой 1,6 ГГц.

В частности, для SHA-1 вам может быть интересно прочитать это .

person George Skoptsov    schedule 23.03.2012

Одна из целей SHA1 заключается в том, что это должно быть очень сложно сделать.

person Andreas Brinck    schedule 23.03.2012
comment
Существуют ли какие-либо другие цели алгоритма хеширования? - person jalf; 23.03.2012
comment
Хранение паролей — не единственное использование хэшей. - person Andreas Brinck; 23.03.2012
comment
Да, но все варианты использования хэшей зависят от невозможности форсировать коллизии. - person jalf; 23.03.2012
comment
Насколько сложно вызвать столкновение, будет зависеть от алгоритма хеширования и длины хеша. - person Andreas Brinck; 23.03.2012
comment
@jalf Нет. Еще одна цель - равномерно распределить входные данные по диапазону. В хэш-таблицах возможность форсирования коллизий обычно не имеет значения (если только вы не хотите защищаться от DOS-атак посредством злонамеренного пользовательского ввода на веб-сервере… это является настоящей проблемой!). - person Konrad Rudolph; 23.03.2012
comment
@KonradRudolph: но опять же, если опять же, в хеш-таблице ваша производительность зависит от равномерного распределения данных. Чего может и не быть, если алгоритм хеширования ошибочен таким образом. :) Ваши предположения о том, что хэши будут распределены равномерно, будут сняты, как только появится способ надежно генерировать коллизии. - person jalf; 23.03.2012
comment
@jalf Не совсем. Например, если я знаю свой входной домен, я мог бы использовать идеальный генератор хэшей для этих входных данных, чтобы сгенерировать идеальный спред. В этом случае меня не волнует, генерируют ли все другие потенциальные входные данные коллизии. В общем, идеальный разброс не исключает (даже преднамеренных) столкновений. Это имеет место только в том случае, если нам явно нужно предотвратить злонамеренные или неблагоприятные варианты использования (яркий пример этого: реализации быстрой сортировки, которые регрессируют на почти отсортированных данных… Однажды у iTunes была эта проблема). - person Konrad Rudolph; 23.03.2012

хеширование является односторонней функцией. вы не можете получить ввод из вывода.

person Anurag Ramdasan    schedule 23.03.2012
comment
Речь идет не о том, чтобы вернуть исходный ввод. - person Cat Plus Plus; 23.03.2012
comment
Уверены, что можете получить ввод из вывода, когда-нибудь слышали о таблицах Rainbow? en.wikipedia.org/wiki/Rainbow_table - person Walter Stabosz; 23.03.2012
comment
Уолтер, у вас есть документ о том, как это можно использовать для SHA1? - person user1188404; 23.03.2012
comment
В этом нет ничего сложного. 1. Получить радужный список хэшей SHA1 (этот файл будет размером в десятки гигабайт), 2. получить программу, которая будет запускать ваш хэш по списку. 3. Ждать часами, пока программа работает. Я не делал этого годами, поэтому на современных процессорах время ожидания может быть меньше. - person Walter Stabosz; 23.03.2012

Это будет «атака прообраза». Ничего подобного публично не известно против SHA-1.

Единственная известная атака на SHA-1 — это атака столкновением. Это означает, что я нахожу два входа, дающих один и тот же результат, но ни один из них, так сказать, не предопределен. Тем не менее, эта атака на самом деле не осуществима для большинства людей — исходя из количества задействованных вычислений, самое близкое, что я могу предположить, это то, что вам придется потратить где-то в диапазоне несколько миллионов долларов, чтобы построить машину, которая даст вам примерно одну конфликтующую пару ключей в неделю (при условии, что он работает, ничего не делая 24/7).

person Jerry Coffin    schedule 23.03.2012
comment
Мне просто нужно добавить, что речь идет не о получении правильной строки данных. Но может это не имеет значения, когда дело доходит до времени? - person user1188404; 23.03.2012
comment
@ user1188404: Да, вернуть исходную строку невозможно даже теоретически, кроме как случайно. Это просто поиск пары входных данных a, дающих один и тот же результат (фактически, найденные конфликтующие пары обычно имеют длину всего несколько байтов). - person Jerry Coffin; 23.03.2012

Вы должны использовать грубую силу. Видеть

Генератор паролей для перебора PHP

Получить строку, сделать хэш, сравнить, повторить

person Patrick Lorio    schedule 23.03.2012
comment
Или погуглите хеш-строку и посмотрите, не сделал ли это уже кто-то: P - person jcoder; 23.03.2012