Я пытаюсь создать динамический аватар для пользователей моего сайта. Что-то вроде 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 двух разных писем?
Поскольку цель здесь состоит в том, чтобы использовать хеш для его уникальности, а не его криптографической силы, MD5 является приемлемым. Хотя я все еще не рекомендовал бы это.
Если вы решите использовать MD5, используйте глобально уникальный идентификатор, которым вы управляете, а не предоставленный пользователем адрес электронной почты вместе с солью.
то есть
$salt = 'random string';
$hash = md5($salt . $userId);
Тем не мение:
Вы используете StackOverflow в качестве примера.
Профили пользователей на этом сайте выглядят так: http://stackoverflow.com/users/2805376/shafizadeh
Так что же плохого в том, что URL-адреса аватара http://your_site/users/2805376/avatar.png
? Внутреннее хранилище может быть просто /path/to/images/002/805/376.png
Это гарантирует уникальное имя и дает вам очень просто и простой в работе способ хранения, определения местоположения и обращения идентификатора, назначенного изображениям, обратно пользователю.
Это фактически то, что делает Gravatar (это был стандартный способ получить аватар в Stackoverflow). Посмотри на Реализация граватаров.
Вероятность столкновения на практике незначительна, достаточно сложно преднамеренно подделать две (двоичные) строки, которые приводят к одному и тому же MD5, а EMails ограничены по размеру и символам.
Одна из проблем этого подхода — то, что упомянул Фред-ий, потому что перебор MD5 очень быстрый (100 Гига MD5 в секунду), кто-нибудь может попытаться найти оригинальный адрес электронной почты, чей MD5 теперь виден. Для коротких писем это будет работать в разумные сроки.
Используя UUID может быть хорошей альтернативой извлечению из адреса электронной почты. Вы можете создать такой идентификатор без доступа к базе данных и быть уверенным, что вы не получите дубликат.