close
php 字串加密~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()混編字符串 <?php $msg = "This is some message that I just wrote"; $enc_msg = md5($msg); print "hash: $enc_msg "; ?> 結果: hash: 81ea092649ca32b5ba375e81d8f4972c 注意,結果的長度為32個字符。再來看一下下面的表,其中的$msg的值有了一點 微小的變化: 使用md5()對一個稍微變化的字符串進行混編 <?php //注意,message中少了一個s $msg = "This is some mesage that I just wrote"; $enc_msg = md5($msg); print "hash2: $enc_msg <br /><br />"; ?> 結果: hash2: e86cf511bd5490d46d5cd61738c82c0c 可以 發現,儘管二個結果的長度都是32個字符,但明文中一點微小的變化使得結果發生了很大的變化,因此,混編和md5()函數是檢查數據中微小變 化的一個很好的工具。 儘管crypt()和md5()各有用處,但二者在弁鄐W都受到一定的限制。在下面的部分中,我們將介紹 二個非常有用的被稱作Mcrypt和Mhash的PHP擴展,將大大拓展PHP用戶在加密方面的選擇。 儘管我們在上面的小節中說明了 單向加密的重要性,但有時我們可能需要在加密後,再把密碼數據還原成原來的數據,幸運的是,PHP通過Mcrypt擴展庫的形式提供了這種可能 性。 Mcrypt Mcrypt 2.5.7 Unix | Win32 Mcrypt 2.4.7是一個弁鈺j大的加密算法擴展庫,它包括有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對數據進行加、解密 <?php // Designate string to be encrypted $string = "Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference."; // Encryption/decryption key $key = "Four score and twenty years ago"; // Encryption Algorithm $cipher_alg = MCRYPT_RIJNDAEL_128; // Create the initialization vector for added security. $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND); // Output original string print "Original string: $string <p>"; // Encrypt $string $encrypted_string = mcrypt_encrypt($cipher_alg, $key, $string, MCRYPT_MODE_CBC, $iv); // Convert to hexadecimal and output to browser print "Encrypted string: ".bin2hex($encrypted_string)."<p>"; $decrypted_string = mcrypt_decrypt($cipher_alg, $key, $encrypted_string, MCRYPT_MODE_CBC, $iv); print "Decrypted string: $decrypted_string"; ?> 執行上面的腳本將會產生下面的輸出: 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. 上面的代碼中二個最典型的函數是mcrypt_encrypt()和 mcrypt_decrypt(),它們的用途是顯而易見的。我使用了「電報密碼本」模式,Mcrypt提供了幾種加密方式,由於每種加密方式都有可以影響 密碼安全的特定字符,因此每種模式都需要瞭解。對於沒有接觸過密碼系統的讀者來說,可能對mcrypt_create_iv()函數更有興趣,儘管對這 一函數進行徹底的解釋已經超出了本篇文章的範圍,但我仍然會提到它創建的初始化向量(hence, iv),這一向量可以使每條信息彼此獨立。 儘管不是所有的模式都需要這一初始化變量,但如果在要求的模式中沒有提供這一變量,PHP就會給出警告信息。 Mhash擴展庫 http://sourceforge.net/projects/mhash/ 0.8.3版的Mhash擴展庫支持12種混編算法,仔細檢查Mhash v.0.8.3的頭文件mhash.h可以知道,它支持下面的混編算法: CRC32 HAVAL160 MD5 CRC32B HAVAL192 RIPEMD160 GOST HAVAL224 SHA1 HAVAL128 HAVAL256 TIGER 安裝 象Mcrypt一 樣,Mhash也沒有包括在PHP軟件包中,對於非Windows用戶而言,下面是安裝過程: 下載Mhash擴展庫 gunzipmhash-x.x.x.tar.gz tar -xvfmhash-x.x.x.tar ./configure make make install cd <PHP所在的目錄 > ./configure -with-mhash=[dir] [--other-configuration-directives] make make install 象Mcrypt一樣 ,根據PHP在互聯網服務器軟件上的安裝方式,可能需要對Mhash進行其他的配置。 對於Windows用戶而言, 括Mhash擴展庫在內的PHP軟件包。只要下載並進行解壓縮,然後根據其中的readme.first文檔中的指]http://www.php4win.de中有一個很好的包括Mha...first文檔中的指 令進行安裝即可。 使用Mhash 對信息進行混編非常簡單,看一下下面的例子: <?php $hash_alg = MHASH_TIGER; $message = "These are the directions to the secret fort. Two steps left, three steps right, and cha chacha."; $hashed_message = mhash($hash_alg, $message); print "The hashed message is ". bin2hex($hashed_message); ?> 執行這一段腳本程序將得到下面的輸出結果: The hashed message is 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 在這裡使用bin2hex()函數的目的是方便我們理解$hashed_message 的輸出,這是因為混編的結果是二進制格式,為了能夠將它轉化為易於理解的格式,必須將它轉換為十六進制格式。 需要 注意的是,混編是單向弁遄A其結果不依賴輸入,因此可以公開顯示這一信息。這一策略通常用於讓用戶比較下載文件和系統管理員提供的文 件,以確保文件的完整性。 Mhash還有其他一些有用的函數。例如,我需要輸出一個Mhash支持的算法的名字,由於 Mhash支持的所有算法的名字都以MHASH_開頭,因此,可以通過執行如下的代碼完成這一任務: <?php $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()加密函數,還討論了用於數據加密的弁鈺j大的擴展庫══Mcrypt和Mhash。在這篇文章最後,我需要指出的是,一個真正 安全的PHP應用還應該包括安全的服務器,由於PHP是一種服務器端的技術,因此,在數據由客戶端向服務器端進行傳輸時,它不能保證數據的 安全。 .msgcontent .wsharing ul li { text-indent: 0; } 分享 Facebook Plurk YAHOO! .
全站熱搜
留言列表