建立一個摘要字串,就像 C 函式庫中的 crypt(3) 函式(假設您實際上有一個版本,尚未被當作潛在軍火而根除)。
crypt
是單向雜湊函式。PLAINTEXT 和 SALT 會轉換成一個稱為摘要的短字串,並回傳。相同的 PLAINTEXT 和 SALT 永遠會回傳相同的字串,但沒有(已知的)方法可以從雜湊中取得原始的 PLAINTEXT。PLAINTEXT 或 SALT 的小變更會導致摘要有大幅的變更。
沒有解密函式。此函式對密碼學來說並非非常有用(針對此目的,請在您附近的 CPAN 鏡像尋找 Crypt 模組),而「crypt」這個名稱有點名不符實。相反地,它主要用於檢查兩段文字是否相同,而不必傳輸或儲存文字本身。一個範例是檢查是否提供了正確的密碼。密碼的摘要會儲存起來,而不是密碼本身。使用者輸入的密碼會使用與儲存摘要相同的鹽值進行 crypt
。如果兩個摘要相符,則密碼正確。
在驗證現有的摘要字串時,您應該使用摘要作為鹽值(例如 crypt($plain, $digest) eq $digest
)。用於建立摘要的 SALT 會顯示為摘要的一部分。這可確保 crypt
會使用與摘要相同的鹽值雜湊新的字串。這讓您的程式碼可以使用標準 crypt
和更特別的實作。換句話說,不要對回傳的字串本身或可能重要的 SALT 位元組數目做任何假設。
傳統上,結果是一個 13 位元組的字串:鹽值的兩個第一個位元組,接著是來自 [./0-9A-Za-z]
集合的 11 個位元組,而只有 PLAINTEXT 的前八個位元組會產生影響。但替代雜湊方案(例如 MD5)、更高級別的安全方案(例如 C2)和非 Unix 平台上的實作可能會產生不同的字串。
在選擇新的鹽時,請建立一個隨機的兩個字元字串,其字元來自於字元組 [./0-9A-Za-z]
(例如 join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]
)。這組字元只是一個建議;鹽中允許的字元僅取決於您的系統的加密函式庫,而 Perl 無法限制 crypt
接受的鹽。
以下是範例,可確保執行此程式的人知道其密碼
my $pwd = (getpwuid($<))[1];
system "stty -echo";
print "Password: ";
chomp(my $word = <STDIN>);
print "\n";
system "stty echo";
if (crypt($word, $pwd) ne $pwd) {
die "Sorry...\n";
} else {
print "ok\n";
}
當然,將您自己的密碼輸入給要求您輸入密碼的人是不明智的。
crypt
函式不適合用於雜湊大量資料,最主要的原因是您無法取得資訊。請查看 Digest 模組,以取得更強健的演算法。
如果對 Unicode 字串 (可能 有字元碼點高於 255) 使用 crypt
,Perl 會嘗試在呼叫 crypt
(對該副本) 之前,讓 (副本的) 字串降級回八位元組字串,以了解情況。如果可行,很好。如果不行,crypt
會因為 Wide character in crypt
而死掉。
移植性問題:perlport 中的「crypt」。