溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP如何數(shù)據(jù)加密

發(fā)布時間:2020-10-27 10:27:37 來源:億速云 閱讀:297 作者:小新 欄目:編程語言

這篇文章主要介紹PHP如何數(shù)據(jù)加密,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

  環(huán)境 Apache PHP-7.0.12

加密解決了什么問題:

1.防止通信內容被竊聽;

2.防止通信內容被篡改

加密類型:

1.對稱加密:加密與解密使用的是同一個秘鑰,例:DES(Data Encryption Standard),1977-1999年,1999年被破解;AES(Advance Encryption Standard),目前最流行的對稱加密算法

2.非對稱加密: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加密演示
//明文(要加密的內容)
$str = "這是測試用例 我是明文";
//秘鑰(用例:使用uniqid()函數(shù)生成了一個唯一ID)
$key = "5d3fb4acb2292";
//加密算法
$method = "AES-128-CBC";
//加密向量(要求18個字節(jié))
$iv = "1234567812345678";
$encrypt_str = openssl_encrypt($str, $method, $key, 0, $iv);
var_dump("AES加密結果:".$encrypt_str);
# AES解密演示
//$encrypt_str AES加密后產(chǎn)生的密文
//$key 秘鑰(同上)
$decrypt_str = openssl_decrypt($encrypt_str, $method, $key, 0, $iv);
var_dump("AES解密結果:".$decrypt_str);

RSA 加密

1.公/私鑰加密算法,屬于非對稱加密:

2.優(yōu)點:極難被破解;

3.缺點:速度慢,運算次數(shù)多,不適合加密長文本;

//公鑰(項目中可在線生產(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-----";
//私鑰(項目中可在線生產(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("私鑰加密結果:".$content_encrypt);
 # 公鑰解密
//$content_encrypt 私鑰加密后的密文
//用于接收解密后的明文
$content_decrypt = "";
openssl_public_decrypt($content_encrypt, $content_decrypt, $PUBLIC_KEY, 1);
var_dump("公鑰解密結果:".$content_decrypt);

項目中 API 交互方式之 ---- 簽名 / 驗簽

1. 新建 text.php 文件 ------ 生成簽名

//根軍 MD5()函數(shù)的不可逆性進行簽名校驗
//首先必須要有 $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){
    //對參數(shù)進行排序
    ksort($params);
    $str = http_build_query($params);
    $str .= $secretKey;
    return md5($str);
}

2. 使用 text.php 文件得到的 URL 訪問 -> 服務端 text_sig.php 文件 ------- 驗證簽名

//獲取傳值
$get = $_GET;
//獲取appKey
$appKey = $get['appKey'];
//根據(jù)appKey獲取存儲在數(shù)據(jù)庫中對應的secretKey
$secretKey = "5d3fb4acb22925d3fb4acb22925d3fb4acb2292";
//判斷接口是否過期
if (abs($get['time'] - time()) > 100){
    die("Time Out");
}
//獲取簽名
$sig = $get['sig'];
//將簽名從參數(shù)中剔除
unset($get['sig']);
//對參數(shù)進行排序
ksort($get);
//將參數(shù)數(shù)組轉為'&'連接的字符串
$str = http_build_query($get);
//參數(shù)字符串后拼接$secretKey
$str .= $secretKey;
//使用MD5加密
$md5_str = md5($str);
//將得到的加密后的結果與簽名對比
if ($sig === $md5_str){
    var_dump("驗簽成功");
}else{
    var_dump("驗簽失敗");
}

注意:以上僅為學習筆記,所以較為簡單,不夠嚴謹。

1.實際項目中須優(yōu)化使用;

2.AES 與 RSA 加密方式最好與簽名 / 驗簽配合使用,以防止秘鑰在交互過程中被竊聽并篡改

以上是PHP如何數(shù)據(jù)加密的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

php
AI