PHP+Vue實(shí)現(xiàn)前后端加密的輕量級(jí)方案分享
在做項(xiàng)目的時(shí)候,我遇到一個(gè)需求:前后端需要傳輸一些敏感數(shù)據(jù)。
雖然 HTTPS 已經(jīng)可以保證傳輸安全,但在某些場景下,我還是希望能再加一層保護(hù):
- 防止接口被隨便模擬調(diào)用
- 就算數(shù)據(jù)被截獲,也看不懂里面的內(nèi)容
- 就算用劫持的數(shù)據(jù)請(qǐng)求,也不進(jìn)行響應(yīng)
我最開始也去找過現(xiàn)成的方案,確實(shí)有一些成熟的實(shí)現(xiàn)。
但問題是——它們的功能太多、體系太重,而我的需求其實(shí)很單純,只需要“在請(qǐng)求上套一層加解密”。
所以與其硬拗那些復(fù)雜的框架,不如自己寫一個(gè)更輕量的版本。
我的解決方式
于是,我就寫了一個(gè)前后端配套的小工具:
- 前端:Vue 環(huán)境下的 npm 包
- 后端:PHP Composer 庫
核心思路是:
- 前端自動(dòng)加密請(qǐng)求體
- 后端自動(dòng)解密請(qǐng)求體
- 開發(fā)者幾乎不需要關(guān)心加解密細(xì)節(jié),就像在用普通的請(qǐng)求一樣
- 內(nèi)置 AES-128-CBC 加密、簽名機(jī)制、防重放攻擊
- 允許一定的時(shí)間誤差,避免前后端時(shí)鐘不一致
用起來的樣子
前端示例:
通過 npm install hejunjie-encrypted-request 引用
import { encryptRequest, EncryptOptions } from "hejunjie-encrypted-request";
const options: EncryptOptions = {
appKey: "your-app-key", // 簽名密鑰,用于接口簽名校驗(yàn)(32位字母或數(shù)字)
aesKey: "your-aes-key", // AES 加密的密鑰(16位)
aesIv: "your-aes-iv", // AES 加密的初始化向量(16位)
token: "optional-token", // 可選的認(rèn)證令牌,PHP 端可用于用戶驗(yàn)證
};
// 請(qǐng)求數(shù)據(jù)
const data = { name: "張三" };
// 生成密文
const encrypted = encryptRequest(data, options);
// 發(fā)送請(qǐng)求
request.post("/api/user/info", encrypted)
.then(res => console.log(res));
后端示例:
通過 composer require hejunjie/encrypted-request 引用
use Hejunjie\EncryptedRequest\EncryptedRequestHandler;
$param = $_POST; // 自行獲取前端請(qǐng)求的參數(shù)
$handler = new EncryptedRequestHandler();
try {
$data = $handler->handle(
$param['en_data'] ?? '',
$param['timestamp'] ?? '',
$param['sign'] ?? ''
);
} catch (\Hejunjie\EncryptedRequest\Exceptions\SignatureException $e) {
echo "簽名錯(cuò)誤: " . $e->getMessage();
} catch (\Hejunjie\EncryptedRequest\Exceptions\TimestampException $e) {
echo "時(shí)間戳錯(cuò)誤: " . $e->getMessage();
} catch (\Hejunjie\EncryptedRequest\Exceptions\DecryptionException $e) {
echo "解密錯(cuò)誤: " . $e->getMessage();
}
print_r($data); // ['name' => '張三']
整體就是“即插即用”,加密解密幾乎是無感的。
意義在哪里
這個(gè)方案不是什么替代 HTTPS 的黑科技,它更像是一個(gè)“小插件”:
- HTTPS 解決傳輸安全
- 我這套方案解決“再多一層殼”的需求
適合那些 對(duì)安全性有點(diǎn)額外要求,但又不想引入復(fù)雜框架 的項(xiàng)目。
到此這篇關(guān)于PHP+Vue實(shí)現(xiàn)前后端加密的輕量級(jí)方案分享的文章就介紹到這了,更多相關(guān)PHP Vue加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
刪除html標(biāo)簽得到純文本可處理嵌套的標(biāo)簽
這篇文章主要介紹了通過刪除html標(biāo)簽得到的純文本可處理嵌套的標(biāo)簽,需要的朋友可以參考下2014-04-04
PHP單例模式模擬Java Bean實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP單例模式模擬Java Bean實(shí)現(xiàn)方法,涉及php面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
php連接mysql之mysql_connect()與mysqli_connect()的區(qū)別
本擴(kuò)展自 PHP 5.5.0 起已廢棄,并在將來會(huì)被移除。應(yīng)使用 MySQLi 或 PDO_MySQL 擴(kuò)展來替換之,這里就為大家分享一下mysql_connect()與mysqli_connect()的區(qū)別,需要的朋友可以參考下2020-07-07
php 調(diào)用ffmpeg獲取視頻信息的簡單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猵hp 調(diào)用ffmpeg獲取視頻信息的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
PHP實(shí)現(xiàn)數(shù)據(jù)庫統(tǒng)計(jì)時(shí)間戳按天分組輸出數(shù)據(jù)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)據(jù)庫統(tǒng)計(jì)時(shí)間戳按天分組輸出數(shù)據(jù)的方法,涉及php基于時(shí)間的運(yùn)算與數(shù)據(jù)庫查詢相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
XAMPP升級(jí)PHP版本實(shí)現(xiàn)步驟解析
這篇文章主要介紹了XAMPP升級(jí)PHP版本實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
php下網(wǎng)站防IP攻擊代碼,超級(jí)實(shí)用
現(xiàn)在做外國網(wǎng)絡(luò),訪問量越來越高了,最近有很多不良IP不停的進(jìn)行攻擊,由于不是自己的主機(jī),所以,只能通過代碼去阻止它們。2010-10-10
PHP面向?qū)ο蟪绦蛟O(shè)計(jì)子類擴(kuò)展父類(子類重新載入父類)操作詳解
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)子類擴(kuò)展父類(子類重新載入父類)操作,涉及php面向?qū)ο蠓椒ㄖ貙懪c擴(kuò)展相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
PHP socket 模擬POST 請(qǐng)求實(shí)例代碼
這篇文章主要介紹了 PHP 使用socket 模擬POST的方法,結(jié)合實(shí)例分析了sockets 模擬 POST 常用技巧,需要的朋友可以參考下2016-07-07

