当前位置: 首页 > news >正文

AES加密,前端加密,后端解密

概述:

在实现基本http 认证的场景下,我们希望认证信息最好不要以明文的形式进行传递,那么这里可以采用 AES 的加解密的方案来实现。

场景:

前后端使用 Baisc 认证,认证信息使用AES进行加密,添加时间戳来防止重复,在一定程度上增加访问的安全性。

注意事项:


* 前后端需要使用相同的AES-256-CBC算法和PKCS5Padding填充

* 前后端使用相同的128位(16字节)IV向量,与128位(16字节)或倍数的秘钥

前端加密:

const crypto = require('crypto');class AesUtil {constructor(key, iv) {this.key = Buffer.from(key, 'utf8');this.iv = Buffer.from(iv, 'utf8');this.algorithm = 'aes-256-cbc';}/*** AES加密* @param {string} text - 要加密的文本* @returns {string} 加密后的Base64字符串*/encrypt(text) {try {const cipher = crypto.createCipheriv(this.algorithm, this.key, this.iv);let encrypted = cipher.update(text, 'utf8', 'base64');encrypted += cipher.final('base64');return encrypted;} catch (error) {throw new Error('AES加密失败: ' + error.message);}}/*** 生成带时间戳的认证信息* @param {string} username - 用户名* @param {string} password - 密码* @returns {Object} 认证头对象*/generateAuthData(username, password) {const timestamp = Date.now();const credentials = `${username}:${password}:${timestamp}`;const encryptedData = this.encrypt(credentials);return {encryptedData: encryptedData,timestamp: timestamp,authHeader: `Basic ${Buffer.from(encryptedData).toString('base64')}`,headers: {'Authorization': `Basic ${Buffer.from(encryptedData).toString('base64')}`,'X-Timestamp': timestamp.toString(),'X-Encrypted': 'true','Content-Type': 'application/json'}};}
}const aesUtil = new AesUtil('12345678901234561234567890123456', '1234567890123456');
console.log(aesUtil.generateAuthData('admin', '12345678@'))

运行后得到如下打印:

{encryptedData: 'Hrx1LVwnBFMfvGgv64rcPpXIMH9pNX4MWfkS+sPXb3Q=',timestamp: 1763183507151,authHeader: 'Basic SHJ4MUxWd25CRk1mdkdndjY0cmNQcFhJTUg5cE5YNE1XZmtTK3NQWGIzUT0=',headers: {Authorization: 'Basic SHJ4MUxWd25CRk1mdkdndjY0cmNQcFhJTUg5cE5YNE1XZmtTK3NQWGIzUT0=','X-Timestamp': '1763183507151','X-Encrypted': 'true','Content-Type': 'application/json'}
}

后端解密:

public class AesUtil {private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";private static final String secretKey = "12345678901234561234567890123456";private static final String iv = "1234567890123456";/*** AES解密** @param encryptedText 加密文本* @return 解密后的字符串*/public static String decrypt(String encryptedText) {try {SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException("AES解密失败", e);}}public static void main(String[] args) {String encryptedData = "Hrx1LVwnBFMfvGgv64rcPpXIMH9pNX4MWfkS+sPXb3Q=";String decrypt = AesUtil.decrypt(encryptedData);System.out.println(decrypt);}
}

运行后得到如下结果:

admin:12345678@:1763183507151

该功能经过验证,可以接口具体的业务场景,进行改造适配。

http://www.dtcms.com/a/615006.html

相关文章:

  • SK Keyfoundry增加Sic产能
  • 温州建站平台wordpress 七牛云
  • Spring Boot与MyBatis
  • 大区直播间网站开发制作研究网站开发意义
  • 西安网站建设价格明细北京西城注册公司
  • 提升知识索引性能的技术手段
  • 【数据结构】【xjtuse】八股文单元小测
  • 无锡网站建设开发网站建设终身不用维护
  • 苏州网站建设排名安卓开发课程
  • 前端工程化未来,模块联邦与微前端
  • 广州网站建站公司如何做社群营销模式
  • 网站开发 案例详解儋州网站建设培训学校
  • Java对象创建与生命周期:贫道吕洞宾的造物主指南
  • 网站有源码 怎么建设一个人做网站需要多久
  • JavaEE初阶——多线程3(案例)
  • 怎样做28网站代理池州网站建设兼职
  • 在线精品课程网站开发泰国金木棉做网站网站
  • 河北建站公司哪类网站赚钱 优帮云
  • 用c做网站哪个网站的ps元素好
  • 网站运营的主要内容能够给上市公司做网站意味着什么
  • 做网站开发有前途吗北京高级网站建设
  • 基于lammps模拟的合金两种不同弯曲方法及动态变形的研究
  • 权重查询站长工具电影网站开发视频
  • 韩国知名录屏软件班迪,绿色版免费分享,功能完整无限制
  • Linux进程复制与替换(1)
  • QPushButton菜单样式表深度解析
  • Pybullet环境中搭建一个UR10机械臂带Robotiq夹爪并实现一个简单的抓取任务
  • 免费建立个人网站的哪些平台好网站建设课程的感受
  • Qt QML 模块及其函数详解
  • 2019年JCP SCI1区TOP,改进蚁群算法+多车场多目标绿色车辆路径规划,深度解析+性能实测