php加密解密詳解

來源:互聯網
上載者:User
不知道大家對於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,'passG506',$_SESSION['iv']); //解密 我愛北京天安門 /我愛祖國

注: 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('AES-256-CBC'); // 16echo openssl_cipher_iv_length('BC-CBC'); // 8echo openssl_cipher_iv_length('AES-128-ECB'); // 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非對稱式加密

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.