淺析PHP數(shù)據(jù)加密

隨著互聯(lián)網(wǎng)的快速發(fā)展,數(shù)據(jù)加密在我們生活中的地位已經(jīng)越來(lái)越重要了,尤其是考慮到在網(wǎng)絡(luò)上發(fā)生的大量交易和傳輸?shù)拇罅繑?shù)據(jù)。如果對(duì)于采用安全措施有興趣的話,也一定會(huì)有興趣了解PHP提供的一系列安全功能。那么我們今天就給大家詳細(xì)的介紹一下PHP加密。

PHP中提供了哪些數(shù)據(jù)加密功能?

PHP提供了crypt()函數(shù)完成加密功能:

string crypt (string input_string [, string salt])

這一函數(shù)完成被稱作單向加密的功能,也就是說(shuō),它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來(lái)的明碼。單向加密的口令一旦落入第三方人的手里,由于不能被還原為明文,因此也沒(méi)有什么大用處。在驗(yàn)證用戶輸入的口令時(shí),用戶的輸入采用的也是單向算法,如果輸入與存儲(chǔ)的經(jīng)加密后的口令相匹配,則輸入的口令一定是正確的。

這個(gè)函數(shù)的input_string參數(shù)是需要加密的字符串,第二個(gè)參數(shù)salt是一個(gè)位字串,它能夠影響加密的暗碼,進(jìn)一步地排除被稱作預(yù)計(jì)算攻擊的可能性。缺省情況下,PHP使用一個(gè)2個(gè)字符的DES干擾串,如果你的系統(tǒng)使用的是MD5 ,它會(huì)使用一個(gè)12個(gè)字符的干擾串。我們可以通過(guò)執(zhí)行下面的命令發(fā)現(xiàn)系統(tǒng)將要使用的干擾串的長(zhǎng)度:

print "系統(tǒng)使用的干擾串的長(zhǎng)度是:". CRYPT_SALT_LENGTH;

crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長(zhǎng)度:

算法
Salt長(zhǎng)度
CRYPT_STD_DES 2-character (默認(rèn))
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $1$
CRYPT_BLOWFISH 16-character beginning with $2$

怎樣將PHP的數(shù)據(jù)加密功能應(yīng)用于用戶驗(yàn)證?

我們用crypt()實(shí)現(xiàn)用戶身份驗(yàn)證。比如我們用一段PHP程序限制對(duì)一個(gè)目錄的訪問(wèn),只允許注冊(cè)用戶訪問(wèn)這一目錄。我們把資料存儲(chǔ)MySQL數(shù)據(jù)庫(kù)的一個(gè)表(這個(gè)數(shù)據(jù)表名為members)中:

mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);

然后,我們可以輸入用戶的數(shù)據(jù)到該表中:

這些加密的口令對(duì)應(yīng)的明碼分別是Tom、John和Bill。我們將根據(jù)口令的前二個(gè)字母創(chuàng)建干擾串:

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

// $userPswd然后就和用戶名一起存儲(chǔ)在MySQL 中

crypt()和Apache的口令-應(yīng)答驗(yàn)證系統(tǒng)的應(yīng)用

<?php
$host = "localhost"; //主機(jī)
$username = "Tom"; //用戶名
$passwd = "Hello world"; //密碼
$db = "users"; //數(shù)據(jù)庫(kù)名// 設(shè)置是否通過(guò)驗(yàn)證標(biāo)志,默認(rèn)為否
$authorization = 0;// 提示用戶輸入帳號(hào)和密碼if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)){
mysql_pconnect($host, $username, $passwd) or die("不能連接到MySQL服務(wù)器!");
mysql_select_db($db) or die("不能選擇數(shù)據(jù)庫(kù)!");// 進(jìn)行加密
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);//SQL查詢語(yǔ)句
$query = "SELECT username FROM members WHERE username = /'$PHP_AUTH_USER/' AND password = /'$encrypted_pswd/'";// 執(zhí)行查詢
if (mysql_numrows(mysql_query($query)) == 1) {
$authorization = 1;
}
}if (! $authorization){
header(/'WWW-Authenticate: Basic realm="用戶驗(yàn)證"/');
header(/'HTTP/1.0 401 Unauthorized/');
print "無(wú)法通過(guò)驗(yàn)證";
exit;
}else {
print "已經(jīng)加密";
}
?>

在缺省狀態(tài)下使用的 crypt()并不是最安全的,所以如果需要較高的安全性能,就需要其他更好的算法,比如md5(),這一函數(shù)使用MD5散列算法。

如何通過(guò)MD5方式進(jìn)行加密?

PHP中通過(guò)MD5方式加密的函數(shù)有md5(),它的一個(gè)作用是混編。

一個(gè)混編函數(shù)可以將一個(gè)可變長(zhǎng)度的信息變換為具有固定長(zhǎng)度被混編過(guò)的輸出,也被稱作"信息文摘",這是十分有用的,因?yàn)?一個(gè)固定長(zhǎng)度的字符串可以用來(lái)檢查文件的完整性和驗(yàn)證數(shù)字簽名與用戶身份。PHP內(nèi)置的md5()混編函數(shù)將把一個(gè)可變長(zhǎng)度的信息轉(zhuǎn)換為128位(32個(gè)字符)的信息文摘。混編的一個(gè)有趣的特點(diǎn)是:不能通過(guò)分析混編后的信息得到原來(lái)的明碼,因?yàn)榛炀幒蟮慕Y(jié)果 與原來(lái)的明碼內(nèi)容沒(méi)有依賴關(guān)系。即便只改變一個(gè)字符串中的一個(gè)字符,也將使得MD5混編算法計(jì)算出二個(gè)截然不同的結(jié)果。我們首先來(lái)看下表的內(nèi)容及其相應(yīng)的結(jié)果:

使用md5()混編字符串

<php
$input = "Hello,PHP world!";
$output = md5($input);
print "輸出: $output ";
?>

結(jié)果:

輸出: 7996b5e0804042fd531907a4900f190e

注意,結(jié)果的長(zhǎng)度為32個(gè)字符。我們把$input的值稍微改變一下:

使用md5()對(duì)一個(gè)稍微變化的字符串進(jìn)行混編

<?php
$input = "Hello,PHP World!";
$output = md5($input);
print "輸出: $output ";
?>

結(jié)果:

hash2: f0456d48ed06a5c35b1e42561fa7a016
可以發(fā)現(xiàn),盡管二個(gè)結(jié)果的長(zhǎng)度都是32個(gè)字符,但明文中一點(diǎn)微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個(gè)特點(diǎn)來(lái)檢查數(shù)據(jù)中微小變化。

結(jié)果:

hash2: f0456d48ed06a5c35b1e42561fa7a016
可以發(fā)現(xiàn),盡管二個(gè)結(jié)果的長(zhǎng)度都是32個(gè)字符,但明文中一點(diǎn)微小的變化使得結(jié)果發(fā)生了很大的變化,我們可以利用這個(gè)特點(diǎn)來(lái)檢查數(shù)據(jù)中微小變化。

一個(gè)真正 安全的PHP應(yīng)用還應(yīng)該包括安全的服務(wù)器,由于PHP是一種服務(wù)器端的技術(shù),因此,在數(shù)據(jù)由客戶端向服務(wù)器端進(jìn)行傳輸時(shí),它不能保證數(shù)據(jù)的 安全。

小知識(shí)之crypt():

crypt() 函數(shù)返回使用 DES、Blowfish 或 MD5 加密的字符串。 在不同的操作系統(tǒng)上,本函數(shù)的行為不同,某些操作系統(tǒng)支持一種以上的算法類型。在安裝時(shí),PHP 會(huì)檢查什么算法可用以及使用什么算法。