首頁 > 後端開發 > php教程 > php加密解密詳解

php加密解密詳解

小云云
發布: 2023-03-20 13:02:02
原創
6601 人瀏覽過

不知道大家對於php加密解密有多少了解,這篇文章主要跟大家分享php加密解密相關知識,希望能幫助大家。

一對稱加密

1.mycyrpt的對稱加密:

/** 
* @param $key  //数据加密密钥 由自己定义,长度有限制 string 
* @param $string  //需要进行加解密的字符串 string 
* @param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密) 
* @return string */
function encryptDecrypt($key, $string, $decrypt)
{   
 if(!$decrypt){        
 //加密        
 $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));        
 return $encrypted;    
 }else{       
 //解密        
 $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");        
 return $decrypted;    
 }

}//使用方法:echo encryptDecrypt('passwordgg', 'Hello欢迎您',0);  
//加密  
ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1);  
//解密  
Hello欢迎您
登入後複製

註: 此方法php7.1開始已經被廢棄,開始採用openssl_encrypt和openssl_decrypt ,官方推薦使用openssl一族進行加解密

2.OpenSSL 擴充中的對稱加密

/** 
* @param string $data 需要加解密的数据字符串 string
* @param int $yes 加密还是解密(1表示加密,0表示解密) 
* @param string $key 数据加密密钥 
* @param string $iv 初始化向量 //注:这里为了显示效果,暂时将iv存储到session中, 
* @param string $iv 实际应用中,应该将iv和加密后的字符串都存储在数据库 
* @param string $encryptMethod  
数据加密方式 100余种,可通过openssl_get_cipher_methods()函数获取, 
* @param string $encryptMethod  选择其中一种(如果选择cbc结尾的加密算法,
需要初始化向量iv,如本例) 
* @return string 
*/
function openssl_crypt($data='',$yes=1,$key='secret',$iv='',$encryptMethod='aes-256-cbc'){    
if($yes)
{        
$ivLength = openssl_cipher_iv_length($encryptMethod); //获取该加密算法iv应该具有的长度        
$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)       
 if (false === $iv && false === $isStrong) 
 {            
 die('IV generate failed');        
 }        
//加密        
$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);        
$_SESSION['iv']=$iv; //将iv存到session中        
return $encrypted;    
}else{       
 //解密        
 $decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);        
 return $decrypted;    
 }
}//使用方法
echo $a=openssl_crypt('我爱北京天安门 /我爱祖国',1,'passG506'); //加密 
LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8echo "<br>";
echo openssl_crypt($a,0,&#39;passG506&#39;,$_SESSION[&#39;iv&#39;]); //解密 我爱北京天安门 /我爱祖国
登入後複製

註: 1. 為什麼要產生iv,iv的作用是什麼

回顧openssl_get_cipher_methods() 傳回的加密演算法列表,有很多名字中間有「CBC」 字樣,這些加密演算法使用了同一種加密模式,也就是密碼分組連結模式(Cipher Block Chaining)。

在 CBC 模式的加密演算法中,明文會被分成若干個群組,以群組為單位加密。每個組的加密過程,依賴他前一個組的資料:需要跟前一組的資料進行異或操作後生成本組的密文。那麼最開頭的那一組又要依賴誰呢?依賴的就是 IV,所以這就是為什麼 IV 要叫初始化向量。 IV 是 初始化向量(initialization vector)的縮寫

IV 應該是隨機產生的,所以程式碼用到了 openssl_random_pseudo_bytes() 產生 IV。此函數接收一個 int,代表需要產生的 IV 的長度。
IV 長度隨加密演算法不同而不同。一般人是記不住那麼多演算法需要的 IV 長度的。所以直接使用openssl_cipher_iv_length() 函數,這個函數回傳一個int,表示加密演算法需要的IV 長度:

echo openssl_cipher_iv_length(&#39;AES-256-CBC&#39;); // 16
echo openssl_cipher_iv_length(&#39;BC-CBC&#39;); // 8
echo openssl_cipher_iv_length(&#39;AES-128-ECB&#39;); // 0
登入後複製

例如AES-256-CBC 需要16位元的IV、 BC-CBC 需要8 位元的IV、而AES-128-ECB 不需要IV,所以回傳了0。

2. 在使用過程中需要注意的問題

在進行加解密時,兩個函數除了第一個參數不同,其餘參數都要保證相同才能順利解密。最後,在使用需要IV 的加密演算法時,需要注意:
必須傳$iv 參數,不傳的話PHP將會拋出一個Warning
IV 應該是隨機產生的(例如用openssl_random_pseudo_bytes() ),不能人為設定
每次加密都應該重新產生一次IV ,不可偷懶多次加密採用相同IV
IV 要隨著密文一起保存(不然就沒法解密啦),可以直接附在密文串後面,也可以分開保存

如果看不懂,可以參考對稱加密

二非對稱加密

常用的非對稱加密有RSA演算法,非對稱加密和解密使用的是不同的金鑰,其中一個對外公開作為公鑰,另一個只有私有者擁有,作為私鑰。

用私鑰加密的資訊只有公鑰才能解開,或是反之用公鑰加密的資訊只有私鑰才能解開。

在RSA加解密之前,需要先生成一對公私鑰,可使用Linux自帶的RSA金鑰產生工具openssl取得一對公私鑰,也可以使用PHP openssl擴充函式產生一對公私鑰。

可參考:RSA非對稱加密

附註:非對稱加密的缺點是機密和解密花費時間長,速度慢,只適合對少量資料進行加密。

如果既想有很快的加密速度,又想確保資料比對稱加密更安全,可以使用混合加密。 (即 將資料對稱加密,對金鑰做非對稱加密)

解密的時候,先用非對稱加密得到金鑰,再用金鑰解開密文得到明文。

相關推薦:

PHP如何使用自訂key實作對資料加密解密的方法

mysql關於加密解密的函數

php字串加密解密實作過程分享

#

以上是php加密解密詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板