Содержание
Как узнать адрес электронной почты пользователя Gravatar, имея лишь под рукой его комментарий на каком-нибудь сайте? До сегодняшнего момента это оставалось практически невозможным, за исключением того случая, если пользователь сам не оставил свой адрес электронной почты в публичном профиле. А открыть публичный профиль пользователя Граватар можно следующим образом. Открыть ссылку: http://gravatar.com/MD5-хэш.php, найти там логин preferredUsername и подставить его в ссылку вида: http://www.gravatar.com/логин - получим ссылку на персональную страницу пользователя в Gravatar. Нет там адреса электронной почты? Но очень надо? Тогда поможет сервис по вычислению адресов электронной почты пользователей сервиса Gravatar.
Этот сервис получился экспромтом в результате одного эксперимента, целью которого было ответить на вопрос: насколько безопасно Gravatar хранит ваш адрес электронной почты и насколько реально расшифровать все адреса всех пользователей Gravatarа (подробности на Habrahabr)! Интересно? Вот подробности:
Как работает Gravatar
Схема не мудренная: пользователь регистрируется в сервисе Gravatar и сохраняет там свой аватар и адрес электронной почты. Теперь, когда он хочет оставить комментарий на сайте или блоге, он лишь указывает свой адрес электронной почты! Скрипт сайта шифрует этот адрес электронной почты и отправляет его на сервер Gravatar, откуда тот возвращает картинку-аватар!
Если мы откроем исходную страницу с картинкой Gravatar, то увидим примерно следующее:

