使用aes数据加密

常用的数据加密方法主要包括对称加密和非对称加密两大类。每种类型都有其适用场景和特点。

对称加密算法

对称加密算法的特点是加密和解密使用相同的密钥。这类算法通常速度较快,
适合大量数据的加密。

AES(Advanced Encryption Standard):高级加密标准,是最为广泛使用的对称加密算法之一,支持 128、192 和 256 位密钥长度。

DES(Data Encryption Standard):早期的对称加密标准,现已不再推荐单独使用,因为其密钥长度较短(56 位),容易受到攻击。

3DES(Triple DES):为了提高 DES 的安全性而开发,使用三个 DES 密钥进行加密,提高了安全性。

Blowfish:一种可变密钥长度的对称加密算法,设计目的是作为 DES 的替代品。

Twofish:一种现代的对称密钥加密算法,支持 128 到 256 位的密钥长度。

非对称加密算法

非对称加密算法使用一对密钥——公钥和私钥。公钥可以公开分享,而私钥必须保密保存。

RSA(Rivest-Shamir-Adleman):最著名的非对称加密算法之一,广泛应用于安全证书、数字签名等领域。

ECC(Elliptic Curve Cryptography):基于椭圆曲线的加密算法,与 RSA 相比,在相同级别的安全性下,可以使用更短的密钥长度。

Diffie-Hellman:主要用于密钥交换,允许双方在一个不安全的通信渠道上建立共享的秘密密钥。

ElGamal:基于离散对数问题的非对称加密算法。

其他加密技术

除了上述算法之外,还有一些其他的加密技术:

Hashing(哈希函数):虽然不是真正的“加密”,但哈希函数如 SHA-256 和 SHA-3 用于数据完整性检查和密码存储。

HMAC(Hash-based Message Authentication Code):基于哈希函数的消息认证码,用于保证消息的完整性和真实性。

下图是aes加密运行流程
在这里插入图片描述

那么咱们话不多说,进入主题

本文章是通过前端: vue3+vite和 后端: nodejs实现的,大家可以根据个人情况进行更改,仅限参考。

前后端下载第三方库crypto-js,用于加密解密

npm i crypto-js

使用Node.js 自带 crypto 模块,无需额外安装。生成密钥和iv。
后端展示代码

//	配置密钥和iv
const crypto = require('crypto');

// 生成一个随机的256位密钥
const secretKey = crypto.randomBytes(32).toString('hex');
// var key = CryptoJS.lib.WordArray.random(256/8); // 256位 / 8 字节 = 32字节

// 生成一个随机的初始化向量(16字节)
// 生成一个随机的IV,长度同样为16字节(128位),这通常是AES CBC模式的要求
const iv = crypto.randomBytes(16).toString('hex');
// var iv = CryptoJS.lib.WordArray.random(128/8); // 128位 / 8 字节 = 16字节

module.exports = {
    secretKey,
    iv
};

封装加密解密函数

const CryptoJS = require('crypto-js');
const config = require("../config")

// 加密
function encrypt(data) {
    const ciphertext = CryptoJS.AES.encrypt(data, config.secretKey, {
        iv: CryptoJS.enc.Hex.parse(config.iv),
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC
    }).toString();
    return ciphertext;
}

// 解密
function decrypt(ciphertext) {
    const bytes = CryptoJS.AES.decrypt(ciphertext, config.secretKey, {
        iv: CryptoJS.enc.Hex.parse(config.iv),
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC
    });
    return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
}

module.exports = {
    encrypt, decrypt
}

配置接口

//	导入密钥、iv和加密解密函数
const config = require("../../config");
//	encrypt是加密函数、decrypt是解密函数
var { encrypt, decrypt } = require("../../utils/way");

//	接口测试
//	像前端发送密钥和iv,前端代码需要密钥和iv进行加密和解密
router.get("/getUsers", async (req, res) => {
  res.send({ code: 200, key: config.secretKey, iv: config.iv, });
});

// 加密添加测试
router.get("/postUsers", async (req, res) => {
  let { name, age } = decrypt(req.query.data);
  name = 20;
  age = 10;
  //这里加密需要JSON,stringify()
  let data = encrypt(JSON.stringify({ name: 1, age: 2 }));
  res.json({ code: 200, data });
});

前端展示代码

import axios from './request';
// import instance from './request';
import * as CryptoJS from 'crypto-js'; // 导入 CryptoJS 库和 AES 加密算法


// 公共加密函数
function encryptData(data: any, secretKey: string, iv: string): string {
    const ciphertext = CryptoJS.AES.encrypt(data, secretKey, {
        iv: CryptoJS.enc.Hex.parse(iv),
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC,
    }).toString();
    return ciphertext;
}

// 公共解密函数
function decryptData(ciphertext: string, secretKey: string, iv: string): any {
    const bytes = CryptoJS.AES.decrypt(ciphertext, secretKey, {
        iv: CryptoJS.enc.Hex.parse(iv),
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC,
    });
    return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
}


// 请求处理函数
async function processRequest(method: string, path: string, data: any = null): Promise<any> {
    let result = await axios.get('/xjh/getUsers');
    const secretKey = result.data.key
    const iv = result.data.iv
    if (!secretKey || !iv) {
        console.error('必须提供密钥和iv');
        throw new Error('Invalid encryption configuration');
    }
    let response;
    try {
        if (data) {
            const encryptedData = encryptData(JSON.stringify(data), secretKey, iv);
            if (method === 'get') {
                response = await axios({ method, url: path, params: { data: encryptedData } });
            } else {
                response = await axios({ method, url: path, data: { data: encryptedData } });
            }
        } else {
            response = await axios({ method, url: path });
        }

        // 解密返回数据
        const decryptedData = decryptData(response.data.data, secretKey, iv);
        return { ...response.data, data: decryptedData };
    } catch (error) {
        console.error(`Error with ${method.toUpperCase()} request to ${path}:`, error);
        throw error;
    }
}

// 导出 API 请求函数
export const getData = (path: string) => processRequest('get', path);   //  不带参数
export const getQuery = (path: string, data: any) => processRequest('get', path, data);     //  携带参数
export const postData = (path: string, data: any) => processRequest('post', path, data);
export const putData = (path: string, data: any) => processRequest('put', path, data);
export const deleteData = (path: string, data: any) => processRequest('delete', path, data);

他的大概流程就是,首次加载页面获取到密钥和iv,然后请求数据,后端将加密后的数据发送给前端,前端可以调用通过封装好的请求函数来获取数据,请求处理函数会先拿到secretKey 和iv,然后定义response,然后判断请求是否携带参数,如果先进行加密,然后再请求数据,如果没有直接发送给请求,然后解密响应数据,随后return导出数据,便于后续使用

下图是加密的数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值