我們知道在中有實現數據加密的功能,我們今天將為大家介紹的是其中一個可以實現數據加密功能的函數——PHP函數crypt()。 作為PHP函數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
PHP函數crypt()中的這些加密的口令對應的明碼分別是kent、banner和parker。注意一下每個口令的前二個字母, 這是因為我使用了下面的代碼,根據口令的前二個字母創建干擾串的:
- $enteredPassword.
- $salt = substr($enteredPassword, 0, 2);
- $userPswd = crypt($enteredPassword, $salt);
- // $userPswd然後就和用戶名一起存儲在MySQL 中
我將使用Apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關PHP的信息是,它可以把Apache 的口令-應答系統輸入的用戶名和口令識別為$PHP_AUTH_USER和$PHP_AUTH_PW,我將在身份驗證腳本中用到這二個變量。花一些時間仔細閱讀下 面的腳本,多注意一下其中的解釋,以便更好地理解下面的代碼:
PHP函數crypt()和Apache的口令-應答驗證系統的應用
- < ?php
- $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!");
- 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 query
- if (mysql_numrows(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;
- ?>
上面就是一個核實用戶訪問權限的簡單身份驗證系統。在使用PHP函數crypt()保護重要的機密資料時,記住在缺省狀態下使用的PHP函數crypt()並不是最安全的,只能用在對安全性要求較低的系統中,如果需要較高的安全性能,就需要我在本篇文章的後面介紹的算法。