Как видим, картинка загружается с адреса:
http://www.gravatar.com/avatar/05933ec7a23f6ebd2017490abfbcd3f3
и, по сути, содержит один единственный ключ, который и идентифицирует пользователя в системе Gravatar! Но что это за ключ? Это MD5-хэш от самого почтового адреса пользователя! То есть, это и есть сам адрес электронной почты, зашифрованный алгоритмом MD5.
Алгоритм шифрования MD5 есть на всех языках программирования. Вот как это работает на PHP:
md5("[email protected]")
В результате функции мы получим 32-значное шестнадцатеричное число, это и есть MD5-хэш!
05933ec7a23f6ebd2017490abfbcd3f3
Теперь, подставлям MD5-хэш в ссылку сервиса Gravatar, чтобы получить урл картинки:
http://www.gravatar.com/avatar/05933ec7a23f6ebd2017490abfbcd3f3
И обрамляем урл атрибутами картинки, чтобы отобразить ее на своем сайте:
<img src="http://www.gravatar.com/avatar/05933ec7a23f6ebd2017490abfbcd3f3" />
Таким вот нехитрым образом Gravatar и работает! Разумеется, есть различные параметры, которые можно передать в урле на сервер Gravatar для получения дополнительной информации: например, размер картинки, рейтинг и т.д. Но это ключевой момент, который нам и понадобится для понимания того, о чем мы будем говорить далее.
О расшифровке MD5
Алгоритм хэширования MD5, используемый сервисом Gravatar, предназначен в первую очередь для сокрытия адреса электронной почты пользователя. Его особенностью является "однонаправленность", то есть функцией MD5 мы можем получить (зашифровать) хэш (отпечаток) какого-либо слова, но не можем его получить (расшифровать) обратно! То есть, разобрать, что же именно мы зашифровали в хэш "05933ec7a23f6ebd2017490abfbcd3f3" - невозможно никакой математической функцией.
Вы уже наверное слышали, что на сайтах пароли не хранятся в открытом виде и их не может знать даже администратор сайта? Все верно, поскольку пароли хранятся как раз в хэшированном виде (32-значное шестнадцатеричное число). Во время регистрации на сайте, вы придумываете себе пароль, скажем "Mypass15" и в базу данных заносится MD5-хэш вашего пароля. В нашем случае так:
ec621170affc1ab50f991d5599d808a9
Эта строка и есть ваш пароль, но что в ней зашифровано - знаете только вы!
А как же осуществляется авторизация?
При вводе пароля во время авторизации он снова хэшируется:
md5("Mypass15")
и получится опять та же самая MD5-хэш сумма:
ec621170affc1ab50f991d5599d808a9
Теперь эта строчка сравнивается с той, что уже занесена в базу данных сайта во время регистрации. Поскольку эти строки идентичны (буква в букву, цифра в цифру), то и пароль ваш верный, так вы проходите проверку подлинности. При всем этом, что пароль у вас "Mypass15" - знаете только вы!
Хранение паролей пользователей в некоторых движках сайтов все еще осуществляется с помощью алгоритма MD5, хотя сам алгоритм уже заметно устарел (появился в 1991 году) и вместо него есть довольно-таки хорошие альтернативы. Но в Gravatar, при шифровании адреса электронной почты, используется (по старинке) именно этот пресловутый алгоритм!
И хотя не существует математической функции декодирования MD5, существует тем не менее несколько методов его "взлома". Все эти методы основаны на подборе/переборе/сравнении. Например, мы можем взять огромную базу уже готовых MD5-хэшей всякого рода слов и паролей и в этой базе простым поиском найти на соответствие MD5-хэш. Или можем делать перебор разных символов по заранее подготовленному словарю и сравнивать на соответствие MD5-хэши. Но это в теории все так просто, а на практике, это требует больших аппаратных мощностей и времени. Так, например, пароль "12345" будет "взломан" МГНОВЕННО, а вот на перебор пароля "$12345s" уйдет 3 минуты времени, "$12345sS" - 3 дня, а вот "$123/s*S" уже 20 дней, а "$1sS*/[0}." потянет на все 526 лет! В общем, сложность своего пароля с учетом развития современных компьютеров, можете проверить по ссылке - https://howsecureismypassword.net/
Расшифровка Граватаров: теория
Мы уже уяснили, что адрес электронной почты пользователя Gravatar зашифрован в самой картинке. И если бы возникла необходимость узнать этот адрес электронной почты, мы бы использовали все свои силы и знания в области "взлома" MD5-хэша.
Впрочем, в нашем случае (в случае с Gravatar), в построении MD5 хэша есть некоторая закономерность в отличии от замысловатого пароля, соответственно и расшифровать его будет легче: так, мы знаем, что это адрес электронной почты и знаем перечень всех символов, которые могут использоваться в нем. Также знаем структуру: это две части, разделенные символом «@», левая часть обычно логин пользователя, а правая - доменное имя того сервера, на котором расположен почтовый ящик (их в сумме будет не так уж много, если брать во внимание самые распространенные: yandex.ru, mail.ru, gmail.com и т.д.). Но даже это не спасает ситуации: при таком раскладе вещей и такой скорости распознавания много адресов из Gravatar не вытянешь.
Есть ли еще варианты, более быстрые и эффективные? В поисках ответа на этот вопрос, меня вдруг посетила мысль: если адреса электронных ящиков ВСЕХ пользователей интернета рано или поздно где-то засветились (в поиске, в спам-базах, в переписке с друзьями и т.д.), то теоретически можно собрать ВСЕ адреса (ну или почти все) со всего интернета в единую базу, перевести все эти адреса в единую большую базу MD5-хэшей, а потом каждый MD5-хэш проверить на наличие в базе Gravatar!
Вскоре, взвесив некоторые доводы "за" и "против", я понял, что по скорости распознавания адресов электронной почты пользователей Gravatar, это будет самый эффективный и дешевый метод. Оставалось продумать механизмы и реализовать все это на практике.
Расшифровка Граватаров: практика
На практике создание сервиса по распознаванию адресов электронной почты пользователей Gravatar сводилось к трем пунктам:
- Сбор адресов электронной почты из открытых источников (тут особо не надо напрягаться: в сети полно баз данных адресов электронной почты, взятых оттуда же - из интернета).
- Написание скрипта, проверяющего присутствие конкретного MD5-хэша в базе Gravatar.
- Разработка базы данных - механизма хранения найденных граватаров, для комфортного поиска и работы с полученными данными.
Собрав для пробы публичные электронные адреса, приступил к созданию скрипта проверки MD5-хэша в базе Gravatar. Как узнать, зарегистрирован ли такой-то адрес электронной почты в сервисе Gravatar? Естественно, если мы зашифруем адрес электронной почты в ссылку вида:
http://www.gravatar.com/avatar/05933ec7a23f6ebd2017490abfbcd3f3
мы увидим аватар пользователя, либо дефолтную картинку, что аватара нет. Но как заставить это определять скрипт?
Методом проб и ошибок был выбран запрос к сервису Gravatar по адресу с параметром:
http://www.gravatar.com/avatar/HASH?d=404
При обращении по такому адресу сервис Gravatar вернет ответ 200, если у пользователя есть граватар (если вообще такой пользователь существует) и ответ 404 - если пользователя нет в базе Gravatar. В таком случае пишем скрипт на проверку ответа сервера:
$emailmd5 = md5(strtolower(trim('адрес@электронной.почты'))); $url = 'http://www.gravatar.com/avatar/'.$emailmd5.'?d=404'; $check_url = get_headers($url); if (strpos($check_url[0],'200')){ //получили ответ 200 - такой пользователь есть, записываем его в базу }
Помимо адреса электронной почты и MD5-хэша, в базу данных решено было вносить и логин пользователя Gravatar, поскольку по логину можно сформировать урл на официальную страницу выбранного граватара для получения дополнительных данных. Такой урл, как уже было указано в самом начале, имеет структуру:
http://www.gravatar.com/ЛОГИН
Получить логин можно при обращении к файлу импорта вида:
http://www.gravatar.com/HASH.php
Напишем обработчик, который вырежет требуемую нам переменную под названием - preferredUsername
$str = file_get_contents('http://www.gravatar.com/'.$emailmd5.'.php'); $profile = unserialize($str); if (is_array( $profile) && isset( $profile['entry'] )) $login = $profile['entry'][0]['preferredUsername'];
Итак, у нас есть 3 необходимых значения, для занесения в базу данных, что мы и делаем:
INSERT INTO table_name VALUES ('NULL','$email','$emailmd5','$login');
И это все! Осталось запустить скрипт и подсчитать КПД. Для эксперимента я взял 10 млн. адресов из открытых источников (спам-базы и адреса, попавшие в поиск Google открытым текстом) и проверил их на наличие граватаров (обычным локальным сервером Денвер в многопоточном режиме со скоростью 2 млн. адресов в сутки).
У 3% из них оказался Граватар (было распознано около 300 000 юзеров Gravatar), данные занесли в базу, прикрутили к базе данных поиск и, вуаля: сервис готов! Даже имя получилось тематическое - Граватарус (глобально распознанный аватар). Теперь, при вводе в поисковую строку MD5-хэша, который можно взять на любом сайте, где пользователь оставил комментарий, мы можем найти его адрес электронной почты! Для удобства я реализовал технологию Drag & Drop (перетащи и отпусти) — просто перетащите картинку граватара с любого сайта в окно поиска и нажмите «найти». Смотрите видеоинструкцию.