您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在PHP中使用對稱加密函數對數據進行加密解密,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
一、對稱加密
發送方將明文使用密鑰和算法處理成密文發送出去,接收方使用密鑰和算法將密文處理成明文,發收信雙方使用同一個密鑰對數據進行加密和解密。
因為使用同一個密鑰加密、解密,所以安全性上不僅與算法有關,密鑰的安全也很重要。
當然并不是密鑰越復雜越好,相反密鑰通常比較小的,因為雖然密鑰越大,加密越強,但加密與解密的過程越慢,所以密鑰的大小既要照顧到安全性,也要照顧到效率。
畢竟對稱加密算法的特點是算法公開、計算量小、加密速度快、加密效率高,沒了效率高這一優勢,還不如直接用非對稱加密。
此外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的惟一鑰匙,這會使得發收信雙方所擁有的鑰匙數量呈幾何級數增長,密鑰管理成為用戶的負擔。
對稱加密算法在分布式網絡系統上使用較為困難,主要是因為密鑰管理困難,使用成本較高。
二、非對稱加密
非對稱加密相對來說,就安全很多了,它使用了一對密鑰,公開密鑰和私有密鑰,分別用來進行加密和解密。私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。
最常見的非對稱加密,應該就是銀行系統,支付平臺了。比如我們申請支付寶或者銀聯支付的接口時,會得到一個公鑰,商城中進行支付是,用公鑰將信息加密提交給平臺,平臺使用密鑰對你的信息解密,進行支付操作等。
雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們一般處理的話,大部分是用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去,回想一下你申請到的支付接口,是不是給了你一對密鑰呢?^.^
三、結合使用
對稱性加密速度快,發送大量數據時用比較好。非對稱加密加密和解密花費時間長、速度慢,只適合對少量數據進行加密,但是,非對稱加密的安全性是極高的。
揚長避短:將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然后發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然后雙方可以使用對稱加密來進行溝通。
項目中使用的方法不宜透露,只在這里列出兩個其他的例子吧。第一個是ucenter中的,第二個是簡明魔法中看到的。
需要注意的是,由于是base64算法,加密后的字符串有可能會出現 + \ ,如果是用在url中,是不友好的,可以在外部或改下方法,正則驗證遞歸調取下。
/** * 字符串加密以及解密函數 * @param string $string 原文或者密文 * @param string $operation 操作(ENCODE | DECODE), 默認為 DECODE * @param string $key 密鑰 * @param int $expiry 密文有效期, 加密時候有效, 單位 秒,0 為永久有效 * @return string 處理后的 原文或者 經過 base64_encode 處理后的密文 */ function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 0) { $ckey_length = 4; $key = md5($key); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16, 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), - $ckey_length)) : ''; $cryptkey = $keya . md5($keya . $keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode( substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); for ($i = 0; $i <= 255; $i ++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for ($j = $i = 0; $i < 256; $i ++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for ($a = $j = $i = 0; $i < $string_length; $i ++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if ($operation == 'DECODE') { if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { return $keyc . str_replace('=', '', base64_encode($result)); } }
/********************************************************************* 函數名稱:encrypt 函數作用:加密解密字符串 使用方法: 加密 :encrypt('str','E','nowamagic'); 解密 :encrypt('被加密過的字符串','D','nowamagic'); 參數說明: $string :需要加密解密的字符串 $operation:判斷是加密還是解密:E:加密 D:解密 $key :加密的鑰匙(密匙); *********************************************************************/ function encrypt($string,$operation,$key='') { $key=md5($key); $key_length=strlen($key); $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; $string_length=strlen($string); $rndkey=$box=array(); $result=''; for($i=0;$i<=255;$i++) { $rndkey[$i]=ord($key[$i%$key_length]); $box[$i]=$i; } for($j=$i=0;$i<256;$i++) { $j=($j+$box[$i]+$rndkey[$i])%256; $tmp=$box[$i]; $box[$i]=$box[$j]; $box[$j]=$tmp; } for($a=$j=$i=0;$i<$string_length;$i++) { $a=($a+1)%256; $j=($j+$box[$a])%256; $tmp=$box[$a]; $box[$a]=$box[$j]; $box[$j]=$tmp; $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); } if($operation=='D') { if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)) { return substr($result,8); } else { return''; } } else { return str_replace('=','',base64_encode($result)); } }
看完上述內容,你們對怎么在PHP中使用對稱加密函數對數據進行加密解密有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。