內容

名稱

摘要 - 計算訊息摘要的模組

語法

$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」的函式版本,它會以指示的格式傳回摘要。

OO 介面

以下方法可供所有 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 的字元,此方法可能會產生 croak。

$ctx->addfile( $io_handle )

$io_handle 會讀取至 EOF,而內容會附加到我們計算摘要的訊息。傳回值是 $ctx 物件本身。

如果 addfile() 方法因某種原因無法讀取資料,它會產生 croak()。如果它產生 croak,則 $ctx 物件的狀態會是不可預測的。addfile() 方法在失敗之前可能已部分讀取檔案。如果發生這種情況,最好捨棄或重設 $ctx 物件。

在大部分情況下,您會希望在將 $io_handle 傳遞為 addfile() 方法的引數之前,確定它處於「binmode」。

$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 物件會自動重設,並可拿來計算另一個摘要值。如果您想計算摘要而不重設摘要狀態,請呼叫 $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 上執行 ActivePerl-5.8.3 的 P4 2.8 GHz CPU 所取得。最後 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.