搜尋
首頁後端開發php教程PHP安全編程之加密功能_PHP教程

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

Jul 21, 2016 pm 04:09 PM
php功能加密地位安全我們數據生活程式設計網路重要


資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量交易和傳輸的大量資料。如果對於採用安全措施有興趣的話,也一定會有興趣了解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 102/td> CRYPT_BLOWFISH 16-character beginning with 102/td> 用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。注意每個口令的前二個字母,這是因為我使用了下面的代碼,根據口令的前二個字母創建幹擾串的: .
= substr(, 0, 2);
= crypt(, );
// 然後就和使用者名稱一起儲存在MySQL中 我將使用Apache的口令-應答認證配置提示用戶輸入用戶名和口令,一個鮮為人知的有關PHP的信息是,它可以把Apache的口令-應答系統輸入的用戶名和口令識別為和,我將在身份驗證腳本中用到這二個變數。花一些時間仔細閱讀下面的腳本,多注意其中的解釋,以便更好地理解下面的程式碼: crypt()和Apache的口令-應答驗證系統的應用
= "localhost";
= "zorro";
= "hellodolly";
= "users";

// Set authorization to False

= 0;

// Verify that user has entered username and password

if (isset() && isset()) :
, , ) 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 FROMk. W 🎜>username = '' AND
password = ''";

// Execute the query

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

endif;

// confirm authorization

if (! ) :

header('WWWic-Authenticetic 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()混編字串 = "This is some message that I just wrote";
= md5();
print "hash: ";
?> 結果:hash: 81ea092649ca32b5ba375e81d8f4972c 注意,結果的長度為32個字元。再來看一下下面的表,其中的值有了一點微小的變化: 使用md5()對一個稍微變化的字串進行混編 //注意,message中少了一個s
= "This is some mesage that I just wrote";
= md5();
print "hash2:

";
?> 結果: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對資料進行加、解密
// Designate string to be encrypted
= "Applied Cryptography, by Bruce Schneier, is
a wonderful cryptography reference.";
key
key = "Four score and twenty years ago";

// Encryption Algorithm
= MCRYPT_RIJNDAEL_128;

/// Create the initiEL_128;

/// Create the initiatation v. = mcrypt_create_iv(mcrypt_get_iv_size(,
MCRYPT_MODE_ECB), MCRYPT_RAND);

// Output original string
print "Original string

; >= mcrypt_encrypt(, key,
, MCRYPT_MODE_CBC, );

// Convert to hexadecimal and output to browser
print "Encrypted string: ".bin2

= mcrypt_decrypt(, key,
, MCRYPT_MODE_CBC, );

print "Decrypted string: ";

?>> 執行上面的腳本將會產生下面的輸出: Original string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference. Encrypted string: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d954120e71ecf525f29df58e28f3d954157 8c11742f5cfa1d23fe22fe8 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 ./configure -with-mhash=[dir] [--other-configuration-directives] make make install 像Mcrypt一樣,根據PHP在互聯網伺服器軟體上的安裝方式,可能需要對Mhash進行其他的設定。 對於Windows使用者而言,http://www.php4win.de中有一個很好的包括Mhash擴充庫在內的PHP軟體包。只要下載並進行解壓縮,然後根據其中的readme.first文件中的指示進行安裝即可。 使用Mhash 將資訊混編非常簡單,看一下下面的例子: = MHASH_TIGER;
= "These are the directions to the secret fort. Two steps left, three steps right, and cha chacha.";
= mhash(, );
print
print
print
print
print

print

print

printprintprintprintprintprint?> 執行這段腳本程式將會得到下面的輸出結果:The hashed message is 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461      在這裡使用bin2hex()函數的目的是方便我們理解的輸出,這是因為混編的結果是二進位格式,為了能夠將它轉換為易於理解的格式,必須將它轉換為十六進位格式。 需要注意的是,混編是單向功能,其結果不依賴輸入,因此可以公開顯示此資訊。此策略通常用於讓使用者比較下載文件和系統管理員提供的文件,以確保文件的完整性。      Mhash還有其他一些有用的函數。例如,我需要輸出一個Mhash支援的演算法的名字,由於Mhash支援的所有演算法的名字都以MHASH_開頭,因此,可以透過執行如下的程式碼完成這項任務: = MHASH_TIGER;print "This data has been hashed with the".mhash_get_hash_name()."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是一種伺服器端的技術,因此,當資料由客戶端向伺服器端進行傳輸時,它不能保證資料的安全。責任編輯:小李
http://www.bkjia.com/PHPjc/314395.html
www.bkjia.com
truehttp: //www.bkjia.com/PHPjc/314395.htmlTechArticle資料加密在我們生活中的地位已經越來越重要了,尤其是考慮到在網路上發生的大量交易和傳輸的大量數據。如果對於採用安全措施有興趣...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),