預備知識
在詳細介紹PHP的安全功能之前,我們需要花
點時間來向沒有接觸過這方面內容的讀者介紹一些有關密碼學的基本知識,如果對密碼學的基本概念已經非常熟悉,就可以跳過去這一部分。
密碼學可以通俗地被描述為對加/解密的研究和實驗,加密是將易懂的資料轉換為不易懂資料的過程,解密則是將不易懂的資料轉換為原來易懂資料的過程。不易懂的資料被稱作密碼,易懂的資料被稱作明碼。
數據的加/解密都需要一定的算法,這些算法可以非常地簡單,如著名的凱撒碼,但當前的加密算法要相對復雜得多,其中一些利用現有的方法甚至是無法破譯的。
PHP的加密功能
只要有一點使用非Windows平臺經驗的人可能對crypt()也相當熟悉,這一函數完成被稱作單向加密的功能,它可以加密一些明碼,但不能夠將密碼轉換為原來的明碼。盡管從表面上來看這似乎是一個沒有什么用處的功能,但它的確被廣泛用來保證系統密碼的完整性。因為,單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒有什么大用處。在驗證用戶輸入的口令時,用戶的輸入采用的也是單向算法,如果輸入與存儲的經加密后的口令相匹配,則輸入的口信一定是正確的。
PHP同樣提供了使用其crypt()函數完成單向加密功能的可能性。我將在這里簡要地介紹該函數:
string crypt (string input_string [, string salt])
其中的input_string參數是需要加密的字符串,第二個可選的salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預計算攻擊的可能性。缺省情況下,PHP使用一個2個字符的DES干擾串,如果你的系統使用的是MD5(我將在以后介紹MD5算法),它會使用一個12個字符的干擾串。順便說一下,可以通過執行下面的命令發現系統將要使用的干擾串的長度:
print "My system salt size is: ". CRYPT_SALT_LENGTH;
系統也可能支持其他的加密算法。crypt()支持四種算法,下面是它支持的算法和相應的salt參數的長度:
算法 Salt長度
| 以下為引用的內容: CRYPT_STD_DES 2-character (Default) |
用crypt()實現用戶身份驗證
作為crypt()函數的一個例子,考慮這樣一種情況,你希望創建一段PHP腳本程序限制對一個目錄的訪問,只允許能夠提供正確的用戶名和口令的用戶訪問這一目錄。我將把資料存儲在我喜歡的數據庫MySQL的一個表中。下面我們以創建這個被稱作members的表開始我們的例子:
| 以下為引用的內容: mysql>CREATE TABLE members ( |
然后,我們假定下面的數據已經存儲在該表中:
| 以下為引用的內容: 用戶名 密碼 |
這些加密的口令對應的明碼分別是kent、banner和parker。注意一下每個口令的前二個字母,這是因為我使用了下面的代碼,根據口令的前二個字母創建干擾串的:
| 以下為引用的內容: . |
我將使用Apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關PHP的信息是,它可以把Apache的口令-應答系統輸入的用戶名和口令識別為和,我將在身份驗證腳本中用到這二個變量。花一些時間仔細閱讀下面的腳本,多注意一下其中的解釋,以便更好地理解下面的代碼:
新聞熱點
疑難解答