md5 — Возвращает MD5 хэш строки


Содержание

Md5 — Возвращает MD5 хэш строки

md5 — Возвращает MD5-хэш строки

Описание

Вычисляет MD5-хэш строки str используя » алгоритм MD5 RSA Data Security, Inc. и возвращает этот хэш.

Список параметров

Если необязательный аргумент raw_output имеет значение TRUE , то возвращается бинарная строка из 16 символов.

Возвращаемые значения

Возвращает хэш в виде 32-символьного шестнадцатеричного числа.

Список изменений

Версия Описание
5.0.0 Добавлен параметр raw_output .

Примеры

Пример #1 Пример использования md5()

if ( md5 ( $str ) === ‘1afa148eb41f2e7103f21410bf48346c’ ) <
echo «Вам зеленое или красное яблоко?» ;
>
?>

Примечания

Замечание: Безопасное хэширование паролей

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

Смотрите также

  • md5_file() — Возвращает MD5-хэш файла
  • sha1_file() — Возвращает SHA1-хэш файла
  • crc32() — Вычисляет полином CRC32 для строки
  • sha1() — Возвращает SHA1-хэш строки
  • hash() — Генерирует хеш-код (дайджест сообщения)

Md5 — Возвращает MD5 хэш строки

Этот алгоритм был разработан в 1991 году профессором Рональдом Л. Ривестом. Алгоритм MD5 часто называют алгоритмом шифрования, но на самом деле это утверждение ошибочно. Главным преимуществом MD5 является то, что зашифрованные данные восстановить нельзя. А что это за алгоритм шифрования, который шифрует данные так, что никто их не сможет узнать? MD5 — это хэш-функция. У многих возник вопрос: что же это такое? Остановимся на этом вопросе.

Что такое Хэш-функция

Предположим, у нас есть некоторый набор данных. Для простоты будем рассматривать натуральные числа от 1 до 10 6 . И пусть есть некоторая функция, в которой один параметр — натуральное число от 1 до 10 6 , а возвращаемое значение — натуральное число от 1 до 1000. Нам не важно, что именно делает эта функция, нам важно то, что она каждому натуральному числу от 1 до 10 6 ставит в соответствие другое натуральное число от 1 до 1000. Для примера рассмотрим одну из самых простых функций, выполняющих это действие:

int hash(long int x)<
if (x%1000==0) return 1000;
return (x % 1000);
>

function hash(x:longint):longint;
begin
if (x mod 1000=0) then hash:=1000 else
hash:=x mod 1000;
end;

Это и есть простая хэш-функция. Если мы знаем параметр функции, то однозначно можем сказать, какой будет результат. А если нам известен результат, то можем ли мы узнать однозначно параметр? Конечно, нет. Для числа 234 параметр может быть 234,1234, 2234,3234… Поэтому однозначно восстановить параметр не получится.

Зачем нужен MD5

Для функции из примера, если известен результат, можно легко найти параметр, для которого будет такой же результат. А вот для функции MD5 это сделать не так-то просто. Т.е. если у нас есть только результат функции MD5, то мы не сможем найти параметр, для которого функция выдаст этот же результат (речь даже не идет про однозначное восстановление параметра). MD5 используют для хранения паролей. Приведу пример, когда хранение паролей в открытом виде опасно. Возьмем сайт «Дистанционное обучение» ( сайт ). На этом сайте проходят городские олимпиады школьников по информатике, ежедневно обучаются сотни школьников и студентов. Во многих школах доступа в Интернет нет, и школьникам необходимо пользоваться услугами сайта либо дома, либо не в своей школе. Поэтому сайт начали устанавливать в самих школах. Т.е. обучение происходит не на самом сайте, а на его копии, установленной в школе. Проблема в том, что вместе с сайтом школа получала пароли всех пользователей (в том числе и администраторов), и этими паролями любой мог воспользоваться для «администрирования» самого сайта. Было два способа решить эту проблему:

1. Перед созданием копии сайта, которая будет перенесена в школу, удалять все пароли.
2. Зашифровать все пароли так, чтобы никто не смог расшифровать их обратно.

Был выбран второй способ. Сейчас пароли хранятся в зашифрованном виде (при помощи MD5). После того, как пользователь введет свой пароль, от пароля вычисляется хэш-функция MD5. Результат сравнивается со значением, хранящимся в базе. Если значения равны, то пароль верен. Еще MD5 можно использовать в качестве контрольной суммы. Предположим, необходимо куда-то скопировать файл. Причем нет никаких гарантий, что файл будет доставлен без повреждений. Перед отправкой можно посчитать MD5 от содержимого файла и передать результат вместе с файлом. Затем посчитать MD5 от принятого файла и сравнить два результата. Если результаты различные, то это означает, что файл или результат был испорчен при передаче. Последнее время MD5 стали использовать интернет-казино. Перед тем, как сделать ставку, игрок получает хэш от результата игры. Когда ставка сделана, игрок получает результат игры (например, выпало число 26). Посчитав от результата хэш-функцию, можно убедиться, что казино сгенерировало это число до того, как игрок сделал ставку. Но не стоит думать, что выиграть в этом казино очень просто. Весь секрет в том что, вероятность выигрыша подобрана таким образом, что игрок почти всегда будет в проигрыше. Пример такого казино: сайт

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

Теперь посмотрим, как именно работает MD5. Для обработки MD5 получает некоторую строку. Эта строка преобразуется в последовательность из нулей и единиц. Как это делается? У каждого символа есть свой номер. Эти номера можно записать в двоичной системе счисления. Получается, каждый символ можно записать как последовательность нулей и единиц. Если этим воспользоваться, получим из строки последовательность из нулей и единиц. Пусть q будет длина получившейся последовательности (ровно 64 бита, возможно, с незначащими нулями). К получившейся последовательности приписывается 1. В результате длина последовательности увеличивается на 1. Затем к последовательности приписываются нули, пока длина не станет по модулю 512 равна 448 (length mod 512=448). Далее к последовательности дописываются младшие 32 бита числа q, а затем — старшие. Длина последовательности становится кратной 512. Полученную последовательность назовем S. Для подсчета результата используются четыре двойных слова (32 бита). Эти двойные слова инициализируются следующими шестнадцатеричными значениями, где первым следует самый младший байт:

A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
Также для подсчета результата используются следующие функции:
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))

X,Y,Z — это двойные слова. Результаты функций, также двойные слова. Для подсчета используется еще одна функция (назовем ее W). Она хитро обрабатывает данные и возвращает результат (подробно ее описывать не буду, т.к. она выполняет серию простых преобразований). Обработка данных происходит с использованием функций F, G, H, I.

На рисунке схематически изображена функция. Слева — входные данные, справа — выходные.

