Хеш-функции
СОДЕРЖАНИЕ
- ИМЯ
- СИНТАКСИС
- ОПИСАНИЕ
- ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ИНТЕРФЕЙС
- Скорость вычисления хешей
- СМОТРИТЕ ТАКЖЕ
- АВТОР
ИМЯ
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». Если реализация для заданного алгоритма не найдена, генерируется исключение.
Чтобы узнать, какие аргументы (если таковые имеются) принимает конструктор (выше
$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 строк отличаются тем, что представляют собой чисто перловые реализации алгоритмов, что объясняет, почему они так медленные.
СМОТРИТЕ ТАКЖЕ
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–2023 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.38.0/Digest