Spec-Zone.ru › Perl 5.34

Хеш-функции

СОДЕРЖАНИЕ

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

ИМЯ

Хеш-функции — модули, вычисляющие хэш-коды сообщений

СИНТАКСИС

$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». Если не удаётся найти реализацию для данного алгоритма, то генерируется исключение.

Чтобы узнать, какие аргументы (если таковые имеются) принимает конструктор (см. $args,... выше), проконсультируйтесь с документацией по конкретной реализации алгоритма хеширования.

Если 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-строки без заполнения.

$ctx->base64_padded_digest

Аналогично $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:: основан на интерфейсе, первоначально разработанном Neil Winton для его MD5 модуля.

Эта библиотека является свободным программным обеспечением; вы можете перераспределять её и/или изменять её в соответствии с теми же условиями, что и сам Perl.

Copyright 1998-2006 Gisle Aas.
Copyright 1995,1996 Neil Winton.

© 1993–2021 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.34.0/Digest

Spec-Zone.ru

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