摘要 - 計算訊息摘要的模組
$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),它只會將物件狀態重設為新建立物件的狀態。這種情況下不會建立新的物件,而且傳回值是物件的參考(即 $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 的字元,此方法可能會產生 croak。
$io_handle 會讀取至 EOF,而內容會附加到我們計算摘要的訊息。傳回值是 $ctx 物件本身。
如果 addfile() 方法因某種原因無法讀取資料,它會產生 croak()。如果它產生 croak,則 $ctx 物件的狀態會是不可預測的。addfile() 方法在失敗之前可能已部分讀取檔案。如果發生這種情況,最好捨棄或重設 $ctx 物件。
在大部分情況下,您會希望在將 $io_handle 傳遞為 addfile() 方法的引數之前,確定它處於「binmode」。
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 物件會自動重設
,並可拿來計算另一個摘要值。如果您想計算摘要而不重設摘要狀態,請呼叫 $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 上執行 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 子類別化。
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.