Работа с md5 в Perl. 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(). По умолчанию, функции не экспортируются.

Результат выполнения скрипта:

md5($data,...)

Функция объединяет в один текст все переданные аргументы, и вычисляет для полученного текста
MD5-дайджест. Результат возвращается в бинарном формате. Возвращенная последовательность будет иметь длину
12 байтов.

md5_hex($data,...)

Результаты выполнения:

Функция возвращает дайджест в шестнадцатеричном формате. Длина последовательности составит 32 символа и будет включать в себя только цифры и латинские буквы от "a" до "f".

md5_base64($data,...)

Возвращает "дайджест" для указанных аргументов в виде base64 - последовательности печатных ASCII символов. Длина возвращенной последовательности будет составлять 22 символа и может содержать цифры, буквы латинского алфавита в верхнем и нижнем регистре, символы "+" и "/".

Методы Digest::MD5

Digest::MD5 предоставляет возможность работы через объектный интерфейс. Он очень простой и симпатичный.

Результат выполнения скрипта:

$md5 = Digest::MD5->new

Метод new() возвращает новый объект Digest::MD5. Можно вызвать по отношению к уже существующему объекту - $md5->new . В этом случае, будет произведена "перезагрудка"
указанного объекта, и он станет доступен для повторного использования.

$md5->add($data,...)

Метод add() определяет данные, для которых в дальнейшем можно проводить вычисления. Можно задать несколько аргументов - они будут объеденены в один общий текст, для которого потом будет вычислен хеш.

Значение, которое возвращает метод - это сам объект $md5.

$md5->addfile($io_handle)

Результаты работы:

Метод addfile() назначает файл, для которого в дальнейшем будут проводиться вычисления. Значение, которое возвращает метод - сам объект $md5.

Если, по каким-то причинам, метод не сможет прочитать указанный файл - он сообщит об этом.
После такой ошибки лучше перезагрузить объект и только после этого продолжить работу.

$md5->digest

Вычисляет и возвращает бинарный "дайджест" для указанного текста. Полученная строка будет иметь длину 16 байтов.

Возможен интересный сюрприз для тех, кто использует Digest::MD5 впервые и невнимательно читает документацию. После выполнения, digest() разрушает объект, для которого он был вызван.

Это означает, что если вы забудете об этом, и после вызова digest() решите получить еще и значение hexdigest(), то вы его получите. Но это значение будет высчитано для пустой строки, а не для заданного Вами ранее текста.

Если объект Вам нужен и после digest(), рекомендуется вызывать метод через clone():

$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

Генерация хеша

Результат работы скрипта:

Сравнение паролей по хешу

Cкрипт принимает пароль, преобразует в хеш MD5 и проверяет его соответствие имеющемуся хешу MD5.

Результат работы скрипта:

Полезные ссылки

http://ru.wikipedia.org/wiki/MD5
http://ru.wikipedia.org/wiki/Base64

http://search.cpan.org/~gaas/Digest-MD5-2.51/MD5.pm