Spec-Zone.ru › Perl 5.30

Digest

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ИНТЕРФЕЙС
  • Скорость 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.

MIME::Base64

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API