用Perl來管理Apache驗證身份時所用的密碼(轉)

post0發表於2007-08-09
用Perl來管理Apache驗證身份時所用的密碼(轉)[@more@]

本文介紹如何用Perl來管理Apache驗證身份時所用的密碼,包括如何加密密碼,如何修改文字檔案、DBM資料庫、MySQL資料庫中的使用者記錄,等等。

一、加密密碼(3月26日)

   前面三篇文章討論了在Apache上實現身份驗證的各種方法,即如何在使用者訪問某些受保護的資源時顯示一個要求輸入名字和密碼的對話方塊。手工管理密碼往往是非常麻煩的,這裡要介紹的就是一些透過Perl自動維護密碼列表的方法。

   注意:本文假定你已經具備一些Perl的基礎知識。如果你還沒有聽說過Perl,下面是一個簡單的介紹:Perl是一種程式語言。它是一種非常流行的程式語言,在文字處理、埠通訊、協調多個不同應用以及完成其他諸多工時都受到人們的歡迎。Perl同時也是一種頗有名氣的流行CGI程式語言,不過這只是Perl諸多應用中的一種。

   在使用者和密碼的管理中,掌握加密密碼的方法是非常必要和有用的。Perl提供了一個內建的函式來完成這一任務,這個函式就是crypt。要使用這個函式,你必須先搞清楚下面這些問題。

   首先,正如以前的一篇文章所提到的,Apache以“Unix crypt”格式儲存密碼,用Perl的crypt函式加密字串得到的也是這種格式。為加密字串,我們需要一個稱為“salt”的字串,它是兩個(或者兩個以上)字元構成的字串,用於啟動加密過程。salt一般是隨機生成的,根據所選salt的不同加密字串之後得到的結果也不同。

   在Perl程式中呼叫crypt函式的形式如下所示:

$encrypted = crypt ($password, $salt);

   上例假定$password已經由使用者透過某種方式提供,$salt已經透過某種方式生成。請參見下面的更多說明。

   crypt是一種不可逆的加密演算法,也就是說,一旦我們加密了一個字串就沒有辦法把它還原得到原來的字串。這意味著,要知道使用者輸入的密碼是否和正確的密碼一樣,唯一的方法是把使用者輸入的密碼也加密,看看加密結果是否和正確密碼的加密結果一樣。當然,兩次加密所用的salt應該一樣。 crypt函式把加密所用的salt作為加密結果的前兩個字元保留,所以我們可以用如下程式碼驗證使用者輸入的密碼是否正確:

$guess_encrypted = crypt ($guess, $encrypted);

if ($guess_encrypted eq $encrypted) {

print "密碼正確. ";

}

else {

print "密碼錯誤. ";

}

   當我們為salt指定一個具體的字串時,Perl知道且只使用該字串的前面兩個字元:

   順便說一下,如果要自己生成salt,我們可以使用下面的程式碼:

@a=(0..9,&single;a&single;..&single;z&single;);

$pass = join &single;&single;, map { $a[int rand @a] } (0..1);

   這段程式碼生成了一個由兩個字元構成的字串,字元可能是字母也可能是數字。當然,和Perl中的其他許多事情一樣,我們還可以使用其他各種方法生成salt

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-937365/,如需轉載,請註明出處,否則將追究法律責任。

相關文章