Digest::MD5 - Perl 介面至 MD5 演算法
# Functional style
use Digest::MD5 qw(md5 md5_hex md5_base64);
$digest = md5($data);
$digest = md5_hex($data);
$digest = md5_base64($data);
# OO style
use Digest::MD5;
$ctx = Digest::MD5->new;
$ctx->add($data);
$ctx->addfile($file_handle);
$digest = $ctx->digest;
$digest = $ctx->hexdigest;
$digest = $ctx->b64digest;
Digest::MD5
模組讓您可以在 Perl 程式中使用 RSA Data Security Inc. MD5 訊息摘要演算法。此演算法會將長度任意的訊息作為輸入,並產生 128 位元的輸入「指紋」或「訊息摘要」作為輸出。
請注意 MD5 演算法已不如以往強大。自 2005 年以來,產生產生相同 MD5 摘要的不同訊息已變得容易。產生產生特定摘要的訊息似乎仍然困難,但對於依賴摘要來唯一識別訊息的應用程式,最好改用更強大的演算法。
Digest::MD5
模組提供程序化介面以供簡單使用,以及一個物件導向介面,可處理任意長度的訊息,並可直接讀取檔案。
Digest::MD5
模組提供下列函式。預設情況下,這些函式都不會匯出。
此函式會串接所有引數,計算此「訊息」的 MD5 摘要,並以二進位形式傳回。傳回的字串長度為 16 位元組。
md5("a", "b", "c") 的結果將與 md5("abc") 的結果完全相同。
與 md5() 相同,但會以十六進位形式傳回摘要。傳回的字串長度為 32,且只會包含此集合中的字元:'0'..'9' 和 'a'..'f'。
與 md5() 相同,但會將摘要傳回為 base64 編碼字串。傳回的字串長度為 22,且只會包含此集合中的字元:'A'..'Z', 'a'..'z', '0'..'9', '+' 和 '/'。
請注意,傳回的 base64 編碼字串並未補齊為 4 位元組的倍數長度。如果您要與其他 base64 編碼的 md5 摘要互通,您可能需要將多餘的字串 "==" 附加到結果中。
此部分說明 Digest::MD5
的物件導向介面。建立 Digest::MD5
物件後,您會將資料新增到其中,最後以適當的格式要求摘要。單一物件可拿來計算多個摘要。
提供下列方法
建構函式傳回一個新的 Digest::MD5
物件,封裝 MD5 訊息摘要演算法的狀態。
如果呼叫為實例方法(即 $md5->new),它只會將物件狀態重設為新建立物件的狀態。此情況下不會建立新物件。
這只是 $md5->new 的別名。
這是 $md5 物件的副本。當您不想要毀掉摘要狀態,但需要摘要的中間值時,這很有用,例如在連續資料串流上反覆計算摘要時。範例
my $md5 = Digest::MD5->new;
while (<>) {
$md5->add($_);
print "Line $.: ", $md5->clone->hexdigest, "\n";
}
提供為引數的 $data 會附加到我們為其計算摘要的訊息。傳回值是 $md5 物件本身。
所有這些程式碼行對 $md5 物件的狀態都會有相同的效果
$md5->add("a"); $md5->add("b"); $md5->add("c");
$md5->add("a")->add("b")->add("c");
$md5->add("a", "b", "c");
$md5->add("abc");
$io_handle 會讀取至 EOF,其內容會附加到我們為其計算摘要的訊息。傳回值是 $md5 物件本身。
如果 addfile() 方法因故無法讀取資料,它會 croak()。如果它 croak 了,$md5 物件的狀態將會是什麼是無法預測的。在它失敗之前,addfile() 方法可能已經部分讀取了檔案。如果發生這種情況,最好捨棄或重設 $md5 物件。
在多數情況下,您會想要確保在將 $io_handle 作為引數傳遞給 addfile() 方法之前,它處於 binmode
。
由於 MD5 演算法是以位元組為導向,因此您可能只會將位元組新增為 8 的倍數,所以您可能只想使用 add()。提供 add_bits() 方法是為了與其他摘要實作相容。請參閱 摘要 以取得 add_bits() 所使用的引數說明。
傳回訊息的二進位摘要。傳回的字串長度為 16 位元組。
請注意,digest
作業實際上是一次性的破壞性讀取作業。執行後,Digest::MD5
物件會自動重設
,並可拿來計算其他摘要值。如果您要在不重設摘要狀態的情況下計算摘要,請呼叫 $md5->clone->digest。
與 $md5->digest 相同,但會以十六進位形式傳回摘要。傳回的字串長度為 32,且僅包含下列字元:'0'..'9' 和 'a'..'f'。
與 $md5->digest 相同,但會以 base64 編碼字串傳回摘要。傳回的字串長度為 22,且僅包含下列字元:'A'..'Z', 'a'..'z', '0'..'9', '+' 和 '/'。
傳回的 base64 編碼字串未填補為 4 位元組長度的倍數。如果您要與其他 base64 編碼的 md5 摘要互通,您可能想要在結果後面加上字串 "=="。
儲存或還原內部狀態。如果未帶引數呼叫,則傳回清單:已處理的區塊數、16 位元組內部狀態緩衝區,然後如有任何未處理資料,則最多可傳回 63 位元組。傳遞這些相同引數時,會還原狀態。這僅對特殊作業有用。
使用此函式庫最簡單的方法是匯入 md5_hex() 函式(或其相關函式)
use Digest::MD5 qw(md5_hex);
print "Digest is ", md5_hex("foobarbaz"), "\n";
上述範例會列印出訊息
Digest is 6df23dc03f9b54cc38a0fc1483df6e21
相同的檢查碼也可以用 OO 樣式計算
use Digest::MD5;
$md5 = Digest::MD5->new;
$md5->add('foo', 'bar');
$md5->add('baz');
$digest = $md5->hexdigest;
print "Digest is $digest\n";
使用 OO 樣式,您可以任意中斷訊息。這表示我們不再受限於在記憶體中為整個訊息保留空間,換句話說,我們可以處理任何大小的訊息。
這在計算檔案的檢查碼時很有用
use Digest::MD5;
my $filename = shift || "/etc/passwd";
open (my $fh, '<', $filename) or die "Can't open '$filename': $!";
binmode($fh);
$md5 = Digest::MD5->new;
while (<$fh>) {
$md5->add($_);
}
close($fh);
print $md5->b64digest, " $filename\n";
或者,我們可以使用 addfile 方法更有效率地讀取檔案
use Digest::MD5;
my $filename = shift || "/etc/passwd";
open (my $fh, '<', $filename) or die "Can't open '$filename': $!";
binmode ($fh);
print Digest::MD5->new->addfile($fh)->hexdigest, " $filename\n";
由於 MD5 演算法僅定義為位元組字串,因此無法用於包含序號大於 255 (Unicode 字串) 的字元。如果您嘗試提供此類輸入資料,MD5 函數和方法會出錯
use Digest::MD5 qw(md5_hex);
my $str = "abc\x{300}";
print md5_hex($str), "\n"; # croaks
# Wide character in subroutine entry
您可以做的是計算此類字串的 UTF-8 表示法的 MD5 檢查碼。這可透過透過 encode_utf8() 函數篩選字串來達成
use Digest::MD5 qw(md5_hex);
use Encode qw(encode_utf8);
my $str = "abc\x{300}";
print md5_hex(encode_utf8($str)), "\n";
# 8c2d46911f3f5a326455f0ed7a8ed3b3
RFC 1321
http://en.wikipedia.org/wiki/MD5
Xiaoyun Wang 和 Hongbo Yu 撰寫的論文「如何破解 MD5 和其他雜湊函數」
這個函式庫是免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
Copyright 1998-2003 Gisle Aas.
Copyright 1995-1996 Neil Winton.
Copyright 1991-1992 RSA Data Security, Inc.
MD5 演算法定義在 RFC 1321 中。此實作源自 RFC 1321 中的參考 C 程式碼,受以下版權聲明涵蓋
版權所有 (C) 1991-2,RSA 資料安全公司。建立於 1991 年。保留所有權利。
只要在所有提及或參照此軟體或此函數的文件中將其標示為「RSA 資料安全公司 MD5 訊息摘要演算法」,即授予複製和使用此軟體的授權。
只要在所有提及或參照衍生作品的文件中將其標示為「源自 RSA 資料安全公司 MD5 訊息摘要演算法」,即授予建立和使用衍生作品的授權。
RSA Data Security, Inc. 不對此軟體的適銷性或此軟體對任何特定用途的適用性做出任何陳述。它以「原樣」提供,不提供任何明示或暗示的保證。
這些公告必須保留在此文件和/或軟體的任何部分的任何副本中。
此版權不禁止在 GNU 或 Artistic 授權條款下,散布包含此擴充功能的任何版本的 Perl。
原始的 MD5
介面是由 Neil Winton(N.Winton@axion.bt.co.uk
)編寫的。
Digest::MD5
模組是由 Gisle Aas <gisle@ActiveState.com> 編寫的。