Все необходимые функции и обозначения рассмотрены. Теперь рассмотрим, как происходит просчет результата:
1. Запоминаем первые 512 бит последовательности S.
2. Удаляем первые 512 бит последовательности S (можно обойтись и без удаления, но тогда на первом шаге надо брать не первые 512, а
следующие 512 бит).
3. Вызываем функцию W. Параметры A,B,C,D — это текущие значения соответствующих двойных слов. Параметр T — это запомненные 512 бит.
4. Прибавляем к A A0.
5. B=B+B0.
6. C=C+C0.
7. D=D+D0.
8. Если длина последовательности 0, выходим.
9. Переходим к шагу 1.

После выполнения этого алгоритма A,B,C,D — это результат (его длина будет 128 бит). Часто можно видеть результат MD5 как последовательность из 32 символов 0..f. Это то же самое, только результат записан не в двоичной системе счисления, а в шестнадцатеричной.

В Интернете можно найти много программ, которые обещают найти строку, для которой алгоритм MD5 выдаст заданный результат. Эти программы действительно работают. Ранее отмечалось, что восстановить параметр невозможно. Как же работают эти программы? Они перебирают все возможные строки, применяют к ним алгоритм MD5, а затем сравнивают с образцом. Если значения совпали, это означает, что программа нашла необходимую строку. Но у этих программ есть маленький недостаток. Предположим, известно, что программе придется перебрать все слова длиной в 8 символов, состоящих из маленьких и больших латинских букв. Сколько времени это займет? Сколько всего таких слов? На первом месте может стоять любой из 26*2=52 символов. На 2, 3, 4, 5, 6, 7 и 8 — тоже 52. Значит, всего таких слов будет: 52*52*52*52*52*52*52*52=52 8 =53*10 12 . А если используются не только латинские буквы? То это еще больше. Перебор всех вариантов на обычном персональном компьютере займет очень много времени. В Интернете можно найти сайты, которые по введенному хэшу выдают строку, для которой будет точно такой же хэш. Эти сайты используют базу данных с заранее просчитанными хэшами. Но в базах хранятся не все хэшы, а только самые используемые. Вот один из таких сайтов: сайт Так что советую использовать в качестве пароля абсолютно случайную последовательность символов.

MD5 хэширование в PHP

В этой статье я решил затронуть тему MD5 хэширования, так как тема эта очень простая, интересная и очень-очень важная. Самый простой пример использования MD5 хэша — это шифрование паролей пользователей. Ведь не секрет, что если хранить пароли в открытом виде в базе данных, то при её утере, все пароли пользователей будут украдены, чего не имеет никакого морального права допустить администратор. И вот тут на помощь приходит функция хэширования в PHP.

Функция MD5 хэширования в PHP называется md5(). Принимает функция одну строку, которую необходимо зашифровать. Функция возвращает MD5 хэш:

Запустив данный скрипт, Вы увидите MD5-хэш, соответствующий строке «MyPassword«.

То есть простейший скрипт проверки логина и пароля:

Теперь если Вы пройдёте по ссылке: «http://путь_к_скрипту.php?login=Admin&password=MyPassword«, то увидите: «Welcome!«.

Теперь поговорим о свойствах MD5-хэширования.

  1. MD5-хэш содержит 32 символа
  2. MD5-хэш уникален для каждой строки
  3. Процесс MD5-хэширования необратим
  4. Процесс MD5-хэширования достаточно медлителен

Третий пункт, пожалуй, самый важный, потому что если бы он был обратим, то смысл хэширования практически бы отсутствовал. Глупо шифровать, например, пароли, если их можно легко потом расшифровать.

