資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量 交易和傳輸的大量資料。假如對於採用安全措施有愛好的話,也一定會有愛好瞭解PHP提供的一系列安全功能。在本篇文章中,我們將介紹這些 功能,提供一些基本的用法,以便你能夠為自己的應用軟體中增加安全功能。
預備知識
在具體介紹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_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $
CRYPT_BLOWFISH 16-character beginning with $
用crypt()實現使用者身分識別驗證
作為crypt()函數的一個例子,考慮這樣一種情況,你希望建立一段PHP指令碼程式限 制對一個目錄的訪問,只答應能夠提供正確的使用者名稱和口令的使用者訪問這一目錄。我將把資料儲存在我喜歡的資料庫MySQL的一個表中。下面我 們以建立這個被稱作members的表開始我們的例子:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);
然後,我們假定下面的資料已經儲存在該表中:
使用者名稱 密碼
clark keloD1C377lKE
bruce ba1T7vnz9AWgk
peter paLUvRWsRLZ4U
這些加密的口令對應的明碼分別是kent、banner和parker。注重一下每個口令的前二個字母, 這是因為我使用了下面的代碼,根據口令的前二個字母建立幹擾串的:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd然後就和使用者名稱一起儲存在MySQL 中
我將使用Apache的口令-應答認證配置提示使用者輸入使用者名稱和口令,一個鮮為人知的有關PHP的資訊是,它可以把Apache 的口令-應答系統輸入的使用者名稱和口令識別為$PHP_AUTH_USER和$PHP_AUTH_PW,我將在身分識別驗證指令碼中用到這二個變數。花一些時間仔細閱讀下 面的指令碼,多注重一下其中的解釋,以便更好地理解下面的代碼:
crypt()和Apache的口令-應答驗證系統的應用
$host = "localhost";
$user = "zorro";
$pswd = "hell odolly";
$db = "users";
// Set authorization to False
$authorization = 0;
// Verify that user has entered username and password
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) :
mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL
server!");
http://www.bkjia.com/PHPjc/629772.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629772.htmlTechArticle資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量 交易和傳輸的大量資料。假如對於採用安全措施有愛好...