PHP+Vue实现前后端加密的轻量级方案分享
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">我的解决方式</a></li><li><a href="#_label1">用起来的样子</a></li><li><a href="#_label2">意义在哪里</a></li></ul></div><p>在做项目的时候,我遇到一个需求:前后端需要传输一些敏感数据。</p><p>虽然 HTTPS 已经可以保证传输安全,但在某些场景下,我还是希望能再加一层保护:</p>
<ul><li>防止接口被随便模拟调用</li><li>就算数据被截获,也看不懂里面的内容</li><li>就算用劫持的数据请求,也不进行响应</li></ul>
<p>我最开始也去找过现成的方案,确实有一些成熟的实现。</p>
<p>但问题是——它们的功能太多、体系太重,而我的需求其实很单纯,只需要“在请求上套一层加解密”。</p>
<p>所以与其硬拗那些复杂的框架,不如自己写一个更轻量的版本。</p>
<p class="maodian"><a name="_label0"></a></p><h2>我的解决方式</h2>
<p>于是,我就写了一个前后端配套的小工具:</p>
<ul><li>前端:Vue 环境下的 npm 包</li><li>后端:PHP Composer 库</li></ul>
<p>核心思路是:</p>
<ul><li><strong>前端自动加密请求体</strong></li><li><strong>后端自动解密请求体</strong></li><li>开发者几乎不需要关心加解密细节,就像在用普通的请求一样</li><li>内置 AES-128-CBC 加密、签名机制、防重放攻击</li><li>允许一定的时间误差,避免前后端时钟不一致</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>用起来的样子</h2>
<p>前端示例:</p>
<p>通过 <code>npm install hejunjie-encrypted-request</code> 引用</p>
<div class="jb51code"><pre class="brush:js;">import { encryptRequest, EncryptOptions } from "hejunjie-encrypted-request";
const options: EncryptOptions = {
appKey: "your-app-key", // 签名密钥,用于接口签名校验(32位字母或数字)
aesKey: "your-aes-key", // AES 加密的密钥(16位)
aesIv: "your-aes-iv", // AES 加密的初始化向量(16位)
token: "optional-token", // 可选的认证令牌,PHP 端可用于用户验证
};
// 请求数据
const data = { name: "张三" };
// 生成密文
const encrypted = encryptRequest(data, options);
// 发送请求
request.post("/api/user/info", encrypted)
.then(res => console.log(res));
</pre></div>
<p>后端示例:</p>
<p>通过 <code>composer require hejunjie/encrypted-request</code> 引用</p>
<div class="jb51code"><pre class="brush:php;">use Hejunjie\EncryptedRequest\EncryptedRequestHandler;
$param = $_POST; // 自行获取前端请求的参数
$handler = new EncryptedRequestHandler();
try {
$data = $handler->handle(
$param['en_data'] ?? '',
$param['timestamp'] ?? '',
$param['sign'] ?? ''
);
} catch (\Hejunjie\EncryptedRequest\Exceptions\SignatureException $e) {
echo "签名错误: " . $e->getMessage();
} catch (\Hejunjie\EncryptedRequest\Exceptions\TimestampException $e) {
echo "时间戳错误: " . $e->getMessage();
} catch (\Hejunjie\EncryptedRequest\Exceptions\DecryptionException $e) {
echo "解密错误: " . $e->getMessage();
}
print_r($data); // ['name' => '张三']
</pre></div>
<p>整体就是“即插即用”,加密解密几乎是无感的。</p>
<p class="maodian"><a name="_label2"></a></p><h2>意义在哪里</h2>
<p>这个方案不是什么替代 HTTPS 的黑科技,它更像是一个“小插件”:</p>
<ul><li>HTTPS 解决传输安全</li><li>我这套方案解决“再多一层壳”的需求</li></ul>
<p>适合那些 <strong>对安全性有点额外要求,但又不想引入复杂框架</strong> 的项目。</p>
頁:
[1]