Spec-Zone.ru › Perl 5.28

Хеш-функции

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНТАКСИС
  • ОПИСАНИЕ
  • ИНТЕРФЕЙС ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
  • Скорость вычисления хешей
  • СМОТРИ ТАКЖЕ
  • АВТОР

ИМЯ

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:: модули предоставляют одинаковый интерфейс программирования. Функциональный интерфейс для простого использования, а также объектно-ориентированный интерфейс, который может обрабатывать сообщения произвольной длины и напрямую читать файлы.

Хеш-значение может быть представлено в трех форматах:

binary

Это наиболее компактная форма, но она не подходит для печати или встраивания в места, которые не могут обрабатывать произвольные данные.

hex

Строка вдвое большей длины, состоящая из строчных шестнадцатеричных цифр.

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(), если возникнет ошибка при чтении данных. Если произошла ошибка 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.

Скорость вычисления хешей

Эта таблица должна дать представление о скорости различных алгоритмов. Она отсортирована по пропускной способности на основе бенчмарка, выполненного с помощью некоторых реализаций этого 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.28.3/Digest

Spec-Zone.ru

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