Возможно ли совпадение MD5 двух разных строк?

Я пытаюсь создать динамический аватар для пользователей моего сайта. Что-то вроде stackoverflow. У меня есть скрипт PHP, который генерирует изображение на основе строки:

path/to/avatar.php?hash=string

Я хочу использовать MD5 электронных писем пользователей в качестве имени их аватаров: (и как эта строка PHP-скрипт генерирует изображение на основе)

$email = $_GET['email'];
$hash  = md5($email);
copy("path/to/avatar.php?hash=$hash","path/img/$hash.jpg");

Теперь я хочу быть уверен, могу ли я использовать MD5 их электронных писем в качестве имени своего аватара? Я имею в виду, нет ли двух разных строк, которые имеют одинаковый вывод MD5? Другими словами, я хочу знать, будет ли вывод двух разных строк уникальным?

Я не знаю, ясен мой вопрос или нет .. Все, что я хочу знать, есть ли возможность дублировать MD5 двух разных писем?

1

Решение

Поскольку цель здесь состоит в том, чтобы использовать хеш для его уникальности, а не его криптографической силы, MD5 является приемлемым. Хотя я все еще не рекомендовал бы это.

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

то есть

$salt = 'random string';
$hash = md5($salt . $userId);

Тем не мение:

  • Еще есть небольшая вероятность столкновения (начиная с 2128 и приближается 264 относительно быстро из-за День рождения парадокс). Помните, что это шанс, гашишN и хэшп + 1 может столкнуться.
  • Не существует разумного способа определить userId из хеша (я не рассматриваю индексирование 128-битных хешей, чтобы вы могли запрашивать их разумно).

Вы используете StackOverflow в качестве примера.

Профили пользователей на этом сайте выглядят так: http://stackoverflow.com/users/2805376/shafizadeh

Так что же плохого в том, что URL-адреса аватара http://your_site/users/2805376/avatar.png ? Внутреннее хранилище может быть просто /path/to/images/002/805/376.png

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

2

Другие решения

Это фактически то, что делает Gravatar (это был стандартный способ получить аватар в Stackoverflow). Посмотри на Реализация граватаров.

Вероятность столкновения на практике незначительна, достаточно сложно преднамеренно подделать две (двоичные) строки, которые приводят к одному и тому же MD5, а EMails ограничены по размеру и символам.

Одна из проблем этого подхода — то, что упомянул Фред-ий, потому что перебор MD5 очень быстрый (100 Гига MD5 в секунду), кто-нибудь может попытаться найти оригинальный адрес электронной почты, чей MD5 теперь виден. Для коротких писем это будет работать в разумные сроки.

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

1