столкновение subr md5 - PullRequest
       23

столкновение subr md5

6 голосов
/ 13 января 2011

Мне нужен хэш из 4 символов. На данный момент я беру первые 4 символа хеша md5(). Я хэширую строку длиной 80 символов или меньше. Приведет ли это к столкновению? или какова вероятность столкновения, если я хэширую менее чем 65 536 (16 4 ) различных элементов?

Ответы [ 3 ]

5 голосов
/ 24 января 2011

Ну, каждый символ md5 - это шестнадцатеричный бит.Это означает, что он может иметь одно из 16 возможных значений.Таким образом, если вы используете только первые 4 "шестнадцатеричных бита", это означает, что вы можете иметь 16 * 16 * 16 * 16 или 16^4 или 65536 или 2^16 возможности.

Таким образом, это означает, что общее доступное «пространство» для результатов составляет всего 16 бит в ширину.Теперь, согласно Атака на день рождения / Проблема , есть следующие шансы на столкновение:

  • 50% шанс -> 300 записей
  • 1% шанс -> 36 записей
  • 0.0000001% шанс -> 2 записей.

Так что вероятность столкновений довольно высока.

Теперь вы говорите, что вам нужен хэш из 4 символов.В зависимости от конкретных требований вы можете сделать:

  • 4 шестнадцатеричных бита для 16^4 (65 536) возможных значений
  • 4 альфа-бита для 26^4 (456 976) возможных значений
  • 4 буквенно-цифровых бита для 36^4 (1 679 616) возможных значений
  • 4 ascii печатных бита для примерно 93^4 (74 805 201) возможных значений (при условии ASCII 33 -> 126)
  • 4 полных байта для 256^4 (4 294 967 296) возможных значений.

Теперь то, что вы выберете, будет зависеть от фактического варианта использования.Нужно ли передавать хеш в браузер?Как вы храните его и т. Д.

Я приведу пример каждого из них (на PHP, но должно быть легко перевести / посмотреть, что происходит):

4 Hex-Биты :

$hash = substr(md5($data), 0, 4);

4 буквенных разряда :

$hash = substr(base_convert(md5($data), 16, 26)0, 4);
$hash = str_replace(range(0, 9), range('S', 'Z'), $hash);

4 буквенно-цифровых разряда :

$hash = substr(base_convert(md5($data), 16, 36), 0, 4);

4 бита Assci для печати :

$hash = hash('md5', $data, true); // We want the raw bytes
$out = '';
for ($i = 0; $i < 4; $i++) {
    $out .= chr((ord($hash[$i]) % 93) + 33);
}

4 полных байта :

$hash = substr(hash('md5', $data, true), 0, 4); // We want the raw bytes
1 голос
/ 13 января 2011

Удивительно высокий действительно. Как вы можете видеть из этого графика приблизительной вероятности столкновения (формула со страницы википедии ), всего несколько сотенэлементы, ваша вероятность столкновения составляет более 50%.

Обратите внимание, конечно, если вы сталкиваетесь с возможностью того, что злоумышленник предоставит строку, вы, вероятно, можете предположить, что она на 100% - сканирование, чтобы найтиСтолкновение в 16-битном пространстве поиска может быть выполнено практически мгновенно на любом современном ПК.Или даже любой современный сотовый телефон, если на то пошло.

0 голосов
/ 13 января 2011

4 первых символа содержат 4 * 4 = 16 бит данных, поэтому столкновение будет определенно в 65536 элементах, и, благодаря атаке на день рождения, оно будет найдено намного быстрее. Вы должны использовать больше битов хэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...