PHP數(shù)據(jù)加密方式梳理介紹
前言
首先我們來(lái)了解一下為什么要加密?
在網(wǎng)絡(luò)通信的過(guò)程中攻擊者可以偽造請(qǐng)求和返回,從而達(dá)到不可告人的目的。如下圖所示:
數(shù)據(jù)加密之后可以防止他人監(jiān)聽(tīng)竊取信息以及通訊內(nèi)容被篡改。
了解了加密的作用,我再來(lái)說(shuō)說(shuō)加密的方式:
對(duì)稱加密DES
DES是1977年美國(guó)聯(lián)邦信息處理標(biāo)準(zhǔn)中采用的一種對(duì)稱密碼。是一種將64比特的明文加密成64比特的密文的對(duì)稱算法
DES已經(jīng)被暴力破解了,1999年RSA公司舉辦的破譯DES比賽,耗時(shí)僅僅22小時(shí)45分鐘破譯了DES。所以不建議大家使用這種算法進(jìn)行加密處理
對(duì)稱加密AES
AES是取代DES而成為新標(biāo)準(zhǔn)的一種對(duì)稱密碼算法。目前為止還未被破譯。
接下來(lái)我們用PHP來(lái)實(shí)踐一下對(duì)稱加密吧。
在使用PHP的AES加密需要使用openssl相關(guān)函數(shù),該系列函數(shù)需要安裝openssl擴(kuò)展。
//獲取可用的加密算法 $a = openssl_get_cipher_methods(); print_r($a) //AES加密解密 $data = 'wo shi aes jiami shuju';//待加密的數(shù)據(jù) $key = uniqid();//加密的密鑰 $method = 'AES-128-CBC';//加密的方式 $iv = '1234567812345678';//初始化向量,必須是16位字符 $a = openssl_encrypt($data,$method,$key,OPENSSL_RAW_DATA,$iv); //打印加密結(jié)果 print_r($a); //解密 $d = openssl_decrypt($a,$method,$key,OPENSSL_RAW_DATA,$iv); //解密后的數(shù)據(jù) print_r($d);
非對(duì)稱加密RSA
AES加密算法目前雖然沒(méi)有被破解,但是也有一個(gè)問(wèn)題,加密所使用的密鑰該怎么去配送呢?如果直接寫(xiě)死在前端就很容易被其他人獲取到(一次反編譯就可以獲取)。
此時(shí)就產(chǎn)生了RSA加密算法,不過(guò)RSA密碼算法也有缺點(diǎn),運(yùn)算次數(shù)多,不適合加密長(zhǎng)文本。
明文內(nèi)容最長(zhǎng)128字節(jié)
我們直接來(lái)看看PHP實(shí)現(xiàn)非對(duì)稱加密吧
//使用公鑰加密,私鑰解密 $public_key = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA14VJBWSyVOI4Q4aV+Cvl GX4Vb4wczPw0qQbGYAYzfuA7+RpO/X5DG7dFjdBMmb9cHvdWY8+uvKDVuHjbvCpm 3nSTgMbCLm/zDDTH8MUySSaxvm0tbdWm+L1Rinw5LZ+B1J9tHEXMwJZ2g5ZS4OZ0 4xlXx/4GWd9QBuV036er47J/cZ19WPgBDqQ4Mmm2X2na46NCeRenRBXLsaQhxvEe 5pX3WtguQtr+QrcekAmBoI1Xc0xhKDyXZ34rqZNvVCUNn11VzDcffanxlmTFFKDp QCZLVf8gtSdcxxQQrOfStgLoyYbN1e2Spb/szfQHtbSZ1qHg1frhCvjgOmZ6gDi+ OQIDAQAB -----END PUBLIC KEY-----";//公鑰 $private_key = "-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDXhUkFZLJU4jhD hpX4K+UZfhVvjBzM/DSpBsZgBjN+4Dv5Gk79fkMbt0WN0EyZv1we91Zjz668oNW4 eNu8KmbedJOAxsIub/MMNMfwxTJJJrG+bS1t1ab4vVGKfDktn4HUn20cRczAlnaD llLg5nTjGVfH/gZZ31AG5XTfp6vjsn9xnX1Y+AEOpDgyabZfadrjo0J5F6dEFcux pCHG8R7mlfda2C5C2v5Ctx6QCYGgjVdzTGEoPJdnfiupk29UJQ2fXVXMNx99qfGW ZMUUoOlAJktV/yC1J1zHFBCs59K2AujJhs3V7ZKlv+zN9Ae1tJnWoeDV+uEK+OA6 ZnqAOL45AgMBAAECggEAEdjMsjCjf9n31MepVZK09wZ02fbdT7A24CRaewsoaoJB FSCzl9RD1GC51sOABF9PTpUmxz8kdiRPbmY7s/pC6Hr41/odjGDi3IjmYa7CukIF CALcdzLxD7oFrZUZ2whRZP0KuQOir/QFvmHNXShYV5H6reoANqMCan/HzNmCp2ky pdtWd+YOFnvwP/m6Xw/mKWN2cFEEdME32Y9fnUq6gCpmgEQLZkEz0XQ53R9Yj6+O TpYhLzCgox5+HRL+PmE8G3XdVNOhbesmsTX4cS4s5/bWhw/iuZtlSGvNz867p0Ab jNiouWpoiLM9uHwGURndg+fslLKrBLU0fQeeXYplsQKBgQD3iEDX/Nzo19RZWz6T gf0r6S7tMtMWQr1InM8fuPxNXsT5QIuddNVp47UMs91F8K5bzGim7+0hM9SnBUsp /wKw9DRQuELziSdFGyfyo4lDiVvjqvMInph1yLfXaLdz9fxlT5+a8fUFJQqH65w2 SL+ice07mWt7ak/f1bfGKeAuVQKBgQDe5LFNtDKWLxMaO8lVTR0wWziTLImu+E3e svDIqZszyzqsLnZ4Qu6CXigrXQka8s1LRVF1kf4NQc65uutsFwitfOLitFa/h2wk 5K6Rqwl95QfkuYJpDvU4/IQ21O7HqRBt050QvBrNOfY8MCQUi3fisiP+mOkJS41Z iVRmQsfsVQKBgCjMinOPOBIg0N1RjsTdXg9IxfVOtUAsC+rV/cWqxdsyzaCPpPN0 +GAVqhfH5abLftGepXkufpVEZ76HvtXTNGxaM+1CEbb2WkSnrzPtBIjfMQgbeydm jJaNWM/mcKZqWwmP0CzHyKzqaAvzJ7JC12M9B+8U4IRdB4FLRpkg+dRpAoGAJkZz Q/qrrSqMRzb5DdLeLk2b23oMcqVlCdcEjhDB/BTsEGEyKtijiHOOxlOFmsETC9ft cxkM3U3tp+s3Pip+bPxDIdcCBoXExlkWuSD70kigIGDSyiOtbInAUoIiNtsLXTC3 igYjPBa1+AP0Tirc/WrFz5SGf/gfX767ZYwWNLkCgYBuHZrIWT0Feg5dJAkF7NMH 1Fes0Gn5sAQVvd9HVG4FAZxqJQa37M3GKD1m4ifBGtaDMgtWyVcMTdsr5hjpJB0G sEYlg3TDyd096Axr+I7KHDlIzboJjDWDwzwtqkTzgBRlxsClhqW/y/1y1o/QI9Rj CA7iK/XSPTdstVk5IPL/Aw== -----END PRIVATE KEY-----";//私鑰 $text ='我是待加密的內(nèi)容'; //公鑰加密,參數(shù)二$data為加密后的內(nèi)容 $res = openssl_public_encrypt($text,$encrypt,$public_key); if($res==false) echo '加密失敗'; //私鑰解密,參數(shù)一:待解密的數(shù)據(jù) //參數(shù)二:解密后的明文內(nèi)容 $res = openssl_private_decrypt($encrypt,$decrypt,$private_key); if($res==false) echo '解密失敗'; echo '解密后的明文數(shù)據(jù):'.$decrypt
上面的代碼就是PHP實(shí)現(xiàn)公鑰加密,私鑰解密的過(guò)程,我們?cè)賮?lái)看看PHP私鑰加密,公鑰解密吧
//使用公鑰加密,私鑰解密 $public_key = "公鑰"; $private_key = "私鑰"; $text = "我是待加密的內(nèi)容"; //公鑰加密,參數(shù)二$data為加密后的內(nèi)容 //參數(shù)三:私鑰 $res = openssl_private_encrypt($text,$encrypt,$private_key); if($res==false) echo '加密失敗'; //私鑰解密,參數(shù)一:待解密的數(shù)據(jù) //參數(shù)二:解密后的明文內(nèi)容 //參數(shù)三:公鑰 $res = openssl_public_decrypt($encrypt,$decrypt,$public_key ); if($res==false) echo '解密失敗'; echo '解密后的明文數(shù)據(jù):'.$decrypt
注意了,前端使用公鑰或者私鑰進(jìn)行加密時(shí),一般都會(huì)將加密內(nèi)容轉(zhuǎn)base64h后再傳到服務(wù)器進(jìn)行解密。服務(wù)器在接收到數(shù)據(jù)后應(yīng)該進(jìn)行base64解析后再進(jìn)行公鑰/私鑰進(jìn)行解密。后端返回給前端時(shí),也應(yīng)該將加密后的內(nèi)容轉(zhuǎn)base64格式,方便前端解析。
當(dāng)然也有一些開(kāi)發(fā)人員會(huì)使用urlencode進(jìn)行url編碼再傳輸給前后端,大家可以根據(jù)實(shí)際需要進(jìn)行轉(zhuǎn)碼
到此這篇關(guān)于PHP數(shù)據(jù)加密方式梳理介紹的文章就介紹到這了,更多相關(guān)PHP數(shù)據(jù)加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于PHP中協(xié)程和阻塞的一些理解與思考
這篇文章主要給大家介紹了關(guān)于PHP中協(xié)程和阻塞的一些理解與思考,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PHP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08PHP+jQuery實(shí)現(xiàn)即點(diǎn)即改功能示例
這篇文章主要介紹了PHP+jQuery實(shí)現(xiàn)即點(diǎn)即改功能,涉及php數(shù)組讀取、遍歷及jQuery事件響應(yīng)與動(dòng)態(tài)修改頁(yè)面元素屬性相關(guān)操作技巧,需要的朋友可以參考下2019-02-02PHP版國(guó)家代碼、縮寫(xiě)查詢函數(shù)代碼
PHP版國(guó)家代碼、縮寫(xiě)查詢函數(shù)代碼,需要的朋友可以參考下。2011-08-08PHP中實(shí)現(xiàn)Bloom Filter算法
這篇文章主要介紹了PHP中實(shí)現(xiàn)Bloom Filter算法,本文直接給出實(shí)現(xiàn)代碼,代碼中給出詳細(xì)注釋,Bloom Filter算法介紹等內(nèi)容,需要的朋友可以參考下2015-03-03PHP實(shí)現(xiàn)定時(shí)生成HTML網(wǎng)站首頁(yè)實(shí)例代碼
做靜態(tài)頁(yè)面的時(shí)候增加這個(gè)功能非常不錯(cuò),大家看下實(shí)現(xiàn)代碼2008-11-11