首頁 > 後端開發 > php教程 > PHP中的加密功能_PHP教程

PHP中的加密功能_PHP教程

WBOY
發布: 2016-07-21 16:09:55
原創
732 人瀏覽過


資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量交易和傳輸的大量資料。如果對於採用安全措施有興趣的話,也一定會有興趣了解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 $1$ CRYPT_BLOWFISH 16-character beginning with $2$ 用crypt()實現用戶身份驗證     作為crypt()函數的一個例子,考慮這樣一種情況,你希望創建一段PHP腳本程序限制對一個目錄的訪問,只允許能夠提供正確的用戶名和口令的用戶訪問這一目錄。我將把資料儲存在我喜歡的資料庫MySQL的一個表中。下面我們以建立這個被稱為members的表格開始我們的例子: mysql>CREATE TABLE members (
    ->username CHAR(14) NOT NULL,
    ->password CHAR(32) NOT NULL,
    ->PRIMARMARYo>     然後,我們假定下面的資料已經儲存在該表中: 使用者名稱 密碼 clark keloD1C377lKE bruce ba1T7vnz9AWgk peter paLUvRWsRLZ4U     這些加密的口令對應的明碼分別是kent、banner和parker。注意每個口令的前二個字母,這是因為我使用了下面的代碼,根據口令的前二個字母創建幹擾串的: $enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $sSQLalt);
// $userPswd然後就和使用者名稱一起儲存在MySQLalt);
// $userPswd然後就和使用者名稱一起儲存在MySQLalt);// $userPswd然後就和使用者名稱一起儲存在MySQLalt中 我將使用Apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關PHP的信息是,它可以把Apache的口令-應答系統輸入的用戶名和口令識別為$PHP_AUTH_USER和$PHP_AUTH_PW,我將在身份驗證腳本中用到這二個變數。花一些時間仔細閱讀下面的腳本,多注意其中的解釋,以便更好地理解下面的程式碼: crypt()和Apache的口令-應答驗證系統的應用
$host = "localhost";
$user = "zorro";
$pswd = "hellodolly";
$db = "users";

// Set authorization to False

$authorization = 0;

// Verify that user has entered username and password

if (S1%) ($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_ps = crycrypted(ps = crypt)( $PHP_AUTH_PW, $salt);

// Build the query

$query = "SELECT username FROM members WHERE
username = '$PHP_AUTH_USER' ANDTH_USER'pass
encrypted_pswd'";

// Execute the query

if (mysql_numrows(mysql_query($query)) == 1) :
$authorization = 1;
; 🎜>
endif;

// confirm authorization

if (! $authorization) :

header('WWW-Authenticate) :

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

else :
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,因此需要下載它,下載的地址為:ftp://argeas.cs-net.gr/pub/unix/mcrypt/。下載後,按照下面的方法進行編譯,並將它擴充在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     當然了,根據你的要求和PHP安裝時與網路伺服器軟體的關係,上面的過程可能需要做適當的修改。 使用Mcrypt     Mcrypt的優點不僅在於其提供的加密演算法較多,還在於它可以對資料進行加/解密處理,此外,它還提供了35種處理資料用的函數。儘管對這些函數進行詳細介紹已經超出了這篇文章的範圍,我還是要就幾個典型的函數作一下簡要的介紹。     首先,我將介紹如何使用Mcrypt擴充函式庫對資料進行加密,然後再介紹如何使用它進行解密。下面的程式碼對這一過程進行了演示,首先是對數據進行加密,然後在瀏覽器上顯示加密後的數據,並將加密後的數據還原為原來的字串,將它顯示在瀏覽器上。使用Mcrypt對資料進行加、解密

// 指定要加密的字串
$string = "Applied Cryptography, by Bruce Schneier, is
一本精彩的密碼學參考資料。";

/ /加解密金鑰
$key = "四分二十年前";

//加密演算法
$cipher_alg = MCRYPT_RIJNDAEL_128;

//建立初始化向量新增了安全性。
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg,
MCRYPT_MODE_ECB), MCRYPT_RAND);

//輸出原始字串
print


// 加密$string
$encrypted_string = mcrypt_encrypt($cipher_alg, $key,
$string, MCRYPT_MODE_CBC, $iv);
print "加密字串: ".bin2hex($encrypted_string)."

";

$decrypted_string = mcrypt_decrypt($cipher_alg, $key,
$ encrypted_string, MCRYPT_MODE_CBC, $iv);

印出「解密的字串:$decrypted_string」;

