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歡迎您

參考加密文檔?php.net

參考解密文檔??php.net

注: 此方法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/ayKQCJvRLmvhs5ec8
echo "<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非對稱加密

?

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

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

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

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282582.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282582.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Spring Boot數據源與連接池原理

? Create by ysterfoxmail.com 2018-8-2一&#xff1a;開始 在使用Spring Boot數據源之前&#xff0c;我們一般會導入相關依賴。其中數據源核心依賴就是spring‐boot‐starter‐jdbc 如下 <dependency><groupId>org.springframework.boot</groupId> …

Dapr 集成 Open Policy Agent 實現 接口的訪問控制

大型項目中基本都包含有復雜的訪問控制策略&#xff0c;特別是在一些多租戶場景中&#xff0c;例如Kubernetes中就支持RBAC&#xff0c;ABAC等多種授權類型。Dapr 的 中間件 Open Policy Agent 將Rego/OPA策略應用到傳入的Dapr HTTP請求中。Open Policy AgentOpen Policy Agent…

【Java】BigDecimal

一、前言 在使用Java&#xff0c;double 進行運算時&#xff0c;經常出現精度丟失的問題&#xff0c;總是在一個正確的結果左右偏0.0000**1。 特別在實際項目中&#xff0c;通過一個公式校驗該值是否大于0&#xff0c;如果大于0我們會做一件事情&#xff0c;小于0我們又處理其他…

PHP獲取當前頁面URL

//獲取頁面url function curPageURL() {$pageURL http;if (!empty($_SERVER[HTTPS])) {$pageURL . "s";}$pageURL . "://";if ($_SERVER["SERVER_PORT"] ! "80") {$pageURL . $_SERVER["SERVER_NAME"].":".$_SER…

【招聘(大連)】北森云計算 .NET 專場招聘

為了更好的實現戰略布局&#xff0c;逐步形成以三個產品研發中心&#xff08;北京、成都、大連&#xff09;為主&#xff0c;青島和南京為輔的產品研發團隊配置。北森云第三研發中心&#xff08;大連&#xff09;正式成立&#xff0c;目前大連的人選招聘正式開啟&#xff0c;歡…

PHP強制下載文件

//有時我們不想讓瀏覽器直接打開文件&#xff0c;如PDF文件&#xff0c;而是要直接下載文件&#xff0c;那么以下函數可以強制下載文件 //函數中使用了application/octet-stream頭類型。 function downloads($filename,$dir./) {$filepath $dir.$filename;if (!file_exists($f…

F5基于證書認證的客戶端登錄

1.生成密鑰RSA類型&#xff0c;密碼&#xff1a;123456保存為Openssl格式2.上傳客戶機SecureCRT生成的公鑰 Identity.pub到用戶home目錄下.ssh文件夾中cd .sshmv Identity.pub authorized_keys ##cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys3.更改F5 ssh配置文件tmsh…

C#多線程編程-必知必會

“發現問題的能力&#xff0c;運用技術解決問題的能力&#xff0c;是一個技術人成長的關鍵”圖片故事&#xff1a;洋姜的花&#xff0c;拍攝于2022年7月23日&#xff0c;地點&#xff1a;北京奧林匹克森林公園 &#xff0c;攝影師&#xff1a;劉先生概要&#xff1a;使用C#發起…

理解Go Interface

理解Go Interface1 概述Go語言中的接口很特別&#xff0c;而且提供了難以置信的一系列靈活性和抽象性。接口是一個自定義類型&#xff0c;它是一組方法的集合&#xff0c;要有方法為接口類型就被認為是該接口。從定義上來看&#xff0c;接口有兩個特點:接口本質是一種自定義類型…

『中級篇』Dockerfile詳解(17)

一般的&#xff0c;Dockerfile 分為四部分&#xff1a;基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 ####官網學習 https://docs.docker.com/engine/reference/builder/#usage ####FROM 必須為第一個命令&#xff0c;指定基礎鏡像 FROM <image> FROM &…

洛谷 1165日志分析

題目描述 M 海運公司最近要對旗下倉庫的貨物進出情況進行統計。目前他們所擁有的唯一記錄就是一個記錄集裝箱進出情況的日志。該日志記錄了兩類操作&#xff1a;第一類操作為集裝箱入庫操作&#xff0c;以及該次入庫的集裝箱重量&#xff1b;第二類操作為集裝箱的出庫操作。這些…

KestrelServer詳解[1]:注冊監聽終結點(Endpoint)

具有跨平臺能力的KestrelServer是最重要的服務器類型。針對KestrelServer的設置均體現在KestrelServerOptions配置選項上&#xff0c;注冊的終結點是它承載的最重要的配置選項。這里所謂的終結點&#xff08;Endpoint&#xff09;與“路由”介紹的終結點不是一回事&#xff0c;…

php截取字符串,帶中文,多余的省略號代替

function subtext($text, $length) {if(mb_strlen($text, utf8) > $length) {return mb_substr($text, 0, $length, utf8)....;} else {return $text;}}$str 我們是family happy family; echo subtext($str,5); //我們是fa...

數據庫添加

<body><form action"herozhuce.php" method"post"> <div>賬號<input type"text" name"account"/></div> <div>密碼<input type"text" name"password"/></div> &…

快來加入阿里云大學【云學院】班級助理招募—機會稍縱即逝,錯過遙遙無期!...

2019獨角獸企業重金招聘Python工程師標準>>> 如果你對云計算、大數據、云安全、人工智能領域感興趣~ 如果你想從事與此相關的工作~~ 如果你又喜歡邊交流邊學習的方式~ 那么&#xff0c;加入我們吧&#xff01; 我們將為你提供一個廣闊的平臺&#xff0c;讓你接觸到云…

深入理解ajax系列第五篇——進度事件

前面的話 一般地&#xff0c;使用readystatechange事件探測HTTP請求的完成。XHR2規范草案定義了進度事件Progress Events規范&#xff0c;XMLHttpRequest對象在請求的不同階段觸發不同類型的事件&#xff0c;所以它不再需要檢査readyState屬性。這個草案定義了與客戶端服務器通…

對象(poco)深度克隆

提供深度克隆對象功能,基于編譯表達式實現&#xff0c;性能與原生代碼幾無差別&#xff0c;遠超 json/binary 序列化實現。1. 簡單示例class Person {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public DateTime Birth { get; s…

php將數字轉化為中文大寫人民幣格式

<?phpfunction cny($ns) {static $cnums array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖"),$cnyunits array("圓","角","分&…

BZOJ1787 [Ahoi2008]Meet 緊急集合 LCA

歡迎訪問~原文出處——博客園-zhouzhendong 去博客園看該題解 題目傳送門 - BZOJ1787 題意概括 有一棵節點為n個(n≤500000)的樹。接下來m次詢問(m≤500000)&#xff0c;每次給出3個點 a,b,c &#xff0c;現在讓你求一個點 p &#xff0c;使得 dis(p,a) dis(p,b) dis(p,c) 最…

Linux之ACL權限控制

ACL權限控制主要目的是提供傳統的owner,group,other的read,wirte,execute權限之外的具體權限設置&#xff0c;可以針對單一用戶或組來設置特定的權限 設置ACL權限&#xff1a;setfacl查看ACL權限&#xff1a;getfacl 比如&#xff1a;某一目錄權限為 drwx------ 2 root root 40…