十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要介紹PHP如何數(shù)據(jù)加密,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括朗縣網(wǎng)站建設(shè)、朗縣網(wǎng)站制作、朗縣網(wǎng)頁制作以及朗縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,朗縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到朗縣省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
環(huán)境 Apache PHP-7.0.12
加密解決了什么問題:
1.防止通信內(nèi)容被竊聽;
2.防止通信內(nèi)容被篡改
加密類型:
1.對(duì)稱加密:加密與解密使用的是同一個(gè)秘鑰,例:DES(Data Encryption Standard),1977-1999年,1999年被破解;AES(Advance Encryption Standard),目前最流行的對(duì)稱加密算法
2.非對(duì)稱加密:RSA
AES 加密 / 解密
1.使用PHP加密/解密函數(shù) openssl_encrypt/openssl_decrypt
注意:有很多例子使用的是PHP mcrypt_encrypt() 函數(shù),官網(wǎng)給我的解釋:This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.
//獲取可用的密碼加密算法列表 //$methods = openssl_get_cipher_methods(); //var_dump($methods); # AES加密演示 //明文(要加密的內(nèi)容) $str = "這是測(cè)試用例 我是明文"; //秘鑰(用例:使用uniqid()函數(shù)生成了一個(gè)唯一ID) $key = "5d3fb4acb2292"; //加密算法 $method = "AES-128-CBC"; //加密向量(要求18個(gè)字節(jié)) $iv = "1234567812345678"; $encrypt_str = openssl_encrypt($str, $method, $key, 0, $iv); var_dump("AES加密結(jié)果:".$encrypt_str); # AES解密演示 //$encrypt_str AES加密后產(chǎn)生的密文 //$key 秘鑰(同上) $decrypt_str = openssl_decrypt($encrypt_str, $method, $key, 0, $iv); var_dump("AES解密結(jié)果:".$decrypt_str);
RSA 加密
1.公/私鑰加密算法,屬于非對(duì)稱加密:
2.優(yōu)點(diǎn):極難被破解;
3.缺點(diǎn):速度慢,運(yùn)算次數(shù)多,不適合加密長文本;
//公鑰(項(xiàng)目中可在線生產(chǎn)亦可自己生成) $PUBLIC_KEY = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApJJ7D/U9lHLNQdl4LZSr jNvdCelIraMnSD/iujWxyw/QDLXPCtP06ll42JURGlYaO2DU5c5BKEUF0alyzlE9 XiHRXPl0LabI/CjGtrIB4RApy1PjkQ31QOt+9R2Nmb7RUkfZwnCWHBlNVnwj4U6J woccrlUdElBWU5twFc2PNPbMR6nA/ldUwDpcveNHNp57BrgYfUFcLrjmf2LH6c7X ngBNPbG5ha5pmsaXm8MAqBRtAvIwvUsvJLIr+XRc27pCJFe/1MtS4hHhTPE4un/z Y/tIrpqm6MimdJcs8oqEQPoztfs5BTNu2jVgrKwtWExDXODWmHemQoaCwzgt3wMy 3wIDAQAB -----END PUBLIC KEY-----"; //私鑰(項(xiàng)目中可在線生產(chǎn)亦可自己生成) $PRIVATE_KEY = "-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCkknsP9T2Ucs1B 2XgtlKuM290J6UitoydIP+K6NbHLD9AMtc8K0/TqWXjYlREaVho7YNTlzkEoRQXR qXLOUT1eIdFc+XQtpsj8KMa2sgHhECnLU+ORDfVA6371HY2ZvtFSR9nCcJYcGU1W fCPhTonChxyuVR0SUFZTm3AVzY809sxHqcD+V1TAOly940c2nnsGuBh9QVwuuOZ/ YsfpzteeAE09sbmFrmmaxpebwwCoFG0C8jC9Sy8ksiv5dFzbukIkV7/Uy1LiEeFM 8Ti6f/Nj+0iumqboyKZ0lyzyioRA+jO1+zkFM27aNWCsrC1YTENc4NaYd6ZChoLD OC3fAzLfAgMBAAECggEAUcCieW7uREwzQr7xQFNWVQbzavUEMZ2W6gEydCYwSBt2 0pmOXGamh7QioBSNBnQ3W7/igrZPD94Z4ek3Kt6YiaZrBrC00ejEdt8at6791/vb hzIJHgm9B5701nbz3Kg5+5HNzxV2vEalcI0Cle4Z6RSNXtzRMEPQXoAc0ffnZ/tV 033zAN4nWb9zeLw03/D0nbcpaYA/WbwqsNiTxbbi0s54oTsaOTMBBAK9oH9H2M5J 506iINcKniyMi6i0cf/cQ+tP6VUCOMHdWm/zJmQ5s2eU/2SowSKMXMLIGUH2Q4AX Z2htX4YwvdHGlGA5yPuiMznkFidVcERfbVl9yi54YQKBgQDQYqj2bb0bvD8YuvXx htdBQrxiX53pZ1sVoh6SMxD+Lq6tpn4UtOJw6tpE7tgONmWRaKCH10fgX5nQoXPJ 0Y02qiDyk/TkE0OGiYRTjjkjY3yPkBIz9KRCoIUcwirEfWdzmjFLTq9hiaGo9JXN HcLXOgpAbiQe+qXf9x/waWB/hQKBgQDKLQB9Ep9A6UFlumXaEr971A7HcQI2BsfP kRfCcT1rphnENHCa37o+5i6tTImAXI+aayp9Jpv0rXLbzFbBkdUdUDINulXSsLRT bq3ttbu5c+NG21XW1fvVqf4VYOP7u/l0Z2eBIsg9uLswS3zltTG8ikm+RKhMf1DV PDAOoLmMEwKBgDn0po9a9/Rlx5qmLM7OtMFGwUQO2clXYILEwvATmc9HxncvTfOO V0gWWTxAvUA+qsLlOXhuTGQ/0nSu4pgnusGQUXeF5N8l6Grbhj0C2itYeQUoiZd/ m8uX/01/Rwu84O/K25jZOnfDIn3uAFe6xjy7vKwstckT5txCS9S+SgNNAoGAbvLl Sr32cUvQXMA+9r7FIHJOLfsBaJ6t9mW8cTNtrm63wym4BfXzImN1iBrxdmTVVbur 1IRkn5Cz8JUhoxahqnWBEnGIeZgJTaP2hPXvcCV9uzvQzpYdnrKsQhUq59HPYqcA cSiiVOTUrPswLmsSQVJuh7Dr7xcLSAnAobZoPMsCgYEAsJuY5RcB1sjYortRNsKb KHLiLI93P0MFF46V/343d3BU7TZfETg703Mj2AfOAGTM2p2BkHFri3l+4oigMqpr hAp4hNq4KFK2SCjzedrLV7QIgtp/uMZ+q/yhRtiG8kSWlI9c0Un00+KqIwFqfwAB l1zOX5QcMa1X7eWSvZ559ko= -----END PRIVATE KEY-----"; //待加密明文 $data = "這是RSA待加密明文"; //用于接收加密后的密文 $content_encrypt = ""; # 私鑰加密 openssl_private_encrypt($data, $content_encrypt, $PRIVATE_KEY, 1); var_dump("私鑰加密結(jié)果:".$content_encrypt); # 公鑰解密 //$content_encrypt 私鑰加密后的密文 //用于接收解密后的明文 $content_decrypt = ""; openssl_public_decrypt($content_encrypt, $content_decrypt, $PUBLIC_KEY, 1); var_dump("公鑰解密結(jié)果:".$content_decrypt);
項(xiàng)目中 API 交互方式之 ---- 簽名 / 驗(yàn)簽
1. 新建 text.php 文件 ------ 生成簽名
//根軍 MD5()函數(shù)的不可逆性進(jìn)行簽名校驗(yàn) //首先必須要有 $appKey與$secretKey $appKey = "5d3fb4acb2292"; $secretKey = "5d3fb4acb22925d3fb4acb22925d3fb4acb2292"; $url = "localhost/text_sig.php"; //待傳遞的參數(shù) $params['appKey'] = $appKey; $params['name'] = "張三"; $params['age'] = "26"; $params['sex'] = "男"; $params['root'] = "admin"; $params['password'] = "123456"; $params['time'] = time(); //獲取簽名 $params['sig'] = createSig($params,$secretKey); $param_str = http_build_query($params); $url = $url.'?'.$param_str; var_dump($url); //生成簽名 function createSig($params,$secretKey){ //對(duì)參數(shù)進(jìn)行排序 ksort($params); $str = http_build_query($params); $str .= $secretKey; return md5($str); }
2. 使用 text.php 文件得到的 URL 訪問 -> 服務(wù)端 text_sig.php 文件 ------- 驗(yàn)證簽名
//獲取傳值 $get = $_GET; //獲取appKey $appKey = $get['appKey']; //根據(jù)appKey獲取存儲(chǔ)在數(shù)據(jù)庫中對(duì)應(yīng)的secretKey $secretKey = "5d3fb4acb22925d3fb4acb22925d3fb4acb2292"; //判斷接口是否過期 if (abs($get['time'] - time()) > 100){ die("Time Out"); } //獲取簽名 $sig = $get['sig']; //將簽名從參數(shù)中剔除 unset($get['sig']); //對(duì)參數(shù)進(jìn)行排序 ksort($get); //將參數(shù)數(shù)組轉(zhuǎn)為'&'連接的字符串 $str = http_build_query($get); //參數(shù)字符串后拼接$secretKey $str .= $secretKey; //使用MD5加密 $md5_str = md5($str); //將得到的加密后的結(jié)果與簽名對(duì)比 if ($sig === $md5_str){ var_dump("驗(yàn)簽成功"); }else{ var_dump("驗(yàn)簽失敗"); }
注意:以上僅為學(xué)習(xí)筆記,所以較為簡(jiǎn)單,不夠嚴(yán)謹(jǐn)。
1.實(shí)際項(xiàng)目中須優(yōu)化使用;
2.AES 與 RSA 加密方式最好與簽名 / 驗(yàn)簽配合使用,以防止秘鑰在交互過程中被竊聽并篡改
以上是PHP如何數(shù)據(jù)加密的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!