Хеш-функции
СОДЕРЖАНИЕ
ИМЯ
Хеш-функции — модули, вычисляющие хэш-коды сообщений
СИНТАКСИС
$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.
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