CryptoJS与JSEncrypt 加密算法

2023-11-19

/* crypto-js进行AES加密,安装: npm i --save crypto-js
 * jsencrypt进行RSA加密,安装: npm i --save jsencrypt
 * 官网:https://github.com/travist/jsencrypt
*/
import CryptoJS from 'crypto-js'
import { JSEncrypt } from 'jsencrypt'

/**
 * 随机生成16位的AES密钥
 */
function getKeyAES() {
  const key = []
  for (let i = 0; i < 16; i++) {
    const num = Math.floor(Math.random() * 26)
    const charStr = String.fromCharCode(97 + num)
    key.push(charStr.toUpperCase())
  }
  const result = key.join('')
  return result
}
/**
 * AES加密
 * 转Utf8编码: CryptoJS.enc.Utf8.parse();
 * 转Base64: CryptoJS.enc.Base64.stringify();
 * @param data 需要加密的数据
 * @param key 密钥
 * @returns 加密后的数据
 */
function encodeAES(data, key) {
  if (typeof data !== 'string') {
    data = JSON.stringify(data)
  }
  // AES加密
  const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(key), {
    iv: CryptoJS.enc.Utf8.parse('1234567812345678'), // 向量。使用CBC模式时,需要使用向量。
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding // 偏移量。使用非补码方式时,需要使用ZeroPadding。默认为PKCS5Padding。
  })
  // base64转码
  return CryptoJS.enc.Base64.stringify(result.ciphertext)
}

/**
 * AES解密
 * @param data 需要解密的数据
 * @param key 密钥
 * @returns 解密后的数据
 */
function decodeAES(data, key) {
  if (typeof data !== 'string') {
    data = JSON.stringify(data)
  }
  const result = CryptoJS.AES.decrypt(data, CryptoJS.enc.Utf8.parse(key), {
    iv: CryptoJS.enc.Utf8.parse('1234567812345678'), // 向量。使用CBC模式时,需要使用向量。
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding // 偏移量。使用非补码方式时,需要使用ZeroPadding。默认为PKCS5Padding。
  })
  // 转为utf-8编码
  return CryptoJS.enc.Utf8.stringify(result)
}

/**
 * RSA加密
 * @param data 需要加密的数据
 * @param key 密钥
 * @returns 加密后的数据
 */
function encodeRSA(data, key) {
  const encryptTool = new JSEncrypt()
  encryptTool.setPublicKey(key)
  return encryptTool.encrypt(data)
}

/**
 * RSA解密
 * @param data 需要解密的数据
 * @param key 密钥
 * @returns 解密后的数据
 */
function decodeRSA(data, key) {
  const encryptTool = new JSEncrypt()
  encryptTool.setPrivateKey(key)
  return encryptTool.decrypt(data)
}

/**
 * 签名,支持SHA256签名与SHA1签名
 * @param data 需要签名的数据
 * @param key SHA1签名的密钥
 */
function signature(data, key = '') {
  let params = ''
  // 先对data排序,然后拼接字符串
  Object.keys(data)
    .sort()
    .forEach(item => {
      params += `${item}=${data[item]}, `
    })
  params = params.slice(0, -2)
  // SHA256签名:使用CryptoJS.SHA256(),先将SHA256加密,然后转Hex的16进制
  return CryptoJS.SHA256(`{${params}}`).toString(CryptoJS.enc.Hex)
}

// 加解密工具
const Tool = {
  secret: 'd70469c6-d8d7-4134-994e-5b84693a1b9c', // 私钥,用于防止别人冒充签名
  RSA_KEY: '', // RSA公钥,后端接口获取, 储存在前端
  AES_KEY: getKeyAES(), // AES密钥,在前端生成
  /**
   * 加密
   * @param data 接口请求参数
   * 说明:请求参数data + 公共参数、AES加密、RSA加密、SHA签名
   * 另外密码等敏感参数, 需要提前单独加密
   */
  encode(data) {
    const { secret, AES_KEY, RSA_KEY } = this
    const requestDataEnc = encodeAES(data, AES_KEY) // 所有请求参数进行AES加密
    const encodeKey = encodeRSA(AES_KEY, RSA_KEY) // AES的密钥进行RSA加密
    const timestamp = new Date().getValue() // 当前时间戳
    const result = {
      secret,
      encodeKey,
      requestDataEnc,
      timestamp
    }
    // 签名
    result.sign = signature(result)
    // 防止私钥泄露移除。
    delete result.secret
    return result
  },
  /**
   * 解密
   * @param 返回josn数据
   */
  decode(json) {
    const { AES_KEY } = this
    let result = decodeAES(json, AES_KEY)
    result = JSON.parse(result)
    return result
  },
  // 加密密码
  encodePwd(data) {
    const { RSA_KEY } = this
    return encodeRSA(data, RSA_KEY)
  }
}

export default Tool

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CryptoJS与JSEncrypt 加密算法 的相关文章

