1. 程式人生 > >PHP中的MD5加密

PHP中的MD5加密

綜述:密碼學是研究編制密碼(我們簡稱為加密:encode)和破譯密碼(我們稱之為解密:decode)的技術科學。研究密碼變化的客觀規律,應用於編制密碼以保守通訊祕密的,稱為編碼學;應用於破譯密碼以獲取通訊情報的,稱為破譯學,總稱密碼學。通常情況下,人們將可懂的文字稱為明文;將明文變換成的不可懂的文字稱為密文。把明文變換成密文的過程叫加密;其逆過程,即把密文變換成明文的過程叫解密。

PHP中提供了哪些資料加密功能?

PHP提供了crypt()函式完成加密功能:

stringcrypt (string input_string [,string salt]) 
這一函式完成被稱作單向加密的功能,也就是說,它可以加密一些明碼,但不能夠將密碼轉換為原來的明碼。單向加密的口令一旦落入第三方人的手裡,由於不能被還原為明文,因此也沒有什麼大用處。在驗證使用者輸入的口令時,使用者的輸入採用的也是單向演算法,如果輸入與儲存的經加密後的口令相匹配,則輸入的口令一定是正確的。

這個函式的input_string引數是需要加密的字串,第二個引數salt是一個位字串,它能夠影響加密的暗碼,進一步地排除被稱作預計算攻擊的可能性。預設情況下,PHP使用一個2個字元的DES干擾串,如果你的系統使用的是MD5 ,它會使用一個12個字元的干擾串。我們可以通過執行下面的命令發現系統將要使用的干擾串的長度:

print "系統使用的干擾串的長度是:". CRYPT_SALT_LENGTH;

crypt()支援四種演算法,下面是它支援的演算法和相應的salt引數的長度:
[注:以下用表格]

演算法 Salt長度
CRYPT_STD_DES 2-character (預設)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$

怎樣將PHP的資料加密功能應用於使用者驗證?

我們用crypt()實現使用者身份驗證。比如我們用一段PHP程式限制對一個目錄的訪問,只允許註冊使用者訪問這一目錄。我們把資料儲存MySQL資料庫的一個表(這個資料表名為members)中:

CREATETABLE members ( 
    username 
CHAR(14NOTNULL
    password 
CHAR(32NOTNULL
   
PRIMARYKEY(username) 
); 

然後,我們可以輸入使用者的資料到該表中:

使用者名稱 密碼
Tom keloD1C377lKE
John ba1T7vnz9AWgk
Bill paLUvRWsRLZ4U

這些加密的口令對應的明碼分別是Tom、John和Bill。我們將根據口令的前二個字母建立干擾串:

$enteredPassword. 
$salt=substr($enteredPassword,0,2
); 
$userPswd=crypt($enteredPassword,$salt); 

// $userPswd然後就和使用者名稱一起儲存在MySQL 中
crypt()和Apache的口令-應答驗證系統的應用

<?php 

$host="localhost"//主機
$username="Tom"//使用者名稱$passwd="Hello world"//密碼$db="users"//資料庫名 

// 設定是否通過驗證標誌,預設為否$authorization=0


// 提示使用者輸入帳號和密碼 


if (isset($PHP_AUTH_USER&&isset($PHP_AUTH_PW)){

mysql_pconnect($host,$username,$passwd) or die("不能連線到MySQL伺服器!"
); 

mysql_select_db($db) or die("不能選擇資料庫!"
); 


// 進行加密
$salt=substr($PHP_AUTH_PW,0,2); 

$encrypted_pswd=crypt($PHP_AUTH_PW,$salt
); 


//SQL查詢語句
$query="SELECT username FROM members WHERE username = '$PHP_AUTH_USER' AND password = '$encrypted_pswd'"


// 執行查詢
if (mysql_numrows(mysql_query($query)) ==1) {

$authorization=1

}
} 


if (!$authorization
){

header('
WWW-Authenticate: Basic realm="使用者驗證"'); 
header('HTTP/1.0 401 Unauthorized'); 
print "無法通過驗證"; 
exit; 
}else {
print "已經加密"; 
}
?>

在預設狀態下使用的 crypt()並不是最安全的,所以如果需要較高的安全效能,就需要其他更好的演算法,比如md5(),這一函式使用MD5雜湊演算法。

如何通過MD5方式進行加密?

PHP中通過MD5方式加密的函式有md5(),它的一個作用是混編。
一個混編函式可以將一個可變長度的資訊變換為具有固定長度被混編過的輸出,也被稱作"資訊文摘",這是十分有用的,因為 一個固定長度的字串可以用來檢查檔案的完整性和驗證數字簽名與使用者身份。PHP內建的md5()混編函式將把一個可變長度的資訊轉換為128位(32個字元)的資訊文摘。混編的一個有趣的特點是:不能通過分析混編後的資訊得到原來的明碼,因為混編後的結果 與原來的明碼內容沒有依賴關係。即便只改變一個字串中的一個字元,也將使得MD5混編演算法計算出二個截然不同的結果。我們首先來看下錶的內容及其相應的結果:

使用md5()混編字串
<?php 
    
$input="Hello,PHP World!"
    
$output=md5($input); 
    
print"輸出: $output "
?> 結果:
輸出: 7996b5e0804042fd531907a4900f190e
注意,結果的長度為32個字元。我們把$input的值稍微改變一下:
使用md5()對一個稍微變化的字串進行混編
<?php 
    
$input="Hello,PHP World!"
    
$output=md5($input); 
    
print"輸出: $output "
?> 結果:
hash2: f0456d48ed06a5c35b1e42561fa7a016
可以發現,儘管二個結果的長度都是32個字元,但明文中一點微小的變化使得結果發生了很大的變化,我們可以利用這個特點來檢查資料中微小變化。