?> 執行上面的腳本將會產生下面的輸出: 原始字串:Bruce Schneier 的 Applied Cryptography,是一本精彩的密碼學參考資料。 加密字串:02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d95541febcecf 742f5cfa1d23fe22fe8 bfbab5e 解密的字串:Bruce Schneier 所寫的《應用密碼學》是一本精彩的密碼參​​考書。     上面的程式碼中兩個最典型的函數是mcrypt_encrypt()和mcrypt_decrypt(),它們的用途是原創的。我使用了「電報密碼本」模式,Mcrypt提供了幾種加密方式,由於多種加密方式都有可以影響密碼安全特定的字符,因此終結模式都需要了解。對於沒有接觸過密碼系統的讀者來說,可能對mcrypt_create_iv() 函數更加感興趣,儘管對這個函數進行徹底的解釋已經超出了本文文章的範圍,但我仍然提到它創建的初始化保護(因此, iv),該保護可以使每個資訊相互獨立。雖然不是所有的模式都需要這個初始化變量,但如果有要求的模式中沒有提供該標誌,PHP就會給出警告訊息。 Mhash擴充庫 http://sourceforge.net/projects/mhash/     0.8.3版的Mhash擴充庫支援12種混編演算法,仔細檢查Mhash v.0.8.3的頭檔mhash.h可以知道,它支援下面的混編演算法: CRC32 哈弗160 MD5 CRC32B 哈弗192 RIPEMD160 古斯特哈弗224 SHA1 哈弗128 哈弗256 虎 安裝     象Mcrypt一樣,Mhash也不包括在PHP中,對於非Windows用戶,以下是安裝過程: 下載Mhash擴充函式庫 gunzipmhash-x.x.x.tar.gz tar -xvfmhash-x.x.x.tar ./配置 製作 進行安裝 cd ; ./configure -with-mhash=[dir] [--other-configuration-directives] 製作 進行安裝     象Mcrypt一樣,依據PHP在網路伺服器軟體上的安裝方式,可能需要對Mhash進行其他的設定。     對於 Windows 使用者而言,http://www.php4win.de 有一個很好的包括 Mhash 擴充函式庫聲明的 PHP 平衡。只需下載並進行解壓縮,然後根據其中的 readme.first 文件中的指示進行安裝即可。 使用Mhash     對資訊進行混編非常簡單,請看下面的範例: $hash_alg = MHASH_TIGER;
$message = "這些是通往秘密堡壘的方向。左兩步,右三步,恰恰。";
$hashed_message = mhash( $hash_alg, $message);
列印「哈希訊息是」。 bin2hex($hashed_message);
?>;     執行這段腳本程式將會得到下面的輸出結果:雜湊訊息是 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 這裡使用bin2hex()函數的目的是方便我們理解$hashed_message的輸出,這是因為混編的結果是二進位格式,為了能夠將其轉換為易於理解的格式,必須將其轉換為音響十六進位格式。     需要注意的是,混編是單向功能,其結果不依賴輸入,因此可以公開顯示該資訊。此策略通常讓使用者比較下載文件和系統管理員提供的文件,以確保文件的完整性。      Mhash 還有其他一些有用的函數。例如,我需要輸出一個Mhash支援的演算法的名字,由於Mhash支援的所有演算法的名字都以MHASH_開頭,因此,可以透過執行如下的程式碼完成這項任務: $hash_alg = MHASH_TIGER;
print "This data has been hashed with the".mhash_get_hash_name($hashed_message)."hashing algorithm.";
?> 得到的輸出是:This data has been hashed with the TIGER hashing algorithm. 關於PHP和加密最後需要注意的問題     關於PHP和加密需要注意的最後一個重要的問題是在伺服器和用戶端之間傳輸的資料在傳輸過程中是不安全的! PHP是一種伺服器端技術,無法阻止資料在傳輸過程中洩密。因此,如果想要實現一個完整的安全應用,建議選用Apache-SSL或其他的安全伺服器佈置。 結論 這篇文章介紹了PHP最有用的功能之一━━資料加密,不僅討論了PHP內建的crypt() 和md5()加密函數,還討論了用於資料加密的功能強大的擴充庫━━Mcrypt和Mhash。在這篇文章最後,我需要指出的是,一個真正安全的PHP應用程式還應該包括安全的伺服器,由於PHP是一種伺服器端的技術,因此,當資料由客戶端向伺服器端進行傳輸時,它不能保證資料的安全。

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314399.htmlTechArticle資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量交易和傳輸的大量數據。如果對於採用安全措施有興趣...
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板