随机推荐

  • MyEclipse8.5的安装过程

    1 双击进行安装 点Next接受 选择好路径后 等待安装完毕 2 选择路径 3 进入工作台如下图 4 配置Tomcat 工具栏 Window Preferences 5 Myeclipse Servers Tomcat 选择版本 勾选Ena
  • 2029:【例4.15】水仙花数

    2029 例4 15 水仙花数 时间限制 1000 ms 内存限制 65536 KB 提交数 1247 通过数 720 题目描述 求100 999中的水仙花数 若三位数ABC ABC A3 B3 C3 则称ABC为水仙花数 例如153 13
  • springboot2.x默认采用cglib代理,以及配置jdk动态代理的方法

    众所周知 springboot开启AOP需要在启动类加上注解 EnableAspectJAutoProxy 但开发过程中发现即使不加 EnableAspectJAutoProxy 注解 bean还是被代理过 而且是Cglib代理对象 此时在
  • win32下Qt5BLE蓝牙开发笔记

    BLE简介 BLE蓝牙是蓝牙2 0以上的蓝牙模块 经典蓝牙是蓝牙2 0以下的蓝牙 蓝牙分为客户端和服务器两端 经典蓝牙可以通过socket编程进行客户端与服务器之间的通信 与网络socket相似 BLE蓝牙则无法使用这种方式进行通信 BLE
  • ICASSP 2023说话人识别方向论文合集

    今年入选 ICASSP 2023 的论文中 说话人识别 声纹识别 方向约有64篇 初步划分为Speaker Verification 31篇 Speaker Recognition 9篇 Speaker Diarization 17篇 An
  • 算法竞赛当中的思考方法——方法论篇。

    方法论 万物皆朴素的第一性原理 几乎任何领域的任何问题的解决方案 都可以看作是 某个结构上的朴素方法的优化 计算机只能处理规模有限的问题 在给定规模且不考虑效率的情况下 问题一定存在朴素解法 具体手段有直接模拟 利用bit枚举 各种搜索算法
  • Spring Cloud面试8连问,谁顶得住?

    问题一 什么是 Spring Cloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 Spring cloud Task 一个生命周期短暂的微服务框架 用于
  • 数据结构-带头双向循环链表的基本实现(C语言,简单易懂,含全部代码)

    链表的概念和结构 概念 链表是一种物理存储结构上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 结构 实际中链表的结构非常多样 以下情况组合起来就有8种链表结构 1 单向 双向 2 带头 不带头 3 循环 非循
  • java逆序输出一个整数_Java实现整数的逆序输出(三种方法)

    Java实现整数的逆序输出和C语言相似 下面我介绍三种方法 第一种 无限制整数的逆序输出 import java util Scanner class Cycle01 public static void main String args
  • Tulsi编译失败问题解决

    Tulsi编译失败 Xcode12 4 bazel 4 0 brew 20210218 tulsi最新 解决办法 跑了 usr local Cellar python 2 将这个目录去掉或者改名字为不可用 然后系统默认跑了python3就好
  • Qt—帮助系统

    一个完善的应用程序应该提供尽可能丰富的帮助信息 Qt中可以使用工具提示 状态提示以及 What s This 等简单的帮助提示 也可以使用Qt Assistant来提供强大的在线帮助 简单的帮助提示 已经讲到了工具提示和状态提示 这里简单介
  • java实现第五届蓝桥杯排列序数

    排列序数 如果用a b c d这4个字母组成一个串 有4 24种 如果把它们排个序 每个串都对应一个序号 abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bacd 6 badc 7 bcad 8 bcda
  • C之(9)函数内联(inline)深入分析

    C之 9 函数内联 inline 深入分析 Author Once Day Date 2023年8月9日 漫漫长路 有人对你微笑过嘛 参考引用文档 Using the GNU Compiler Collection GCC Inline 文
  • 数控技能大赛计算机程序设计员,第八届全国数控技能大赛决赛获奖名单

    近日 由人力资源社会保障部 教育部 科学技术部 中华全国总工会 中国机械工业联合会共同举办的第八届全国数控技能大赛完美落幕 大赛设置数控车工 数控车削加工技术 数控铣工 数控铣削加工技术 加工中心操作工 多轴联动加工技术 数控机床装调维修工
  • Python列表转换成字典、嵌套列表转字典、多个列表转为字典嵌套列表

    目录 两列表转为字典 多列表转为字典嵌套列表 嵌套列表转字典 方法一 直接内置dict 方法二 for循环 一个列表转字典 一 两列表转为字典 list1 key1 key2 list2 value1 value2 print dict z
  • SpringCloud Sentinel集成Gateway和实时监控

    目录 1 Sentinel集成Gateway 1 1 Sentinel对网关支持 1 2 GateWay集成Sentinel 2 Sentinel控制台 2 1 Sentinel控制台安装 2 2 接入控制台 2 3 可视化管理 2 3 1
  • 当使用Vue2+Babel时,如何实现组件重新渲染

    在以前 我们写好静态的 html 后 多数的动态渲染是交给 jquery 来重写的 这样的操作无疑增加了维护的复杂性 于是 我们开始对老系统前端上使用了Vue 2 0 Babel的架构 为什么说Vue比jQuery好呢 这主要从他们的原理着
  • 在Word中给代码添加行号

    说明 有时在Word文档中需要插入一段代码并进行说明 在说明中需要引用代码的某一行 此时可以为这段代码添加行号 应用场景 包含程序代码的作业 论文 报告 步骤 确保段落标记已显示 段落标记是给编辑者看的格式符号 如回车 显示 隐藏段落标记的
  • Win11如何下载安装java?

    一 问题描述 我在复现论文代码的时候 遇到了这样的问题 我没有下载java 那么该如何解决呢 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序 Java 是一种广泛使用的编程语言 可用于开发各种类型的应用程序
  • CryptoJS与JSEncrypt 加密算法

    crypto js进行AES加密 安装 npm i save crypto js jsencrypt进行RSA加密 安装 npm i save jsencrypt 官网 https github com travist jsencrypt