Digest
СОДЕРЖАНИЕ
ИМЯ
Digest — Модули, вычисляющие дайджесты сообщений
СИНТАКСИС
$md5 = Digest->new("MD5");
$sha1 = Digest->new("SHA-1");
$sha256 = Digest->new("SHA-256");
$sha384 = Digest->new("SHA-384");
$sha512 = Digest->new("SHA-512");
$hmac = Digest->HMAC_MD5($key); ОПИСАНИЕ
Модули Digest:: вычисляют дайджесты, также называемые «отпечатками пальцев» или «хешами», некоторого данных, называемого сообщением. Дайджест — это (обычно) строка небольшого/фиксированного размера. Фактический размер дайджеста зависит от используемого алгоритма. Сообщение — просто последовательность произвольных байтов или битов.
Важное свойство алгоритмов дайджестов состоит в том, что дайджест, вероятно, изменится, если сообщение изменится каким-либо образом. Другое свойство заключается в том, что функции дайджеста являются односторонними функциями, то есть найти сообщение, соответствующее заданному дайджесту, должно быть сложно. Алгоритмы различаются по тому, насколько «вероятно» и насколько «сложно» их вычисление, а также по их эффективности.
Обратите внимание, что свойства алгоритмов со временем меняются, поскольку алгоритмы анализируются, а машины становятся быстрее. Если, например, ваше приложение зависит от «невозможности» сгенерировать один и тот же дайджест для другого сообщения, разумно сделать лёгким подключение более сильных алгоритмов, по мере того, как используемые алгоритмы ослабевают. Использование здесь описанного интерфейса должно упростить изменение алгоритмов в будущем.
Все Digest:: модули предоставляют одинаковый программный интерфейс. Функциональный интерфейс для простого использования, а также объектно-ориентированный интерфейс, который может обрабатывать сообщения произвольной длины и может читать файлы напрямую.
Дайджест может быть предоставлен в трёх форматах:
- двоичный
-
Это наиболее компактная форма, но она не подходит для печати или встраивания в места, которые не могут обрабатывать произвольные данные.
- шестнадцатеричный
-
Строка вдвое большей длины, состоящая из строчных шестнадцатеричных цифр.
- base64
-
Строка из переносимых печатных символов. Это представление дайджеста в кодировке base64 без любого заключительного заполнения. Строка будет примерно на 30% длиннее, чем двоичный вариант. MIME::Base64 содержит больше информации об этом кодировании.
Функциональный интерфейс представляет собой просто импортируемые функции с тем же именем, что и алгоритм. Функции принимают сообщение в качестве аргумента и возвращают дайджест. Пример:
use Digest::MD5 qw(md5);
$digest = md5($message); Также существуют версии функций с добавленным "_hex" или "_base64" к имени, которые возвращают дайджест в указанном формате.
ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ИНТЕРФЕЙС
Для всех Digest:: модулей доступны следующие методы:
- $ctx = Digest->XXX($arg,...)
- $ctx = Digest->new(XXX => $arg,...)
- $ctx = Digest::XXX->new($arg,...)
-
Конструктор возвращает некоторый объект, который обобщает состояние алгоритма дайджеста сообщения. Вы можете добавить данные в объект и, наконец, запросить дайджест. «XXX», конечно, должен быть заменён соответствующим именем алгоритма дайджеста, который вы хотите использовать.
Первые две формы — это просто синтаксический сахар, который автоматически загружает нужный модуль при первом использовании. Вторая форма позволяет использовать имена алгоритмов, которые содержат буквы, которые не являются допустимыми идентификаторами Perl, например, «SHA-1». Если реализация для данного алгоритма не найдена, генерируется исключение.
Если new() вызывается как метод экземпляра (т.е. $ctx->new), он просто сбросит состояние объекта до состояния вновь созданного объекта. В этом случае новый объект не создаётся, и возвращаемое значение — ссылка на объект (т.е. $ctx).
- $other_ctx = $ctx->clone
-
Метод clone создаёт копию объекта состояния дайджеста и возвращает ссылку на копию.
- $ctx->reset
-
Это просто псевдоним для $ctx->new.
- $ctx->add( $data )
- $ctx->add( $chunk1, $chunk2, ... )
-
Строковое значение $data, предоставленное в качестве аргумента, добавляется к сообщению, для которого мы вычисляем дайджест. Возвращаемое значение — сам объект $ctx.
Если предоставлено несколько аргументов, они все добавляются к сообщению, поэтому все эти строки окажут одинаковое влияние на состояние объекта $ctx:
$ctx->add("a"); $ctx->add("b"); $ctx->add("c"); $ctx->add("a")->add("b")->add("c"); $ctx->add("a", "b", "c"); $ctx->add("abc");Большинство алгоритмов определены только для строк байтов, и поэтому этот метод может выдавать ошибку, если предоставленные аргументы содержат символы с порядковым номером выше 255.
- $ctx->addfile( $io_handle )
-
Файл $io_handle читается до конца файла, и содержимое добавляется к сообщению, для которого мы вычисляем дайджест. Возвращаемое значение — сам объект $ctx.
Метод addfile() выдаст ошибку (croak()), если произойдёт ошибка чтения данных. Если он выдаёт ошибку, состояние объекта $ctx будет непредсказуемым. Возможно, метод addfile() смог частично прочитать файл перед ошибкой. Вероятно, стоит удалить или сбросить объект $ctx в этом случае.
В большинстве случаев вы хотите убедиться, что $io_handle находится в режиме "binmode", прежде чем передавать его в качестве аргумента методу addfile().
- $ctx->add_bits( $data, $nbits )
- $ctx->add_bits( $bitstring )
-
Метод add_bits() — альтернатива add(), которая позволяет добавлять частичные байты к сообщению. Большинство пользователей должны просто игнорировать этот метод, так как частичные байты вряд ли будут иметь практическое значение.
Вариант add_bits() с двумя аргументами добавит первые $nbits биты из $data. Для последнего, потенциально частичного, байта используются только старшие
$nbits % 8биты. Если $nbits больше, чемlength($data) * 8, то этот метод будет делать то же самое, что и$ctx->add($data).Вариант add_bits() с одним аргументом принимает $bitstring из символов "1" и "0" в качестве аргумента. Это сокращение для
$ctx->add_bits(pack("B*", $bitstring), length($bitstring)).Возвращаемое значение — сам объект $ctx.
Этот пример демонстрирует два вызова, которые должны иметь одинаковый эффект:
$ctx->add_bits("111100001010"); $ctx->add_bits("\xF0\xA0", 12);Большинство алгоритмов дайджестов основаны на байтах, и для них невозможно добавить биты, которые не являются кратными 8, и метод add_bits() выдаст ошибку, если вы попытаетесь.
- $ctx->digest
-
Возвращает двоичный дайджест сообщения.
Обратите внимание, что операция
digestфактически является разрушающей операцией «чтение один раз». После её выполнения объект $ctx автоматическиresetи может быть использован для вычисления другого значения дайджеста. Вызовите $ctx->clone->digest, если вы хотите вычислить дайджест без сброса состояния дайджеста. - $ctx->hexdigest
-
Аналогично $ctx->digest, но возвращает дайджест в шестнадцатеричном формате.
- $ctx->b64digest
-
Аналогично $ctx->digest, но возвращает дайджест в виде строки, закодированной в base64.
Скорость Digest
Эта таблица должна дать некоторое представление о скорости различных алгоритмов. Она отсортирована по пропускной способности на основе бенчмарка, выполненного с использованием некоторых реализаций этого API:
Algorithm Size Implementation MB/s
MD4 128 Digest::MD4 v1.3 165.0
MD5 128 Digest::MD5 v2.33 98.8
SHA-256 256 Digest::SHA2 v1.1.0 66.7
SHA-1 160 Digest::SHA v4.3.1 58.9
SHA-1 160 Digest::SHA1 v2.10 48.8
SHA-256 256 Digest::SHA v4.3.1 41.3
Haval-256 256 Digest::Haval256 v1.0.4 39.8
SHA-384 384 Digest::SHA2 v1.1.0 19.6
SHA-512 512 Digest::SHA2 v1.1.0 19.3
SHA-384 384 Digest::SHA v4.3.1 19.2
SHA-512 512 Digest::SHA v4.3.1 19.2
Whirlpool 512 Digest::Whirlpool v1.0.2 13.0
MD2 128 Digest::MD2 v2.03 9.5
Adler-32 32 Digest::Adler32 v0.03 1.3
CRC-16 16 Digest::CRC v0.05 1.1
CRC-32 32 Digest::CRC v0.05 1.1
MD5 128 Digest::Perl::MD5 v1.5 1.0
CRC-CCITT 16 Digest::CRC v0.05 0.8 Эти числа были получены в апреле 2004 года с ActivePerl-5.8.3, работающим под Linux на процессоре P4 2,8 ГГц. Последние 5 записей отличаются тем, что представляют собой реализации алгоритмов на чистом Perl, что объясняет, почему они так медленные.
СМОТРИТЕ ТАКЖЕ
Digest::Adler32, Digest::CRC, Digest::Haval256, Digest::HMAC, Digest::MD2, Digest::MD4, Digest::MD5, Digest::SHA, Digest::SHA1, Digest::SHA2, Digest::Whirlpool
Новые реализации дайджестов должны рассматривать наследование от Digest::base.
http://en.wikipedia.org/wiki/Cryptographic_hash_function
АВТОР
Gisle Aas <gisle@aas.no>
Интерфейс Digest:: основан на интерфейсе, первоначально разработанном Нилом Винтоном для его модуля MD5.
Эта библиотека является свободным программным обеспечением; вы можете распространять и/или изменять её на тех же условиях, что и Perl сам по себе.
Copyright 1998-2006 Gisle Aas.
Copyright 1995,1996 Neil Winton.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/Digest