Четвёртый пункт, как бы это парадоксально не звучало, также является очень большим плюсом. Почему? Очень просто: человек, который будет вынужден подождать этот процесс 0.001 секунды, сильно не пострадает. А вот злоумышленник, который будет перебирать пароли пострадает резко, так как медлительность алгоритма уже задаёт предел — 1000 паролей в секунду. Хотя, безусловно, скорость зависит от быстродействия сервера. Но тем не менее, для злоумышленника низкая скорость получения MD5-хэша — это очень большая проблема.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:


  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 6 ):

    А у меня такой вопрос: не могу сообразить как сделать напоминание пароля, если он хранится в md5. То есть я понимаю что нужно сделать как у вас на сайте, чтобы выдавалась одноразовая ссылка на изменение пароля, но как ее сгенерировать?

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

    Михаил, а ведь сейчас можно расшифровать md5 !

    Нет, Антон. Расшифровать невозможно. Возможно только сбрутить хэш.

    Михаил, у меня возникла вот такая проблема: у меня регистрация пользователей проходит в одном файле, вход в другом. при регистрации пользовательский пароль уходит к примеру в текстовый файл в виде хэша, то есть в md5, потом пользователь хочет войти на сайт и естественно вводит пароль и логин, но при обработке полученных данных, если я сравниваю md5 хэш введённого пользователем пароля и тот пароль, что хранится в файле, то они не равны. И я уже это проверил. зарегистрировал пользователя, затем посмотрел в файле его пароль в виде хэша, далее сделал такой скрипт, чтобы пользователь вводил пароль, и чтобы этот пароль вывелся в браузер в виде хэша, так вот они разные. в чём может быть проблема?

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Все методы взлома MD5

    Содержание статьи

    Ни для кого не секрет, что криптография прочно вошла в нашу жизнь. Интернет-сервисы, социальные сети, мобильные устройства — все они хранят в своих базах пароли пользователей, зашифрованные с помощью различных алгоритмов. Наиболее популярным таким алгоритмом сегодня, безусловно, является MD5. О способах его взлома и пойдет речь.

    Немного о криптографии

    Современная криптография включает в себя три направления: шифрование с закрытым ключом, шифрование с открытым ключом и хеширование. Сегодня мы поговорим о том, что такое хеширование и с чем его едят. В целом под хешированием понимают преобразование входных данных произвольной длины в выходную битовую строку фиксированной длины. Чаще всего хеш-функции применяют в процессе аутентификации пользователя (в базе данных обычно хранится хеш пароля вместо самого пароля) и для вычисления контрольных сумм файлов, пакетов данных и т. п. Одним из наиболее известных и широко используемых алгоритмов хеширования является MD5.

    WARNING!

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

    Начало

    Алгоритм MD5 представляет собой 128-битный алгоритм хеширования. Это значит, что он вычисляет 128-битный хеш для произвольного набора данных, поступающих на его вход. Этот алгоритм разработал профессор Рональд Ривест из Массачусетского технологического института в 1991 году для замены менее надежного предшественника — MD4. Алгоритм был впервые опубликован в апреле 1992 года в RFC 1321. После этого MD5 стал использоваться для решения самых разных задач, от хеширования паролей в CMS до создания электронно-цифровых подписей и SSL-сертификатов.

    О том, что алгоритм MD5 можно взломать, впервые заговорили в 1993 году. Исследователи Берт ден Боер и Антон Боссиларис показали, что в алгоритме возможны псевдоколлизии. Через три года, в 1996-м, Ганс Доббертин опубликовал статью, в которой доказал наличие коллизий и описал теоретическую возможность взлома MD5. Это был еще не взлом, но в мире начались разговоры о необходимости перехода на более надежные алгоритмы хеширования, например SHA1 (на момент написания этой статьи уже было доказано, что коллизии имеются и в этом алгоритме, поэтому рекомендую использовать SHA2) или RIPEMD-160.

    Первые атаки

    Непосредственный взлом MD5 начался 1 марта 2004 года. Компания CertainKey Cryptosystems запустила проект MD5CRK — распределенную систему поиска коллизий. Целью проекта был поиск двух сообщений с идентичными хеш-кодами. Проект завершился 24 августа 2004 года, когда четыре независимых исследователя — Ван Сяоюнь, Фэн Дэнгуо, Лай Сюэцзя и Юй Хунбо — обнаружили уязвимость алгоритма, позволяющую найти коллизии аналитическим методом за более-менее приемлемое время. С помощью этого метода можно всего лишь за час выявить коллизии на кластере IBM p690 (жаль, что у меня нет такого дома). �� Первого марта 2005 года было продемонстрировано первое использование указанной уязвимости на практике. Группа исследователей представила два сертификата X.509 с разными наборами ключей, но с идентичными контрольными суммами. В том же году Властимил Клима опубликовал алгоритм, позволяющий обнаруживать коллизии на обычном ноутбуке за несколько часов. В 2006 он пошел дальше. Восемнадцатого марта 2006 года исследователь обнародовал алгоритм, находящий коллизии за одну минуту! Этот метод получил название «туннелирование». В 2008 году на конференции Chaos Communication Congress была представлена статья о методе генерации поддельных сертификатов X.509. Фактически это был первый случай реального использования коллизий в алгоритме MD5.

    Пример коллизии MD5-хешей

    Хакер #156. Взлом XML Encryption

    Большая работа была также проделана и для ускорения взлома хешей. В 2007 году Кевин Бриз представил программу, использующую Sony PlayStation3 для взлома MD5. Он сумел добиться очень неплохих результатов: 1,4 миллиарда MD5-хешей генерировались всего лишь за одну секунду! Уже через два года, в 2009-м, на BlackHat USA вышла статья об использовании GPU для поиска коллизий, что позволяло повысить его скорость в несколько раз, особенно если он выполнялся с помощью нескольких видеокарт одновременно.

    Брут MD5 по маске

    Видеокарта ATI Radeon HD 4850 X2 позволяет генерировать до 2,2 миллиардов хешей в секунду!

    Использование алгоритма MD5 в ЭЦП неприемлемо вследствие недостаточной устойчивости этого алгоритма к поиску коллизий.

    Это конец?

    В 2011 году IETF согласилось внести изменения в RFC 1321 (MD5) и RFC 2104 (HMAC-MD5). Так появился документ RFC 6151. Он признает алгоритм шифрования MD5 небезопасным и рекомендует отказаться от его использования. На мой взгляд, этот документ официально положил конец MD5. Однако, несмотря на то что алгоритм MD5 был официально признан небезопасным, существуют тысячи, если не десятки и сотни тысяч приложений, которые используют его для хранения паролей, в электронно-цифровых подписях и для вычисления контрольных сумм файлов. Кстати, 31 октября 2008 года NIST объявила конкурс среди криптографов. Цель конкурса — разработать алгоритм хеширования на замену устаревшим SHA1 и SHA2. На данный момент финалисты уже определены — это BLAKE, Gostl, JH, Keccak и Skein.

    Ighashgpu: взлом с помощью GPU

    Но хватит теории. Давай перейдем к делу и поговорим непосредственно о взломе нашего любимого алгоритма. Предположим, что нам в руки попал хеш какого-то пароля: d8578edf8458ce06fbc5bb76a58c5ca4 . Для взлома этого хеша я предлагаю воспользоваться программой Ighashgpu, которую можно скачать на сайтеwww.golubev.com или найти на нашем диске. Утилита распространяется совершенно бесплатно и спокойно работает под виндой. Чтобы ускорить процесс взлома хеша, Ighashgpu использует GPU, поэтому тебе необходима как минимум одна видеокарта nVidia или ATI c поддержкой CUDA/ATI Stream. Современные графические процессоры построены на несколько иной архитектуре, нежели обычные CPU, поэтому они гораздо эффективнее обрабатывают графическую информацию. Хотя GPU предназначены для обработки трехмерной графики, в последние несколько лет появилась тенденция к их применению и для обычных вычислений. Начать работать с программой не просто, а очень просто: распакуй архив в любое место на диске и приступай к взлому с помощью командной строки Windows:

    Мы используем вышеприведенный способ для взлома одного определенного хеша, сгенерированного при помощи алгоритма MD5. Максимальная длина возможного пароля составляет семь символов. Через какое-то время пароль будет найден (qwerty). Теперь давай попробуем взломать еще один хеш, но с немного другими условиями. Пусть наш хеш имеет вид d11fd4559815b2c3de1b685bb78a6283, а включает в себя буквы, цифры, знак подчеркивания и имеет суффикс «_admin». В данном случае мы можем использовать перебор пароля по маске, чтобы упростить программе задачу:

    Здесь параметр ‘-u’ позволяет указать набор символов, используемых при переборе, а параметр ‘-m’ задает маску пароля. В нашем случае маска состоит из шести произвольных символов, после которых идет сочетание «_admin». Подбор пароля также не составит никакого труда.

    Коллизии

    Коллизией в криптографии называют два разных входных блока данных, которые для одной и той же хеш-функции дают один и тот же хеш. Каждая функция на выходе дает последовательность битов определенной длины, которая не зависит от размера первоначальных данных. Отсюда следует, что коллизии существуют для любого алгоритма хеширования. Однако вероятность того, что ты сможешь найти коллизию в «хорошем» алгоритме, практически стремится к нулю. К сожалению или к счастью, алгоритмы хеширования могут содержать ошибки, как и любые программы. Многие хеш-функции либо уже были сломаны, либо скоро будут. В данном случае «сломать» — значит найти коллизию за время, которое много меньше заявленной бесконечности.

    Ighashgpu: списки

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

    Сохрани хеши в файле encrypted.dat и запусти Ighashgpu как указано ниже:

    После завершения работы программы в папке Ighashgpu появится файл ighashgpu_results.txt со взломанными паролями:

    Взломаные хеши из файла encrypted.dat

    Ighashgpu: соль

    Напоследок давай произведем взлом «подсоленного» хеша. Предположим, что хеш генерируется по следующему алгоритму:

    В итоге мы получили следующий хеш: 42151cf2ff27c5181bb36a8bcfafea7b. Ighashgpu позволяет указывать «соль» в параметре «-asalt»:

    И мы снова получили искомый пароль легко и быстро.

    Занимательная математика

    Для 8-символьного пароля, составленного из первых 126 символов ASCII, доступно 63 527 879 748 485 376 возможных комбинаций. Для 254 символов количество возможных комбинаций возрастает до 17 324 859 956 700 833 536, что аж в 2,7 миллиарда раз больше, чем людей на нашей планете. Если создать текстовый файл, содержащий все эти пароли, то он займет миллионы терабайт. Конечно, в современном мире это возможно, но стоимость хранения такого файла будет просто заоблачной.

    Взлом MD5 в режиме турбо

    Взлом хешей путем полного перебора даже на самом лучшем железе занимает довольно много времени, особенно если пароль больше восьми символов. Самый простой способ увеличить скорость подбора пароля — это создать базу данных всех хешей для определенного набора символов. В 80-х годах прошлого столетия хакеры полагали, что когда у них появится более мощное железо, 640 Кб памяти и жесткий диск размером в 10 Мб, то такая база станет реальностью и подбор любого пароля превратится в минутное дело. Однако железо развивалось, а мечта так и оставалась мечтой. Ситуация изменилась лишь в августе 2003 года, после того, как Филипп Оэшлин, доктор философии в области компьютерных сетей из Швейцарского технологического института в Лозанне, опубликовал свою работу о проблеме выбора оптимального соотношения место-время. В ней описывался метод взлома хеш-функций с помощью «радужных» таблиц. Суть нового метода заключается в следующем. Сначала необходимо выбрать произвольный пароль, который затем хешируется и подвергается воздействию функции редукции, преобразующей хеш в какой-либо возможный пароль (к примеру, это могут быть первые 64 бита исходного хеша). Далее строится цепочка возможных паролей, из которой выбираются первый и последний элементы. Они записываются в таблицу. Чтобы восстановить пароль, применяем функцию редукции к исходному хешу и ищем полученный возможный пароль в таблице. Если такого пароля в таблице нет, хешируем его и вычисляем следующий возможный пароль. Операция повторяется, пока в «радужной» таблице не будет найден пароль. Этот пароль представляет собой конец одной из цепочек. Чтобы найти исходный пароль, необходимо прогнать всю цепочку заново. Такая операция не занимает много времени, в зависимости от алгоритма построения цепочки это обычно несколько секунд или минут. «Радужные» таблицы позволяют существенно сократить объем используемой памяти по сравнению с обычным поиском. Единственный недостаток описанного метода состоит в том, что на построение таблиц требуется довольно много времени.

    Теперь перейдем от слов к делу и попробуем взломать пару-тройку хешей паролей с помощью этого метода.

    Rainbow tables

    «Радужные» таблицы — это особый тип словаря, который содержит цепочки паролей и позволяет подобрать пароль в течение нескольких секунд или минут с вероятностью 85–99%.

    «Радужный» взлом

    Сначала необходимо определиться с программой. Лично мне нравитсяRainbowCrack, которая распространяется бесплатно и работает как на Windows, так и на Linux. Она поддерживает четыре алгоритма хеширования: LN/NTLM, MD5 и SHA1. Программа не требует установки, достаточно распаковать ее куда-нибудь на диск. После распаковки необходимо найти «радужные» таблицы для алгоритма MD5. Здесь все не так просто: их можно либо скачать бесплатно, либо купить, либо сгенерировать самостоятельно. Один из самых больших архивов бесплатных таблиц доступен на сайте проекта Free Rainbow Tables. Кстати, ты тоже можешь помочь проекту, если скачаешь клиент с сайта и присоединишься к распределенной международной сети, которая генерирует «радужные» таблицы. На момент написания статьи на этом сайте уже было доступно 3 Тб таблиц для алгоритмов MD5, SHA1, LM и NTLM. Если у тебя нет возможности слить такой объем информации, то на том же сайте можно заказать диски с «радужными» таблицами. На данный момент предлагается три пакета: LN/NTLM, MD5 и SHA1 — по 200 долларов каждый. Мы же сгенерируем таблицы самостоятельно. Для этого необходимо использовать программу rtgen, входящую в состав RainbowCrack. Она принимает следующие входные параметры:

    • hash_algorithm — алгоритм хеширования (LM, NTLM, MD5 или SHA1);
    • charset — один из наборов символов, содержащийся в файле charset.txt;
    • plaintextlenmin и plaintextlenmax — минимальная и максимальная длина пароля;
    • tableindex, chainlen, chainnum и partindex — «магические числа», описанные в статье Филиппа Оэшлина bit.ly/nndT8M.


    Рассмотрим последние параметры подробнее:

    1. table_index — индекс «радужной» таблицы, который можно использовать при разбивке таблицы на несколько файлов. Я использовал 0, так как моя таблица состояла всего из одного файла.
    2. chain_len — количество уникальных паролей в цепочке.
    3. chain_num — количество цепочек в таблице.
    4. part_index — это параметр, определяющий начало цепочки. Создатели программы просят использовать в качестве этого параметра только число (я использовал 0). Теперь запускаем генерацию «радужной» таблицы для MD5:

    В данном случае мы создаем таблицу паролей, состоящих из цифр и прописных букв латинского алфавита и имеющих длину от одного до семи символов. На моем Eee PC с процессором Intel Atom N450 этот процесс занял почти два дня :). В итоге я получил файл md5loweralpha-numeric#1-72000×975054890.rt размером в 1,5 Гб.

    Далее полученную таблицу необходимо отсортировать, чтобы оптимизировать поиск нужной нам цепочки. Для этого запускаем rtsort.exe:

    Ждем пару минут и таблица готова! Теперь можно ломать сами пароли. Для начала попробуем подобрать пароль для одного хеша: d8578edf8458ce06fbc5bb76a58c5ca4. Запускаем rcrack_gui.exe и выбираем Add Hash. в меню File. В появившемся окне вводим хеш и нажимаем OK. Теперь выбираем файл с «радужной» таблицей. Для этого используем пункт Search Rainbow Tables. в меню Rainbow Table. В открывшемся окне для выбора файла ищем файл с таблицей, у меня это md5_loweralpha-numeric#1-7_0_2000x97505489_0.rt, затем жмем Open. Через несколько секунд пароль у нас в руках! Аналогичную операцию можно произвести и над списком хешей из файла.

    Генерирую радужную таблицу

    «Радужные» таблицы vs. CPU vs. GPU

    Я думаю, ты обратил внимание на то, насколько быстро Ighashgpu способен взламывать MD5-хеши полным перебором, и на то, что RainbowCrack делает это еще быстрее при наличии хорошей «радужной» таблицы. Я решил сравнить скорость работы этих программ. Для чистоты эксперимента я использовал программу MDCrack, которая осуществляет брут пароля на CPU (и является одной из лучших среди программ такого типа). Вот что получилось в результате для GPU (nVidia GeForce GT 220M), CPU (Intel Atom N450, два ядра) и «радужных» таблиц:

    Как видишь, скорость перебора с использованием CPU намного меньше, чем с использованием GPU или «радужных» таблиц. Более того, большинство специализированных программ позволяет создать кластер из видеокарт, благодаря чему скорость перебора пароля увеличивается в разы. Я думаю, ты обратил внимание на то, что скорость подбора 4- и 5-символьного паролей ниже, чем скорость подбора пароля из шести или семи символов. Это связано с тем, что поиск пароля начинается только после загрузки таблицы в память. Получается, что из шестнадцати секунд в среднем тринадцать тратится на загрузку и три — на взлом хеша.

    Радужная таблица изнутри

    bit.ly/vEhdir — добавление нового алгоритма хеширования в RainbowCrack при помощи API.

    bit.ly/vTSB9K — описание формата «радужной» таблицы.

    Вместо заключения

    В конце я бы хотел немного поговорить о защите твоих паролей. Во-первых, не используй уязвимые алгоритмы хеширования, такие как MD5 или SHA1. На данный момент стоит задуматься об использовании одной из криптографических хеш-функций SHA2 или SHA3 (как только опубликуют соответствующий стандарт). Во-вторых, не используй функции хеширования напрямую. Всегда старайся использовать «соль» и комбинировать различные алгоритмы. И в-третьих, выбирай сложные произвольные пароли длиной как минимум восемь символов. Конечно, это не защитит тебя от взлома на 100 %, но хотя бы усложнит жизнь злоумышленникам.

    MD5 Класс

    Определение

    Представляет абстрактный класс, от которого наследуются все реализации хэш-алгоритма MD5. Represents the abstract class from which all implementations of the MD5 hash algorithm inherit.

    Примеры

    В следующем примере кода показано вычисление MD5 хэш-значения строки и возврат хэш-кода в виде строки с 32 символами в шестнадцатеричном формате. The following code example computes the MD5 hash value of a string and returns the hash as a 32-character, hexadecimal-formatted string. Хэш-строка, созданная с помощью этого примера кода, совместима с любой хэш-функцией MD5 (на любой платформе), создающей хэш-строку 32-символа в шестнадцатеричном формате. The hash string created by this code example is compatible with any MD5 hash function (on any platform) that creates a 32-character, hexadecimal-formatted hash string.

    Комментарии

    Хэш-функции сопоставляют двоичные строки произвольной длины с маленькими двоичными строками фиксированной длины. Hash functions map binary strings of an arbitrary length to small binary strings of a fixed length. Криптографическая хэш-функция имеет свойство, которое вычисляется нецелесообразно для поиска двух различных входных значений, которые являются хэш-значениями для одного и того же значения. то есть хэши двух наборов данных должны совпадать, если соответствующие данные также совпадают. A cryptographic hash function has the property that it is computationally infeasible to find two distinct inputs that hash to the same value; that is, hashes of two sets of data should match if the corresponding data also matches. Небольшие изменения данных приводят к большим непредсказуемым изменениям в хэш-коде. Small changes to the data result in large, unpredictable changes in the hash.

    Размер хеша для MD5 алгоритма составляет 128 бит. The hash size for the MD5 algorithm is 128 bits.

    ComputeHash МетодыMD5 класса возвращают хэш как массив размером 16 байт. The ComputeHash methods of the MD5 class return the hash as an array of 16 bytes. Обратите внимание, что некоторые реализации MD5 создают хэш с 32-символом в шестнадцатеричном формате. Note that some MD5 implementations produce a 32-character, hexadecimal-formatted hash. Для взаимодействия с такими реализациями отформатируйте возвращаемое значение ComputeHash методов в виде шестнадцатеричного значения. To interoperate with such implementations, format the return value of the ComputeHash methods as a hexadecimal value.

    Из-за проблем с MD5/SHA1 Корпорация Майкрософт рекомендует использовать SHA256 или SHA512. Due to collision problems with MD5/SHA1, Microsoft recommends SHA256 or SHA512. Вместо SHA512 SHA256 классаMD5 рекомендуется использовать класс или класс. Consider using the SHA256 class or the SHA512 class instead of the MD5 class. Используйте MD5 только для обеспечения совместимости с устаревшими приложениями и данными. Use MD5 only for compatibility with legacy applications and data.

    Конструкторы

    Инициализирует новый экземпляр MD5. Initializes a new instance of MD5.

    Представляет размер вычисленного хэш-кода в битах. Represents the size, in bits, of the computed hash code.

    (Унаследовано от HashAlgorithm) HashValue

    Представляет значение вычисляемого хэш-кода. Represents the value of the computed hash code.

    (Унаследовано от HashAlgorithm) State

    Представляет состояние процесса вычисления хэша. Represents the state of the hash computation.

    (Унаследовано от HashAlgorithm)

    Свойства

    Возвращает значение, указывающее, возможно ли повторное использование текущего преобразования. Gets a value indicating whether the current transform can be reused.

    (Унаследовано от HashAlgorithm) CanTransformMultipleBlocks

    Если переопределено в производном классе, возвращает значение, указывающее, возможно ли преобразование нескольких блоков. When overridden in a derived class, gets a value indicating whether multiple blocks can be transformed.

    (Унаследовано от HashAlgorithm) Hash

    Получает значение вычисленного хэш-кода. Gets the value of the computed hash code.

    (Унаследовано от HashAlgorithm) HashSize

    Получает размер вычисленного хэш-кода в битах. Gets the size, in bits, of the computed hash code.

    (Унаследовано от HashAlgorithm) InputBlockSize

    При переопределении в производном классе получает размер входного блока. When overridden in a derived class, gets the input block size.

    (Унаследовано от HashAlgorithm) OutputBlockSize

    При переопределении в производном классе получает размер выходного блока. When overridden in a derived class, gets the output block size.

    (Унаследовано от HashAlgorithm)

    Методы

    Освобождает все ресурсы, используемые классом HashAlgorithm. Releases all resources used by the HashAlgorithm class.

    (Унаследовано от HashAlgorithm) ComputeHash(Byte[])

    Вычисляет хэш-значение для заданного массива байтов. Computes the hash value for the specified byte array.

    (Унаследовано от HashAlgorithm) ComputeHash(Byte[], Int32, Int32)

    Вычисляет хэш-значение для заданной области заданного массива байтов. Computes the hash value for the specified region of the specified byte array.

    (Унаследовано от HashAlgorithm) ComputeHash(Stream)

    Вычисляет хэш-значение для заданного объекта Stream. Computes the hash value for the specified Stream object.

    (Унаследовано от HashAlgorithm) Create()

    Создает экземпляр реализации по умолчанию хэш-алгоритма MD5. Creates an instance of the default implementation of the MD5 hash algorithm.

    Создает экземпляр заданной реализации хэш-алгоритма MD5. Creates an instance of the specified implementation of the MD5 hash algorithm.


    Освобождает все ресурсы, используемые текущим экземпляром класса HashAlgorithm. Releases all resources used by the current instance of the HashAlgorithm class.

    (Унаследовано от HashAlgorithm) Dispose(Boolean)

    Освобождает неуправляемые ресурсы, используемые объектом HashAlgorithm, а при необходимости освобождает также управляемые ресурсы. Releases the unmanaged resources used by the HashAlgorithm and optionally releases the managed resources.

    (Унаследовано от HashAlgorithm) Equals(Object)

    Определяет, равен ли заданный объект текущему объекту. Determines whether the specified object is equal to the current object.

    (Унаследовано от Object) GetHashCode()

    Служит хэш-функцией по умолчанию. Serves as the default hash function.

    (Унаследовано от Object) GetType()

    Возвращает объект Type для текущего экземпляра. Gets the Type of the current instance.

    (Унаследовано от Object) HashCore(Byte[], Int32, Int32)

    При переопределении в производном классе передает данные, записанные в объект, на вход хэш-алгоритма для вычисления хэша. When overridden in a derived class, routes data written to the object into the hash algorithm for computing the hash.

    (Унаследовано от HashAlgorithm) HashCore(ReadOnlySpan ) (Унаследовано от HashAlgorithm) HashFinal()

    Если переопределено в производном классе, завершает вычисление хэша после обработки последних данных криптографическим потоковым объектом. When overridden in a derived class, finalizes the hash computation after the last data is processed by the cryptographic stream object.

    (Унаследовано от HashAlgorithm) Initialize()

    Инициализирует реализацию класса HashAlgorithm. Initializes an implementation of the HashAlgorithm class.

    (Унаследовано от HashAlgorithm) MemberwiseClone()

    Создает неполную копию текущего объекта Object. Creates a shallow copy of the current Object.

    (Унаследовано от Object) ToString()

    Возвращает строку, представляющую текущий объект. Returns a string that represents the current object.

    (Унаследовано от Object) TransformBlock(Byte[], Int32, Int32, Byte[], Int32)

    Вычисляет хэш-значение для заданной области входного массива байтов и копирует указанную область входного массива байтов в заданную область выходного массива байтов. Computes the hash value for the specified region of the input byte array and copies the specified region of the input byte array to the specified region of the output byte array.

    (Унаследовано от HashAlgorithm) TransformFinalBlock(Byte[], Int32, Int32)

    Вычисляет хэш-значение для заданной области заданного массива байтов. Computes the hash value for the specified region of the specified byte array.

    (Унаследовано от HashAlgorithm) TryComputeHash(ReadOnlySpan , Span , Int32) (Унаследовано от HashAlgorithm) TryHashFinal(Span , Int32) (Унаследовано от HashAlgorithm)

    Явные реализации интерфейса

    Освобождает неуправляемые ресурсы, используемые объектом HashAlgorithm, а при необходимости освобождает также управляемые ресурсы. Releases the unmanaged resources used by the HashAlgorithm and optionally releases the managed resources.

    Md5 — Возвращает MD5 хэш строки

    (PHP 4, PHP 5, PHP 7)

    md5 — Возвращает MD5-хеш строки

    Не рекомендуется использовать эту функцию для обеспечения безопасности хранения паролей ввиду высокой скорости работы данного алгоритма. Более подробно читайте в разделе Ответы на часто задаваемые вопросы по хешированию паролей.

    Описание

    Вычисляет MD5-хеш строки str , используя » алгоритм MD5 RSA Data Security, Inc. и возвращает этот хеш.

    Список параметров

    Если необязательный аргумент raw_output имеет значение TRUE , то возвращается бинарная строка из 16 символов.

    Возвращаемые значения

    Возвращает хеш в виде 32-символьного шестнадцатеричного числа.

    Примеры

    Пример #1 Пример использования md5()

    if ( md5 ( $str ) === ‘1afa148eb41f2e7103f21410bf48346c’ ) <
    echo «Вам зеленое или красное яблоко?» ;
    >
    ?>

    Смотрите также

    • md5_file() — Возвращает MD5-хеш файла
    • sha1_file() — Возвращает SHA1-хеш файла
    • crc32() — Вычисляет полином CRC32 для строки
    • sha1() — Возвращает SHA1-хеш строки
    • hash() — Генерирует хеш-код (дайджест сообщения)
    • crypt() — Необратимое хеширование строки
    • password_hash() — Создает хеш пароля

    User Contributed Notes 8 notes

    This comparison is true because both md5() hashes start ‘0e’ so PHP type juggling understands these strings to be scientific notation. By definition, zero raised to any power is zero.

    Use the strict comparision/identity operator:

    php > var_dump(md5(‘240610708’) == md5(‘QNKCDZO’));
    php shell code:1:
    bool(true)
    php > var_dump(md5(‘240610708’) === md5(‘QNKCDZO’));
    php shell code:1:
    bool(false)
    php >

    because, as mentioned previously, using the equality operator may result in false positives.

    function raw2hex ( $rawBinaryChars )
    <
    return = array_pop ( unpack ( ‘H*’ , $rawBinaryChars ));
    >
    ?>

    The complement of hey2raw.
    You can use to convert from raw md5-format to human-readable format.

    This can be usefull to check «Content-Md5» HTTP-Header.

    = base64_decode ( $_SERVER [ ‘HTTP_CONTENT_MD5’ ]);
    $post_data = file_get_contents ( «php://input» );

    if( raw2hex ( $rawMd5 ) == md5 ( $post_data )) // Post-Data is okay
    else // Post-Data is currupted
    ?>

    From the documentation on Digest::MD5:
    md5($data. )
    This function will concatenate all arguments, calculate the MD5 digest of this «message», and return it in binary form.

    md5_hex($data. )
    Same as md5(), but will return the digest in hexadecimal form.

    PHP’s function returns the digest in hexadecimal form, so my guess is that you’re using md5() instead of md5_hex(). I have verified that md5_hex() generates the same string as PHP’s md5() function.

    (original comment snipped in various places)
    >Hexidecimal hashes generated with Perl’s Digest::MD5 module WILL
    >NOT equal hashes generated with php’s md5() function if the input
    >text contains any non-alphanumeric characters.
    >
    >$phphash = md5(‘pa$$’);
    >echo «php original hash from text: $phphash»;
    >echo «md5 hash from perl: » . $myrow[‘password’];
    >
    >outputs:
    >
    >php original hash from text: 0aed5d740d7fab4201e885019a36eace
    >hash from perl: c18c9c57cb3658a50de06491a70b75cd

    Помогите с хешированием md5

    Я web_profiler

    О чудо. Появилась функция (встроенная) хеширования md5
    И как оказывается не совсем уж она и полезная, к примеру раньше я получал md5 вот таким образом

    Crypt = Новый COMОбъект(«System.Security.Cryptography.MD5CryptoServiceProvider»);
    Text = Новый COMОбъект(«System.Text.UTF8Encoding»);

    HashArray = Crypt.ComputeHash_2(Text.GetBytes_4(СокрЛП(ТрекНомер) + Строка(Сигнатура))).Выгрузить();
    Hash = «»;
    Для Каждого Число Из HashArray Цикл
    Hash = Hash + DecToHex(Число);
    КонецЦикла;
    Результат1 = Hash;

    Теперь попробывал «новшество»

    Хеш = Новый ХешированиеДанных(ХешФункция.MD5);

    и получил в ответ двоичный данные

    А теперь вопрос: как мне все-таки получить строковое представление md5

    «123213ac4530c» -исходная строка
    «f9bac614494c1f286dfe3f5f13c17bef» — хешированная мною
    F9 BA C6 14 49 4C 1F 28 6D FE 3F 5F 13 C1 7B EF — двоичные данные «чудо функции»

    Хеширование Данных

    Возможность расчета хеш-суммы по добавленным данным на платформе 1С предприятие 8 появилась при выходе редакции 8.3.1 в
    мае 2013 года. Объект доступен только на сервере и создается таким образом :

    Объект ХешированиеДанных реализует инкрементальный расчет хеш-суммы по добавленным данным. Способ расчета и тип вычисляемого значения определяются типом хеш-функции.
    Системное перечисление Хешфункция обязателен и имеет следующие значения:

    • CRC32 – Циклический избыточный код http://wiki-org.ru/wiki/CRC#CRC-32
    • MD5 – (англ. Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института (Massachusetts Institute of Technology, MIT) в 1991 году. Предназначен для создания «отпечатков» или «дайджестов» сообщений произвольной длины и последующей проверки их подлинности. Является улучшенной в плане безопасности версией MD4. http://wiki-org.ru/wiki/MD5
    • SHA1 – алгоритм криптографического хеширования .
      Принципы, положенные в основу SHA-1, аналогичны тем, которые использовались при проектировании MD4
    • SHA256 – семейство криптографических алгоритмов — однонаправленных хеш-функций, включающее в себя алгоритмы SHA-224, SHA-256, SHA-384, SHA-512…

    Возможность вычисления значения хеш-функции по алгоритмам MD5 и CRC32 с помощью объекта ХешированиеДанных появилось на платформе 1С:Предприятие 8.3.1 . Затем, в редакции 8.3.3 был расширен набор поддерживаемых хеш-функций и добавили возможность вычисления хеш – функций SHA1 и SHA256.

    Можно также добавить имя файла с двоичными данными , а также текстовые данные:

    Следующий программный код выводит значение
    ХешСумма строки “Hello Woord!” при разных способах расчета

    Значение хеш-суммы строки
    “Hello Word!” при разных способах расчетах

    Примеры использования
    ХешированиеДанных в БСП 2.4

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

    В данном параграфе я привожу примеры использования этот объект в в различных серверных модулях, библиотеки стандартных подсистем 2.4, особенно в модуле общего назначения.
    Обратите внимание , что во всех примерах удаляются все пробелы в строке хеш-суммы для дальнейшей ее обработки.

    1.Вычисление контрольной суммы для произвольных данных по указанному алгоритму.

    Параметры:
    Данные – Произвольный – любое сериализуемое значение.
    Алгоритм – ХешФункция – алгоритм расчета контрольной суммы. По умолчанию, MD5
    Возвращаемое значение:
    Строка – контрольная сумма строкой без пробелов, 32 байта.

    2.Работа со строкой произвольной длины

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

    Параметры:
    Строка – Строка – исходная строка произвольной длины.
    Максимальная Длина – Число – требуемое максимальное количество символов в строке ( минимальное значение: 32)
    Возвращаемое значение: Строка – строка, не превышающая максимальную длину.

    3.Разделить файл на части , поместить части во временный каталог.

    Параметры:
    ИмяФайла – Строка – имя файла, который требуется разделить на части.
    РазмерЧастиВМегабайтах – Число – размер одной части файла в мегабайтах.
    Возвращаемое значение:
    Массив – полученные части файла, структура с ключами:
    * Хранение – Строка – положение файла на сервере,
    * ХешСумма – Число – значение хеш-суммы, полученное функцией CRC32.

    Md5 — Возвращает MD5 хэш строки

    Этот алгоритм был разработан в 1991 году профессором Рональдом Л. Ривестом. Алгоритм MD5 часто называют алгоритмом шифрования, но на самом деле это утверждение ошибочно. Главным преимуществом MD5 является то, что зашифрованные данные восстановить нельзя. А что это за алгоритм шифрования, который шифрует данные так, что никто их не сможет узнать? MD5 — это хэш-функция. У многих возник вопрос: что же это такое? Остановимся на этом вопросе.

    Что такое Хэш-функция

    Предположим, у нас есть некоторый набор данных. Для простоты будем рассматривать натуральные числа от 1 до 10 6 . И пусть есть некоторая функция, в которой один параметр — натуральное число от 1 до 10 6 , а возвращаемое значение — натуральное число от 1 до 1000. Нам не важно, что именно делает эта функция, нам важно то, что она каждому натуральному числу от 1 до 10 6 ставит в соответствие другое натуральное число от 1 до 1000. Для примера рассмотрим одну из самых простых функций, выполняющих это действие:

    int hash(long int x)<
    if (x%1000==0) return 1000;
    return (x % 1000);
    >

    function hash(x:longint):longint;
    begin
    if (x mod 1000=0) then hash:=1000 else
    hash:=x mod 1000;
    end;

    Это и есть простая хэш-функция. Если мы знаем параметр функции, то однозначно можем сказать, какой будет результат. А если нам известен результат, то можем ли мы узнать однозначно параметр? Конечно, нет. Для числа 234 параметр может быть 234,1234, 2234,3234… Поэтому однозначно восстановить параметр не получится.

    Зачем нужен MD5

    Для функции из примера, если известен результат, можно легко найти параметр, для которого будет такой же результат. А вот для функции MD5 это сделать не так-то просто. Т.е. если у нас есть только результат функции MD5, то мы не сможем найти параметр, для которого функция выдаст этот же результат (речь даже не идет про однозначное восстановление параметра). MD5 используют для хранения паролей. Приведу пример, когда хранение паролей в открытом виде опасно. Возьмем сайт «Дистанционное обучение» ( сайт ). На этом сайте проходят городские олимпиады школьников по информатике, ежедневно обучаются сотни школьников и студентов. Во многих школах доступа в Интернет нет, и школьникам необходимо пользоваться услугами сайта либо дома, либо не в своей школе. Поэтому сайт начали устанавливать в самих школах. Т.е. обучение происходит не на самом сайте, а на его копии, установленной в школе. Проблема в том, что вместе с сайтом школа получала пароли всех пользователей (в том числе и администраторов), и этими паролями любой мог воспользоваться для «администрирования» самого сайта. Было два способа решить эту проблему:

    1. Перед созданием копии сайта, которая будет перенесена в школу, удалять все пароли.
    2. Зашифровать все пароли так, чтобы никто не смог расшифровать их обратно.

    Был выбран второй способ. Сейчас пароли хранятся в зашифрованном виде (при помощи MD5). После того, как пользователь введет свой пароль, от пароля вычисляется хэш-функция MD5. Результат сравнивается со значением, хранящимся в базе. Если значения равны, то пароль верен. Еще MD5 можно использовать в качестве контрольной суммы. Предположим, необходимо куда-то скопировать файл. Причем нет никаких гарантий, что файл будет доставлен без повреждений. Перед отправкой можно посчитать MD5 от содержимого файла и передать результат вместе с файлом. Затем посчитать MD5 от принятого файла и сравнить два результата. Если результаты различные, то это означает, что файл или результат был испорчен при передаче. Последнее время MD5 стали использовать интернет-казино. Перед тем, как сделать ставку, игрок получает хэш от результата игры. Когда ставка сделана, игрок получает результат игры (например, выпало число 26). Посчитав от результата хэш-функцию, можно убедиться, что казино сгенерировало это число до того, как игрок сделал ставку. Но не стоит думать, что выиграть в этом казино очень просто. Весь секрет в том что, вероятность выигрыша подобрана таким образом, что игрок почти всегда будет в проигрыше. Пример такого казино: сайт

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

    Теперь посмотрим, как именно работает MD5. Для обработки MD5 получает некоторую строку. Эта строка преобразуется в последовательность из нулей и единиц. Как это делается? У каждого символа есть свой номер. Эти номера можно записать в двоичной системе счисления. Получается, каждый символ можно записать как последовательность нулей и единиц. Если этим воспользоваться, получим из строки последовательность из нулей и единиц. Пусть q будет длина получившейся последовательности (ровно 64 бита, возможно, с незначащими нулями). К получившейся последовательности приписывается 1. В результате длина последовательности увеличивается на 1. Затем к последовательности приписываются нули, пока длина не станет по модулю 512 равна 448 (length mod 512=448). Далее к последовательности дописываются младшие 32 бита числа q, а затем — старшие. Длина последовательности становится кратной 512. Полученную последовательность назовем S. Для подсчета результата используются четыре двойных слова (32 бита). Эти двойные слова инициализируются следующими шестнадцатеричными значениями, где первым следует самый младший байт:

    A: 01 23 45 67
    B: 89 ab cd ef
    C: fe dc ba 98
    D: 76 54 32 10
    Также для подсчета результата используются следующие функции:
    F(X,Y,Z) = XY v not(X) Z
    G(X,Y,Z) = XZ v Y not(Z)
    H(X,Y,Z) = X xor Y xor Z
    I(X,Y,Z) = Y xor (X v not(Z))

    X,Y,Z — это двойные слова. Результаты функций, также двойные слова. Для подсчета используется еще одна функция (назовем ее W). Она хитро обрабатывает данные и возвращает результат (подробно ее описывать не буду, т.к. она выполняет серию простых преобразований). Обработка данных происходит с использованием функций F, G, H, I.

    На рисунке схематически изображена функция. Слева — входные данные, справа — выходные.

    Все необходимые функции и обозначения рассмотрены. Теперь рассмотрим, как происходит просчет результата:
    1. Запоминаем первые 512 бит последовательности S.
    2. Удаляем первые 512 бит последовательности S (можно обойтись и без удаления, но тогда на первом шаге надо брать не первые 512, а
    следующие 512 бит).
    3. Вызываем функцию W. Параметры A,B,C,D — это текущие значения соответствующих двойных слов. Параметр T — это запомненные 512 бит.
    4. Прибавляем к A A0.
    5. B=B+B0.
    6. C=C+C0.
    7. D=D+D0.
    8. Если длина последовательности 0, выходим.
    9. Переходим к шагу 1.

    После выполнения этого алгоритма A,B,C,D — это результат (его длина будет 128 бит). Часто можно видеть результат MD5 как последовательность из 32 символов 0..f. Это то же самое, только результат записан не в двоичной системе счисления, а в шестнадцатеричной.

    В Интернете можно найти много программ, которые обещают найти строку, для которой алгоритм MD5 выдаст заданный результат. Эти программы действительно работают. Ранее отмечалось, что восстановить параметр невозможно. Как же работают эти программы? Они перебирают все возможные строки, применяют к ним алгоритм MD5, а затем сравнивают с образцом. Если значения совпали, это означает, что программа нашла необходимую строку. Но у этих программ есть маленький недостаток. Предположим, известно, что программе придется перебрать все слова длиной в 8 символов, состоящих из маленьких и больших латинских букв. Сколько времени это займет? Сколько всего таких слов? На первом месте может стоять любой из 26*2=52 символов. На 2, 3, 4, 5, 6, 7 и 8 — тоже 52. Значит, всего таких слов будет: 52*52*52*52*52*52*52*52=52 8 =53*10 12 . А если используются не только латинские буквы? То это еще больше. Перебор всех вариантов на обычном персональном компьютере займет очень много времени. В Интернете можно найти сайты, которые по введенному хэшу выдают строку, для которой будет точно такой же хэш. Эти сайты используют базу данных с заранее просчитанными хэшами. Но в базах хранятся не все хэшы, а только самые используемые. Вот один из таких сайтов: сайт Так что советую использовать в качестве пароля абсолютно случайную последовательность символов.

    .Net And C#

    Страницы

    Автоматизация бизнеса

    суббота, 14 июля 2012 г.

    Как получить MD5 хеш файла, строки

    Возвращает MD5 хеш файла.

    <
    using ( FileStream fs = File .OpenRead(path))
    <
    MD5 md5 = new MD5CryptoServiceProvider ();
    byte [] filebytes = new byte [fs.Length];
    fs.Read(filebytes, 0, ( int )fs.Length);
    byte [] Sum = md5.ComputeHash(filebytes);
    string result = BitConverter .ToString(Sum).Replace( «-» , String .Empty);
    return result;
    >
    >

    Получаем MD5 хеш строки

    public string ComputeStringMD5Hash( string instr)
    <
    string strHash = string .Empty;

    foreach ( byte b in new MD5CryptoServiceProvider ().ComputeHash( Encoding .Default.GetBytes(instr)))
    <
    strHash += b.ToString( «X2» );
    >
    return strHash;
    >

    SHA-2 ( англ. Secure Hash Algorithm Version 2 — безопасный алгоритм хеширования, версия 2) — собирательное название однонаправленных хеш-функций SHA-224, SHA-256, SHA-384 и SHA-512 .

    Илон Маск рекомендует:  Цвет маркеров
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL