1. 程式人生 > >php加密解密詳解

php加密解密詳解

不知道大家對於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'); // 16

echo openssl_cipher_iv_length('BC-CBC'); // 8

echo 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非對稱加密

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

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

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

相關推薦:

相關推薦

php加密解密

不知道大家對於php加密解密有多少了解,本文主要和大家分享php加密解密相關知識,希望能幫助到大家。 一 對稱加密 1.mycyrpt的對稱加密: /** * @param $key  //資料加密金鑰 由自己定義,長度有限制 string

AES加密解密

一)什麼是AES? 高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),是一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 那麼為什麼原來的DES會被取代呢,,原因就在於其使用56位

Cocos2d-x資料加密解密

C++的Base64演算法實現/* * base64.cpp * * Created on: 30/04/2011 * Author: nicholas */ #include "base64.h" #include <cctype> //

RSA加密解密

package cn.com.mink.util; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; im

MySQL 加密解密

MySQL 資料庫內部有多種 加密函式 解密函式被加密的欄位的型別需要是 VARBINARY、BLOB 型別 儲存AES_ENCRYPT(str,key) : 返回用金鑰key對字串str利用高階加密標準演算法加密後的結果,呼叫AES_ENCRYPT的結果是一個二進位制字串A

DES 加密解密 CCCrypt函式

世界最美好的樣子,便是有你的日子   一, 接觸到加解密後,總結了一下AES, DES,3DES 加解密,其中 包含 <CommonCrypto/CommonCrypto.h>裡的api 1, 主要注意 buffer 的記憶體大小。和 加解密結果的狀態, 重點是

php openssl_sign() 語法+RSA公私鑰加密解密,非對稱加密演算法

其實有時候覺得寫部落格好煩,就個函式就開篇部落格。很小的意見事情而已,知道的人看來多取一舉,或者說沒什麼必要,浪費時間,不知道的人就會很鬱悶。技術就是這樣的,懂的人覺得真的很簡單啊,不知道的人真的好難。。。 一般在跟第三方介面對接資料的時候,為了保證很多都使用的RSA簽名,沒性趣瞭解的同學只需要

PHP 基礎篇 - PHP 中 DES 加解密

tor 數據加密 解密 ans eat mark encrypted hex 基礎 一、簡介 DES 是對稱性加密裏面常見一種,全稱為 Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法。密鑰長度是64位(bit),超過位數密鑰被忽

PHP 遷移 Mcrypt 至 OpenSSL 加密演算法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

PHP RSA加解密(附代碼)

獲取 null 網上銀行 get 傳輸 賬戶 linu 數字簽名 mir 前言:RSA加密一般用在涉及到重要數據時所使用的加密算法,比如用戶的賬戶密碼傳輸,訂單的相關數據傳輸等。 加密方式說明:公鑰加密,私鑰解密。也可以 私鑰加密,公鑰解密 一、RSA簡介 R

PHP系列】PHP組件

命令行 分享 .cn .com function package etc quest 說我 緣起 楓爺之前做過幾年的PHP的研發,大部分都是在開源框架的引導下,編寫代碼。現在依然,本能的會去讓我使用某個PHP框架開發PHP應用,也是因為懶吧,沒有好好的去研究研究除了框架之外

PHP面試題

今天 服務 等待 速度 用途 har pda 說明 lose 自己從網上找了幾份常考到的PHP面試題進行了整理,然後才有了這份PHP面試題,並且我把所有的題目進行了詳細分析和代碼分析,希望可以對大家有幫助,謝謝大家。 這份試題我也上傳到了百度雲,有需要的可以直接去百度雲下載

PHP加密解密數字

sub 得到 ssm clas fyi 3.5 url bstr reac 1 <?php 2 /** 3 * 加密解密類,PHP加密解密數字,適用於URL加密 4 * 該算法僅支持加密數字。比較適用於數據庫中id字段的加密解密,以及根據數字顯示

PHP函數:call_user_func()使用方法

func instead 實例 div style bsp color can this call_user_func函數類似於一種特別的調用函數的方法,使用方法如下: <?php function nowamagic($a,$b) { echo

php引用 &

class www. style 輸出 ret 建立 內存空間 spa 之間 在PHP 中引用的意思是:不同的名字訪問同一個變量內容. 與C語言中的指針是有差別的.C語言中的指針裏面存儲的是變量的內容在內存中存放的地址 變量的引用 $a = 222; $b = &

PHP基礎入門(一)【世界上最好用的編程語言】

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

PHP 基礎篇 - PHP 錯誤級別

ice 詳細介紹 arch fatal star use tom int error 一、前言 最近經常看到工作 2 年左右的童鞋寫的代碼也會出現以靜態方法的形式調用非靜態方法,這是個 Deprecated 級別的語法錯誤,代碼裏不應該出現的。對方很郁悶,說:為什麽我的環境

LAMP(php動態擴展模塊,httpd的rewrite,php錯誤日誌,php.ini配置

php動態擴展模塊 httpd的rewrite php錯誤日誌 php.ini配置詳解 一、php動態擴展模塊比如我們需要用到php一個模塊,恰好他沒有這個模塊。我們需要編一個.so出來?/usr/local/php/bin/php -m //查看模塊 ? 下面安裝一個redis的模塊 ? c

JAVA實現DES加密實現

ava util des算法 直接 print uri ret secure 過程 package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import j

php.ini 配置

擴展 不同數據庫 style 站點 狀態碼 查詢 cor ip地址 的人 這個文件必須命名為‘‘php.ini‘‘並放置在httpd.conf中的PHPIniDir指令指定的目錄中。最新版本的php.ini可以在下面兩個位置查看:http://cvs.php.net/vie