程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 數據加密

PHP 數據加密

編輯:關於PHP編程

數據加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網絡上發生的大量 交易和傳輸的大量數據。如果對於采用安全措施有興趣的話,也一定會有興趣了解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!");
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;
?>
上面就是一個核實用戶訪問權限的簡單身份驗證系統。在使用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);
print "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

安裝:
在標准的PHP軟件包中不包括Mcrypt,因此需要下載它,下載的地址為:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved