日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

PHP安全編程之加密功能_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:PHP技巧:PHP文件系統(tǒng)基本操作類
/* * * ===========Z================= * QQ:118824 * MSN:[email protected] * HP:http://www.snakevil.com/ * ===========Z================= * */ /** * @]Class Name[= IO * @]Class URI[= System.IO * @]Purpose[= * 本類用于對(duì)文件系統(tǒng)的處理 * @]A

數(shù)據(jù)加密在我們生活中的地位已經(jīng)越來越重要了,尤其是考慮到在網(wǎng)絡(luò)上發(fā)生的大量交易和傳輸?shù)拇罅繑?shù)據(jù)。如果對(duì)于采用安全措施有興趣的話,也一定會(huì)有興趣了解PHP提供的一系列安全功能。在本篇文章中,我們將介紹這些功能,提供一些基本的用法,以便你能夠?yàn)樽约旱膽?yīng)用軟件中增加安全功能。

  預(yù)備知識(shí)
  在詳細(xì)介紹PHP的安全功能之前,我們需要花
點(diǎn)時(shí)間來向沒有接觸過這方面內(nèi)容的讀者介紹一些有關(guān)密碼學(xué)的基本知識(shí),如果對(duì)密碼學(xué)的基本概念已經(jīng)非常熟悉,就可以跳過去這一部分。

  密碼學(xué)可以通俗地被描述為對(duì)加/解密的研究和實(shí)驗(yàn),加密是將易懂的資料轉(zhuǎn)換為不易懂資料的過程,解密則是將不易懂的資料轉(zhuǎn)換為原來易懂資料的過程。不易懂的資料被稱作密碼,易懂的資料被稱作明碼。

  數(shù)據(jù)的加/解密都需要一定的算法,這些算法可以非常地簡單,如著名的凱撒碼,但當(dāng)前的加密算法要相對(duì)復(fù)雜得多,其中一些利用現(xiàn)有的方法甚至是無法破譯的。

  PHP的加密功能
  只要有一點(diǎn)使用非Windows平臺(tái)經(jīng)驗(yàn)的人可能對(duì)crypt()也相當(dāng)熟悉,這一函數(shù)完成被稱作單向加密的功能,它可以加密一些明碼,但不能夠?qū)⒚艽a轉(zhuǎn)換為原來的明碼。盡管從表面上來看這似乎是一個(gè)沒有什么用處的功能,但它的確被廣泛用來保證系統(tǒng)密碼的完整性。因?yàn)椋瑔蜗蚣用艿目诹钜坏┞淙氲谌饺说氖掷�,由于不能被還原為明文,因此也沒有什么大用處。在驗(yàn)證用戶輸入的口令時(shí),用戶的輸入采用的也是單向算法,如果輸入與存儲(chǔ)的經(jīng)加密后的口令相匹配,則輸入的口信一定是正確的。

  PHP同樣提供了使用其crypt()函數(shù)完成單向加密功能的可能性。我將在這里簡要地介紹該函數(shù):

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

print "My system salt size is: ". CRYPT_SALT_LENGTH;
  系統(tǒng)也可能支持其他的加密算法。crypt()支持四種算法,下面是它支持的算法和相應(yīng)的salt參數(shù)的長度:

算法 Salt長度
CRYPT_STD_DES 2-character (Default)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with 102/td>
CRYPT_BLOWFISH 16-character beginning with 102/td>

  用crypt()實(shí)現(xiàn)用戶身份驗(yàn)證
  作為crypt()函數(shù)的一個(gè)例子,考慮這樣一種情況,你希望創(chuàng)建一段PHP腳本程序限制對(duì)一個(gè)目錄的訪問,只允許能夠提供正確的用戶名和口令的用戶訪問這一目錄。我將把資料存儲(chǔ)在我喜歡的數(shù)據(jù)庫MySQL的一個(gè)表中。下面我們以創(chuàng)建這個(gè)被稱作members的表開始我們的例子:

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

  然后,我們假定下面的數(shù)據(jù)已經(jīng)存儲(chǔ)在該表中:

用戶名 密碼
clark keloD1C377lKE
bruce ba1T7vnz9AWgk
peter paLUvRWsRLZ4U

  這些加密的口令對(duì)應(yīng)的明碼分別是kent、banner和parker。注意一下每個(gè)口令的前二個(gè)字母,這是因?yàn)槲沂褂昧讼旅娴拇a,根據(jù)口令的前二個(gè)字母創(chuàng)建干擾串的:

.
= substr(, 0, 2);
= crypt(, );
// 然后就和用戶名一起存儲(chǔ)在MySQL中

  我將使用Apache的口令-應(yīng)答認(rèn)證配置提示用戶輸入用戶名和口令,一個(gè)鮮為人知的有關(guān)PHP的信息是,它可以把Apache的口令-應(yīng)答系統(tǒng)輸入的用戶名和口令識(shí)別為和,我將在身份驗(yàn)證腳本中用到這二個(gè)變量�;ㄒ恍⿻r(shí)間仔細(xì)閱讀下面的腳本,多注意一下其中的解釋,以便更好地理解下面的代碼:

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

= "localhost";
= "zorro";
= "hellodolly";
= "users";

// Set authorization to False

= 0;

// Verify that user has entered username and password

if (isset() && isset()) :

mysql_pconnect(, , ) or die("Can''t connect to MySQL
server!");

mysql_select_db() or die("Can''t select database!");

// Perform the encryption
= substr(, 0, 2);
= crypt(, );

// Build the query

= "SELECT username FROM members WHERE
username = '''' AND
password = ''''";

// Execute the query

if (mysql_numrows(mysql_query()) == 1) :
= 1;
endif;

endif;

// confirm authorization

if (! ) :

header(''WWW-Authenticate: Basic realm="rivate"'');
header(''HTTP/1.0 401 Unauthorized'');
print "You are unauthorized to enter this area.";
exit;

else :

print "This is the secret data!";

endif;

?>

  上面就是一個(gè)核實(shí)用戶訪問權(quán)限的簡單身份驗(yàn)證系統(tǒng)。在使用crypt()保護(hù)重要的機(jī)密資料時(shí),記住在缺省狀態(tài)下使用的crypt()并不是最安全的,只能用在對(duì)安全性要求較低的系統(tǒng)中,如果需要較高的安全性能,就需要我在本篇文章的后面介紹的算法。

  下面我將介紹另一個(gè)PHP支持的函數(shù)━━md5(),這一函數(shù)使用MD5散列算法,它有幾種很有趣的用法值得一提:

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

 
使用md5()混編字符串
= "This is some message that I just wrote";
= md5();
print "hash: ";
?>

  結(jié)果:

hash: 81ea092649ca32b5ba375e81d8f4972c
  注意,結(jié)果的長度為32個(gè)字符。再來看一下下面的表,其中的的值有了一點(diǎn)微小的變化:

使用md5()對(duì)一個(gè)稍微變化的字符串進(jìn)行混編
//注意,message中少了一個(gè)s
= "This is some mesage that I just wrote";
= md5();
print "hash2:

";
?>

  結(jié)果:

hash2: e86cf511bd5490d46d5cd61738c82c0c
  可以發(fā)現(xiàn),盡管二個(gè)結(jié)果的長度都是32個(gè)字符,但明文中一點(diǎn)微小的變化使得結(jié)果發(fā)生了很大的變化,因此,混編和md5()函數(shù)是檢查數(shù)據(jù)中微小變化的一個(gè)很好的工具。

  盡管crypt()和md5()各有用處,但二者在功能上都受到一定的限制。在下面的部分中,我們將介紹二個(gè)非常有用的被稱作Mcrypt和Mhash的PHP擴(kuò)展,將大大拓展PHP用戶在加密方面的選擇。

  盡管我們?cè)谏厦娴男」?jié)中說明了單向加密的重要性,但有時(shí)我們可能需要在加密后,再把密碼數(shù)據(jù)還原成原來的數(shù)據(jù),幸運(yùn)的是,PHP通過Mcrypt擴(kuò)展庫的形式提供了這種可能性。

  Mcrypt
Mcrypt 2.5.7 Unix | Win32
  Mcrypt 2.4.7是一個(gè)功能強(qiáng)大的加密算法擴(kuò)展庫,它包括有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
  安裝:
  在標(biāo)準(zhǔn)的PHP軟件包中不包括Mcrypt,因此需要下載它,下載的地址為:ftp://argeas.cs-net.gr/pub/unix/mcrypt/。下載后,按照下面的方法進(jìn)行編譯,并把它擴(kuò)充在PHP中:

下載Mcrypt軟件包。
gunzipmcrypt-x.x.x.tar.gz
tar -xvfmcrypt-x.x.x.tar
./configure --disable-posix-threads
make
make install
cd to your PHP directory.
./configure -with-mcrypt=[dir] [--other-configuration-directives]
make
make install
  當(dāng)然了,根據(jù)你的要求和PHP安裝時(shí)與互聯(lián)網(wǎng)服務(wù)器軟件的關(guān)系,上面的過程可能需要作適當(dāng)?shù)男薷摹?br />
  使用Mcrypt
  Mcrypt的優(yōu)點(diǎn)不僅僅在于其提供的加密算法較多,還在于它可以對(duì)數(shù)據(jù)進(jìn)行加/解密處理,此外,它還提供了35種處理數(shù)據(jù)用的函數(shù)。盡管對(duì)這些函數(shù)進(jìn)行詳細(xì)介紹已經(jīng)超出了這篇文章的范圍,我還是要就幾個(gè)典型的函數(shù)作一下簡要的介紹。

  首先,我將介紹如何使用Mcrypt擴(kuò)展庫對(duì)數(shù)據(jù)進(jìn)行加密,然后再介紹如何使用它進(jìn)行解密。下面的代碼對(duì)這一過程進(jìn)行了演示,首先是對(duì)數(shù)據(jù)進(jìn)行加密,然后在瀏覽器上顯示加密后的數(shù)據(jù),并將加密后的數(shù)據(jù)還原為原來的字符串,將它顯示在瀏覽器上。

使用Mcrypt對(duì)數(shù)據(jù)進(jìn)行加、解密

// Designate string to be encrypted
= "Applied Cryptography, by Bruce Schneier, is
a wonderful cryptography reference.";

// Encryption/decryption key
key = "Four score and twenty years ago";

// Encryption Algorithm
= MCRYPT_RIJNDAEL_128;

// Create the initialization vector for added security.
= mcrypt_create_iv(mcrypt_get_iv_size(,
MCRYPT_MODE_ECB), MCRYPT_RAND);

// Output original string
print "Original string:

";

// Encrypt
= mcrypt_encrypt(, key,
, MCRYPT_MODE_CBC, );

// Convert to hexadecimal and output to browser
print "Encrypted string: ".bin2hex()."

";

= mcrypt_decrypt(, key,
, MCRYPT_MODE_CBC, );

print "Decrypted string: ";

?>

執(zhí)行上面的腳本將會(huì)產(chǎn)生下面的輸出:

Original string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference.

Encrypted string: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc9ea24850478c11742f5cfa1d23fe22fe8 bfbab5e

Decrypted string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference.

  上面的代碼中二個(gè)最典型的函數(shù)是mcrypt_encrypt()和mcrypt_decrypt(),它們的用途是顯而易見的。我使用了“電報(bào)密碼本”模式,Mcrypt提供了幾種加密方式,由于每種加密方式都有可以影響密碼安全的特定字符,因此每種模式都需要了解。對(duì)于沒有接觸過密碼系統(tǒng)的讀者來說,可能對(duì)mcrypt_create_iv()函數(shù)更有興趣,盡管對(duì)這一函數(shù)進(jìn)行徹底的解釋已經(jīng)超出了本篇文章的范圍,但我仍然會(huì)提到它創(chuàng)建的初始化向量(hence, iv),這一向量可以使每條信息彼此獨(dú)立。盡管不是所有的模式都需要這一初始化變量,但如果在要求的模式中沒有提供這一變量,PHP就會(huì)給出警告信息。

  Mhash擴(kuò)展庫
http://sourceforge.net/projects/mhash/

  0.8.3版的Mhash擴(kuò)展庫支持12種混編算法,仔細(xì)檢查Mhash v.0.8.3的頭文件mhash.h可以知道,它支持下面的混編算法:

CRC32 HAVAL160 MD5
CRC32B HAVAL192 RIPEMD160
GOST HAVAL224 SHA1
HAVAL128 HAVAL256 TIGER
安裝
  象Mcrypt一樣,Mhash也沒有包括在PHP軟件包中,對(duì)于非Windows用戶而言,下面是安裝過程:

下載Mhash擴(kuò)展庫
gunzipmhash-x.x.x.tar.gz
tar -xvfmhash-x.x.x.tar
./configure
make
make install
cd

分享:PHP應(yīng)用:PHP在linxu下的安裝與配置
環(huán)境需求與準(zhǔn)備工作 在安裝 PHP 做為 WWW 服務(wù)器的一部份時(shí),我們可以考慮用 UNIX 操作系統(tǒng);或者是 Windows NT/95 等 Win32 API 的平臺(tái)。當(dāng)然,大部份的人都會(huì)使用 UNIX 來當(dāng)作 PHP 的執(zhí)行平臺(tái) (在 Windows NT 的用戶大多數(shù)都會(huì)選擇 IIS ASP),因此,本書的

來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2012-06-11
相關(guān)PHP教程