摘要 - 计算消息摘要的模块
$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 编码表示,去掉了任何尾部填充。该字符串将比二进制版本长约 30%。MIME::Base64 会告诉你更多关于这种编码的信息。
功能接口只是可导入的函数,函数名与算法名相同。这些函数以消息作为参数,并返回摘要。示例
use Digest::MD5 qw(md5);
$digest = md5($message);
这些函数还有一些版本,在函数名后面添加了 "_hex" 或 "_base64",这些版本会以指定的格式返回摘要。
以下方法适用于所有 Digest::
模块
构造函数返回一个对象,该对象封装了消息摘要算法的状态。你可以向对象添加数据,最后请求摘要。当然,"XXX" 应该替换为你想要使用的摘要算法的正确名称。
前两种形式只是语法糖,它们会在第一次使用时自动加载正确的模块。第二种形式允许你使用包含非法的 Perl 标识符的算法名称,例如 "SHA-1"。如果找不到给定算法的实现,则会引发异常。
要了解构造函数接受哪些参数(如果有的话)(上面的 $args,...
),请查阅特定摘要实现的文档。
如果 new() 被调用为实例方法(即 $ctx->new),它只会将对象的 state 重置为新创建对象的 state。在这种情况下,不会创建新的对象,返回值是对对象的引用(即 $ctx)。
clone 方法创建摘要状态对象的副本,并返回对该副本的引用。
这只是 $ctx->new 的别名。
作为参数提供的 $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 的字符,则此方法可能会出错。
读取 $io_handle 直到 EOF,并将内容追加到我们计算摘要的消息中。返回值是 $ctx 对象本身。
如果由于某种原因无法读取数据,则 addfile() 方法将出错。如果出错,则 $ctx 对象的状态将不可预测。addfile() 方法可能在失败之前已部分读取文件。如果发生这种情况,最好丢弃或重置 $ctx 对象。
在大多数情况下,您需要确保 $io_handle 处于“binmode”模式,然后再将其作为参数传递给 addfile() 方法。
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() 方法将出错。
返回消息的二进制摘要。
请注意,digest
操作实际上是破坏性的、一次性读取操作。一旦执行,$ctx 对象将自动 reset
,可用于计算另一个摘要值。如果您想在不重置摘要状态的情况下计算摘要,请调用 $ctx->clone->digest。
与 $ctx->digest 相同,但将以十六进制形式返回摘要。
与 $ctx->digest 相同,但会将摘要作为无填充的 base64 编码字符串返回。
与 $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 子类化。
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.