内容

名称

摘要 - 计算消息摘要的模块

概要

$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),它只会将对象的 state 重置为新创建对象的 state。在这种情况下,不会创建新的对象,返回值是对对象的引用(即 $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 直到 EOF,并将内容追加到我们计算摘要的消息中。返回值是 $ctx 对象本身。

如果由于某种原因无法读取数据,则 addfile() 方法将出错。如果出错,则 $ctx 对象的状态将不可预测。addfile() 方法可能在失败之前已部分读取文件。如果发生这种情况,最好丢弃或重置 $ctx 对象。

在大多数情况下,您需要确保 $io_handle 处于“binmode”模式,然后再将其作为参数传递给 addfile() 方法。

$ctx->add_bits( $data, $nbits )
$ctx->add_bits( $bitstring )

add_bits() 方法是 add() 的替代方法,允许将部分字节追加到消息中。大多数用户可以忽略此方法,因为典型应用程序仅涉及完整字节数据。

add_bits() 的两个参数形式将添加 $data 中的前 $nbits 位。对于最后一个可能的部分字节,仅使用高阶 $nbits % 8 位。如果 $nbits 大于 length($data) * 8,则此方法将与 $ctx->add($data) 相同。

add_bits() 的一个参数形式将以“1”和“0”字符的 $bitstring 作为参数。它是 $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 年 4 月使用运行在 Linux 上的 P4 2.8 GHz CPU 的 ActivePerl-5.8.3 获得的。最后 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 <[email protected]>

Digest:: 接口基于 Neil Winton 为他的 MD5 模块最初开发的接口。

此库是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。

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