-
- mysql>CREATE TABLE members (
- ->username CHAR(14) NOT NULL,
- ->password CHAR(32) NOT NULL,
- ->PRIMARY KEY(username)
- ->);
-
複製程式碼
然後,我們假定下面的資料已經儲存在該表中:
-
- $enteredPassword.
- $salt = substr($enteredPassword, 0, 2);
- $userPswd = crypt($bentered, $rypt($bentered, $rypt($benter = crypt($enter,crypt” );
- // $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($PHPHP_AUTH_USC) & & password
- if (isset($PHPHP_AUTH_USC) &&iss&W_&iss_AUTH_P_AUTH_U4_&iss&HTHP_ )) :
- mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL
- server!");
- mysql_select_db($db) or die("Can't select database!");
- // Perform the encryption
- $salt = substr($PHP_AUTH_PW, 0, 2);
- $encrypted_pswd = crypt($PHP_AUTH_PW, $salt); Build the query
- $query = "SELECT username FROM members WHERE
- username = '$PHP_AUTH_USER' AND
- password = '$encrypted_pswd'";
- // Execute the queif (mysql_query($query)) == 1) :
- $authorization = 1;
- endif;
- endif;
- // confirm authorization
- if (! $authorization) : header('WWW-Authenticate: Basic realm="Private"');
- header('HTTP/1.0 401 Unauthorized');
- print "You are unauthorized to enter this area.";
- exit;
- else :
- print "This is the secret data!";
- endif;
- >
-
複製代碼
上面就是一個核實使用者存取權限的簡單身份驗證系統。在使用crypt()保護重要的機密資料時,記住在缺省狀態下使用的crypt()並不是最安全的,只能用在對安全性要求較低的系統中,如果需要較高的安全性能,就需要我在本篇文章的後面介紹的演算法。
以下我將介紹另一個PHP支援的函數━━md5(),這函數使用MD5雜湊演算法,它有幾種很有趣的用法值得一提:
混編
一個混編函數可以將一個可變長度的資訊轉換為具有固定長度被混編過的輸出,也被稱為「資訊文摘」。這是十分有用的,因為 一個固定長度的字串可以用來檢查檔案的完整性和驗證數位簽章以及使用者身份驗證。由於它適合PHP,PHP內建的md5()混編函數將把一個可 變長度的資訊轉換為128位元(32個字元)的資訊摘要。混編的一個有趣的特點是不能透過分析混編後的資訊得到原來的明碼,因為混編後的結果 與原來的明碼內容沒有依賴關係。 即便只改變一個字串中的一個字符,也將使得MD5混編演算法計算出二個截然不同的結果。我們首先來看下 表的內容及其對應的結果:
使用md5()混編字串
- $msg = "This is some message that I just wrote";
- $enc_msg = md5($msg);
- "hash🎜> "hash : $enc_msg ";
- >
-
-
複製程式碼
結果:
hash: 81ea092649ca32b5ba375e81d8f4972c
注意,結果的長度為32個字元。再來看一下下面的表,其中的$msg的值有了一點 微小的變化:
使用md5()對一個稍微變化的字串進行混編
- //注意,message中少了一個s
- $msg = "This is some mesage that I just wrote";
- $enc_msg = md5($msg);
- print "hash2: $enc_msg
- ";
- >
-
-
複製程式碼
複製程式碼複製程式碼複製程式碼複製程式碼複製碼結果:
hash2: e86cf511bd5490d46d5cd61738c82c0c
可以發現,儘管二個結果的長度都是32個字符,但明文中一點微小的變化使得結果發生了很大的變化,因此,混編和md5()函數是檢查數據中微小變化的一個很好的工具。
儘管crypt()和md5()各有用處,但二者在功能上都受到一定的限制。在下面的部分中,我們將介紹 二個非常有用的被稱為Mcrypt和Mhash的PHP擴展,將大大拓展PHP用戶在加密方面的選擇。
儘管我們在上面的小節中說明了單向加密的重要性,但有時我們可能需要在加密後,再把密碼數據還原成原來的數據,幸運的是,PHP透過Mcrypt擴展庫的形式提供了這種可能性。
Mcrypt
Mcrypt 2.5.7 Unix | Win32
Mcrypt 2.4.7是一個功能強大的加密演算法擴充庫,它包括有22種演算法 ,其中就包括下面的幾種演算法:
Blowfish RC2 Safer-sk64 xtea
Cast-256 RC4 Safer-sk128
DES RC4-iv Serpent
Enigma Rijndael-128 Threeway
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 Twofish
PanamaSaferplus Wake 1 2 下一頁 尾頁
|