vue(crypto.js )加密。laravelAPI接口解密。(AES的CBC模式)

1 .前端

1、安装 crypto-js
npm install crypto-js
2、封装加密方式

①新建方法

import CryptoJS from "crypto-js";

module.exports = {
    /**
     * AES加密
     * @param {Object} data 待加密的数据
     * @param {Object} key 密钥
     */
    encrypt(str, keyStr, ivStr) {
        const data = JSON.stringify(str);
        const key = CryptoJS.enc.Utf8.parse(keyStr);   // 密钥key   后台提供 - cbc模式 32位字符
        const iv = CryptoJS.enc.Utf8.parse(ivStr);   // iv   后台提供 - cbc模式 16位字符

        const encryptedData = CryptoJS.AES.encrypt(data, key, {
            iv,
            mode: CryptoJS.mode.CBC, // 使用 CBC 模式
            padding: CryptoJS.pad.Pkcs7, // 使用 PKCS7 填充
        }).toString(); // 执行加密操作
        
        return encryptedData;
    },
},

②使用 ( uni-app举例,其他vue类似 )

/** 1. main.js 引入 **/
import { encrypt } from "./utils/crypto-js.js";
Vue.prototype.$encrypt = encrypt;

/** 2. 在封装请求地方处理 **/
// POST请求
let request = function(url, data, title = '加载中') {
    // 加密
    let _data = this.$encrypt( data , '32位KEY ','16位IV');
    ....
}

至此前端完成加密

2. 后端laravel

1. 创建中间件
php artisan make:middleware EncryptRequestMiddleware
2. 中间件处理解密
/** 中间件地址 app / HTTP / Middleware / EncryptRequestMiddleware  **/
public function handle(Request $request, Closure $next)
    {
        // 获取当前请求的路由信息
        $route = $request->route();
        $currentRouteName = $route->getName();
        
        // 定义你想要去除的接口路由名称,进行判断
        $excludedRoutes = [
            'wechat.oss', //路由名称
            'wechat.payment.notify',
        ];

        // 如果当前路由在去除列表中,直接放行
        if (in_array($currentRouteName, $excludedRoutes)) {
            return $next($request);
        }


        // 获取加密的参数
        $encryptedData = $request->data;
        $key = 'JrAg7qMi2wTFJnq5ssjJEo9xtEhPtSxX'; // 一个随机的 32 字节密钥
        $iv = '8Z2wMy7amABbqsRC'; // 一个随机的 16 字节初始向量
        $method = 'AES-256-CBC'; // 使用 AES-256-CBC 加密算法
        $decryptedData = openssl_decrypt(base64_decode($encryptedData), $method, $key, OPENSSL_RAW_DATA, $iv); // 执行解密操作
        
        if ($decryptedData === false) {
            return response()->json(['error' => '解密失败'], 403);
        }
        // 将解密后的参数设置回请求对象
        $request->merge(['decrypted_data' => json_decode($decryptedData)]);;

        return $next($request);
    }
3. 注册全局中间件
/**在 App\Http\Kernel 类中**/
protected $middlewareGroups = [
     ...
     'api' => [
         ...
       \App\Http\Middleware\EncryptRequestMiddleware::class,
     ],
];
4. 请求处理
...
public function index(Request $request){
     $data = $request->decrypted_data;      // $data 就是前端请求数据
     $id = $data->id;
     ...
}

至此完成加密解密操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容