Как расшифровать адрес электронной почты пользователя Gravatar

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

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

Как работает Gravatar

Схема не мудренная: пользователь регистрируется в сервисе Gravatar и сохраняет там свой аватар и адрес электронной почты. Теперь, когда он хочет оставить комментарий на сайте или блоге, он лишь указывает свой адрес электронной почты! Скрипт сайта шифрует этот адрес электронной почты и отправляет его на сервер Gravatar, откуда тот возвращает картинку-аватар!

Если мы откроем исходную страницу с картинкой Gravatar, то увидим примерно следующее:

MD5-хэш адреса электронной почты
MD5-хэш адреса электронной почты в адресе картинки Граватара

Как видим, картинка загружается с адреса:

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 сводилось к трем пунктам:

  1. Сбор адресов электронной почты из открытых источников (тут особо не надо напрягаться: в сети полно баз данных адресов электронной почты, взятых оттуда же - из интернета).
  2. Написание скрипта, проверяющего присутствие конкретного MD5-хэша в базе Gravatar.
  3. Разработка базы данных - механизма хранения найденных граватаров, для комфортного поиска и работы с полученными данными.

Собрав для пробы публичные электронные адреса, приступил к созданию скрипта проверки 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 (перетащи и отпусти) — просто перетащите картинку граватара с любого сайта в окно поиска и нажмите «найти». Смотрите видеоинструкцию.

И в заключение хотелось бы внести некоторую ясность. Сервис не создавался в каких-либо злонамеренных целях (для спама)! Также никто не может нести ответственности за сохранность адреса электронной почты пользователя Gravatar - пользователь осведомлен, что он виден администратору сайта, на котором оставлен комментарий. Заботясь о сохранности персональных данных, я также ограничил результаты поиска и закрыл данные от попадания в поисковый индекс. Сервис сделан для людей в справочных и контактных целях, поэтому, я надеюсь, что многие найдут в нем для себя полезные сведения. А сам сервис Gravatar подумает над тем, как усложнить вышеописанный мной процесс идентификации своих пользователей, ведь следуя моей схеме, возможно заполучить персональные данные (а именно: адреса электронной почты) чуть-ли не всех пользователей Gravatar!

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 голоса, рейтинг: 4,75 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

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

Добавить комментарий

Ваш адрес email не будет опубликован.