常用的数据加密方法主要包括对称加密和非对称加密两大类。每种类型都有其适用场景和特点。
对称加密算法
对称加密算法的特点是加密和解密使用相同的密钥。这类算法通常速度较快,
适合大量数据的加密。
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导出数据,便于后续使用
下图是加密的数据


7480

被折叠的 条评论
为什么被折叠?



