- Краткая справка о MD5
- Digest::MD5
- Полезные ссылки
Краткая справка о MD5
MD5 (Message Digest 5) - 128-битный алгоритм хеширования текстов.
Алгоритму скармливается любой текст. Результатом работы алгоритма является последовательность из 32 шестнадцатеричных цифр, которую называют MD5-хешом.
Можно провести аналогию с "отпечатком пальца". Однако, в отличие от отпечатков пальца, где
каждый отпечаток уникален, алгоритм может производить одинаковые хеши для разных текстов. Это считается основным недостатком алгоритма.
MD5-хеш используется для определения подлинности опубликованных текстов:
- публикуется текст и соответствующий ему MD5-хеш;
- при желании, клиент может сам вычислить MD5-хеш для опубликованного текста
и сравнить его с опубликованным там же MD5-хешом.
Малейшее изменение в исходном тексте приводит к тому, что MD5-хеш приобретает абсолютно другое значение.
Обратное преобразование MD5-хеша в текст не возможно.
С помощью MD5 можно проверять целостность скачиваемых файлов, проверять корректность
введенного пользователем пароля без необходимости хранить открытый пароль в БД, и т.д.
Digest::MD5
Частичный перевод http://search.cpan.org/~gaas/Digest-MD5-2.51/MD5.pm
Модуль Digest::MD5 позволяет использовать алгоритм хеширования текстов MD5 в Perl программах. Алгоритм пожирает текст произвольной длины и возвращает 128-битный "дайджест" (хеш) текста.
Digest::MD5 предлагает для использования как процедурный, так и объектно-ориентированный интерфейс.
Функции Digest::MD5
Digest::MD5 позволяет использовать для работы с md5 функции
md5(), md5_hex(), md5_base64(). По умолчанию, функции не экспортируются.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/bin/perl -w use strict; use CGI; use Digest::MD5 qw(md5 md5_hex md5_base64); my $digest; my $text = qq{Карл у Клары украл кораллы}; $digest = md5($text); print $digest."\n"; $digest = md5_hex($text); print $digest."\n"; $digest = md5_base64($text); print $digest."\n"; exit; |
Результат выполнения скрипта:
|
1 2 3 4 5 6 |
%perl md5.pl ЩRU% _пмШЫтr 10fd52db0855250cb4d0cd13fbf9d472 EP1S2whVJQy00M0T+/nUcg |
md5($data,...)
|
1 |
$digest = md5($text); |
Функция объединяет в один текст все переданные аргументы, и вычисляет для полученного текста
MD5-дайджест. Результат возвращается в бинарном формате. Возвращенная последовательность будет иметь длину
12 байтов.
md5_hex($data,...)
|
1 2 3 4 5 6 7 8 |
my $text = qq{Карл у Клары украл кораллы}; $digest = md5_hex($text); print $digest."\n"; # изменяем регистр у всего одной буквы - значение хеша полностью изменится $text = qq{Карл у клары украл кораллы}; $digest = md5_hex($text); print $digest."\n"; |
Результаты выполнения:
|
1 2 3 4 |
%perl md5.pl 10fd52db0855250cb4d0cd13fbf9d472 19d0beb7f6b8d544eb59e1699c4cf9a5 |
Функция возвращает дайджест в шестнадцатеричном формате. Длина последовательности составит 32 символа и будет включать в себя только цифры и латинские буквы от "a" до "f".
md5_base64($data,...)
|
1 |
$digest = md5_base64($text); |
Возвращает "дайджест" для указанных аргументов в виде base64 - последовательности печатных ASCII символов. Длина возвращенной последовательности будет составлять 22 символа и может содержать цифры, буквы латинского алфавита в верхнем и нижнем регистре, символы "+" и "/".
Методы Digest::MD5
Digest::MD5 предоставляет возможность работы через объектный интерфейс. Он очень простой и симпатичный.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/perl -w use strict; use CGI; use Digest::MD5; my $text = qq{Карл у Клары украл кораллы}; my $md5 = Digest::MD5->new; $md5->add($text); print $md5->clone->digest."\n"; print $md5->clone->hexdigest."\n"; print $md5->clone->b64digest."\n"; $md5->reset; exit; |
Результат выполнения скрипта:
|
1 2 3 4 5 6 7 |
%perl md5.pl ЩRU% _пмШЫтr 10fd52db0855250cb4d0cd13fbf9d472 EP1S2whVJQy00M0T+/nUcg % |
$md5 = Digest::MD5->new
Метод new() возвращает новый объект Digest::MD5. Можно вызвать по отношению к уже существующему объекту - $md5->new . В этом случае, будет произведена "перезагрудка"
указанного объекта, и он станет доступен для повторного использования.
$md5->add($data,...)
Метод add() определяет данные, для которых в дальнейшем можно проводить вычисления. Можно задать несколько аргументов - они будут объеденены в один общий текст, для которого потом будет вычислен хеш.
Значение, которое возвращает метод - это сам объект $md5.
$md5->addfile($io_handle)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/perl -w use strict; use CGI; use Digest::MD5; my $md5 = Digest::MD5->new; open FILE, "file.pl" || die "Can't open file"; $md5->addfile(*FILE); close FILE; print $md5->clone->digest."\n"; print $md5->clone->hexdigest."\n"; print $md5->clone->b64digest."\n"; exit; |
Результаты работы:
|
1 2 3 4 5 |
%perl md5.pl b}Ъ_M _Ў|тш№Ю 621c7d95ff9c4d2098a17cd4dbb915e0 Yhx9lf+cTSCYoXzU27kV4A |
Метод addfile() назначает файл, для которого в дальнейшем будут проводиться вычисления. Значение, которое возвращает метод - сам объект $md5.
Если, по каким-то причинам, метод не сможет прочитать указанный файл - он сообщит об этом.
После такой ошибки лучше перезагрузить объект и только после этого продолжить работу.
$md5->digest
|
1 |
$md5->digest; |
Вычисляет и возвращает бинарный "дайджест" для указанного текста. Полученная строка будет иметь длину 16 байтов.
Возможен интересный сюрприз для тех, кто использует Digest::MD5 впервые и невнимательно читает документацию. После выполнения, digest() разрушает объект, для которого он был вызван.
Это означает, что если вы забудете об этом, и после вызова digest() решите получить еще и значение hexdigest(), то вы его получите. Но это значение будет высчитано для пустой строки, а не для заданного Вами ранее текста.
Если объект Вам нужен и после digest(), рекомендуется вызывать метод через clone():
|
1 |
$md5->clone->digest; |
$md5->hexdigest
Возвращает шестнадцатеричный MD5-хеш для указанного текста (файла). Полученная строка будет иметь длину в 32 символа, и состоять только из цифр и букв латинского алфавита от "a" до "f".. После выполнения, hexdigest() разрушает объект, для которого он был вызвана.
$md5->b64digest
Возвращает "дайджест" для указанного текста (файла) в виде base64 - последовательности
печатных ASCII символов. Длина возвращенной строки будет составлять 22 символа и может содержать цифры, буквы латинского алфавита в верхнем и нижнем регистре, символы "+" и "/".
$md5->clone
Метод создает копию объекта $md5. Методы digest(), hexdigest(), b64digest() после использования "перезагружают" объект. Во избежание этого можно сначала создавать копию объекта $md5, а потом применять к ней методы digest(), hexdigest(), b64digest() . Таким образом, исходный объект - $md5 - остается в целости и сохранности, и доступен для дальнейшего использования.
$md5->reset
Алиас $md5->new . Удобно использовать для "сброса" всех настроек объекта $md5 и его дальнейшего повторного использования.
Примеры работы с Digest::MD5
Генерация хеша
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/perl -w use strict; use Digest::MD5 qw(md5_hex); print "Введите пароль:\n"; my $pass = <STDIN>; chomp($pass); # обрезаем \n print md5_hex($pass)."\n"; exit; |
Результат работы скрипта:
|
1 2 3 4 5 |
%perl create_md5.pl Введите пароль: asSa bb456cfc65785beda9ec0c034e2a54ae |
Сравнение паролей по хешу
Cкрипт принимает пароль, преобразует в хеш MD5 и проверяет его соответствие имеющемуся хешу MD5.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/usr/bin/perl -w use strict; use Digest::MD5 qw(md5_hex); my $correct_pass = "bb456cfc65785beda9ec0c034e2a54ae"; print "Введите пароль:\n"; my $pass = <STDIN>; chomp($pass); # обрезаем \n if ($correct_pass eq md5_hex($pass)) { print "Добро пожаловать!\n"; } else { print "Пошел нафиг!\n"; } exit; |
Результат работы скрипта:
|
1 2 3 4 5 |
%perl create_md5.pl Введите пароль: asSa Добро пожаловать! |
Полезные ссылки
http://ru.wikipedia.org/wiki/MD5
http://ru.wikipedia.org/wiki/Base64