Хэш-коллизия - каковы возможности?

27
задан vbence 28 March 2014 в 13:04
поделиться

10 ответов

Если Вы предполагаете, что SHA-1 делает хорошее задание, можно прийти к заключению, что существует 1 в 2^160 шанс, что два данных сообщения имеют тот же хеш (так как SHA-1 производит 160-разрядный хеш).

2^160 смехотворно большое количество. Это примерно 10^48. Даже если у Вас есть миллион записей в Вашей базе данных, это - все еще 1 в 10^42 шанс, что новая запись совместно использует тот же хеш.

SHA-1 оказался довольно хорошим, таким образом, я не думаю, что необходимо волноваться о коллизиях вообще.

Как примечание стороны, используйте PHP's функция raw_output при использовании SHA-1, когда это приведет к более короткой строке и следовательно сделает операции базы данных немного быстрее.

РЕДАКТИРОВАНИЕ: Для обращения к парадоксу дня рождения база данных с 10^18 (миллион миллионов миллиона) записи имеет шанс приблизительно 1 в 0.0000000000003 из коллизии. Действительно не стоящий волнения о.

27
ответ дан Artelius 28 November 2019 в 04:28
поделиться

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

Это позволяет Вам использовать разумные значения, когда говорящий с DB без любой коллизии , большая безопасность, когда говорящий с клиентом и уменьшает Вашу вероятность для приземления на thedailyWTF approximatly 2^160.

См. также Обстрел Гвоздя: Старая Обувь или Стеклянная Бутылка? !

16
ответ дан David Schmitt 28 November 2019 в 04:28
поделиться

Если Вы используете численно увеличивающиеся идентификаторы, как введено, то возможности являются практически нулевыми, что SHA-1 столкнется.

, Если идентификатор является единственным входом, то SHA-1, кажется, некоторое излишество - создание хеша на 160 битов от 32-разрядного целого числа. Я использовал бы модульное возведение в степень, например, выбрал большой (32-разрядный) главный p, вычислите модульный генератор g той группы, и затем используйте g^id. Этому гарантируют свободную коллизию, и только даст 32-разрядные "хеши".

5
ответ дан Martin v. Löwis 28 November 2019 в 04:28
поделиться

почему бы не что-то, что гарантии там не будут никакими коллизиями, а также удостоверяются, что никто не может изменить ПОЛУЧИТЬ параметр для просмотра чего-то, которое они не были должны: использование соли, объедините идентификатор и его хеш.

$salt = "salty";
$key = sha1($salt . $id) . "-" . $id;
// 0c9ab85f8f9670a5ef2ac76beae296f47427a60a-5

, даже если Вы действительно случайно натыкаетесь на два числа, которые имеют тот же самый хеш sha1 (с Вашей солью), тогда $key будет все еще отличаться, и Вы избежите всех коллизий.

14
ответ дан nickf 28 November 2019 в 04:28
поделиться

SHA-1 производит обзор 160 битов длиной. Поэтому Вы в безопасности, пока у Вас есть меньше, чем 2^ (160/2) записи. Подразделение 2 происходит из-за парадокс дня рождения .

4
ответ дан Szere Dyeri 28 November 2019 в 04:28
поделиться

От первых принципов:

SHA-1 производит 160-разрядный обзор. Принятие его использует все разрядное пространство равномерно (который является, по-видимому, что это было разработано, чтобы сделать), который является только 2^-160, случайно натыкаются на каждого, вставляют это, Вы получили бы коллизию.

Так для каждого вставляют, должно быть безопасно предположить, что нет никакой коллизии и соглашения с ошибкой, если существует.

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

День рождения Paradox предполагает, что шанс того, чтобы там быть по крайней мере одной коллизией в Вашей базе данных выше, чем Вы предположили бы из-за O (N^2) возможные коллизии.

4
ответ дан Oddthinking 28 November 2019 в 04:28
поделиться

Другие комментарии касались Вас на вероятностях, однако при рассмотрении этого практично тогда, можно получить определенный ответ для себя.

Вы сказали себя, что собираетесь быть хешированием Ваших последовательных идентификаторов. Было бы легко кодировать тестовый сценарий. Выполните итерации через ~100 000 000 идентификаторов и проверку на коллизии. Это не заняло бы много времени делать. С другой стороны, у Вас могла бы закончиться четверть памяти пути через.

0
ответ дан Josh 28 November 2019 в 04:28
поделиться

Задайте вопрос, что будет он стоить Вам, если будет коллизия. Если это - прекрасный бесплатный сайт. Если бы Вы выполняете денежный бизнес создания, и сверхобряд будет стоить Вам контракта за миллион долларов тогда, я думал бы снова.

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

Один путь к сделать это должно поместить идентификатор и хеш идентификатора (с некоторыми дополнительными данными) в ссылке.

, Например: (мой PHP ржав, таким образом, общий алгоритм был бы:)

id   = 5;
hash = hash("My Private String " + id)
link = "http://mySite.com/resource?id=" + id + "&hash=" + hash

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

1
ответ дан Martin York 28 November 2019 в 04:28
поделиться

Я не думаю, что sha1 () собирается дать Вам любую проблему здесь, слабая генерация случайных чисел является более вероятным кандидатом на коллизии.

Stefan Esser записал хороший статья о теме.

0
ответ дан Waquo 28 November 2019 в 04:28
поделиться

If you have to obfuscate some data in your url to hide data, you are doing something wrong.

2
ответ дан 28 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: