前端Vue使用AES的GCM模式加密

文章目录

  • 前端加密测试
  • Java加解密代码

写了个新的前端项目,公司要求,账号密码这些必须是加密传输的;后端使用了GCM模式加密,前端是复制的一个以前项目的代码,原来是有写加密的,使用的是CryptoJS组件CTR模式加密的,但是这个组件里面没有GCM加密模式,找了半天,发现浏览器其实是自带加密的组件的window.crypto,使用这个组件就可以使用GCM模式加密,代码贴在下面,顺便java代码也贴出来了。

CryptoJS 看点进源码里面看了下只支持这几种模式
在这里插入图片描述
去官网看了下 https://cryptojs.gitbook.io/docs#hashing,也是说支持这几种,估计是浏览器都支持了,所以CryptoJS也就没有再更新了吧
在这里插入图片描述

前端加密测试

包含了完整的加密解密代码,可以拷过去直接用

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>加密小工具</title>
</head>
<body><textarea rows="8" cols="40" id="content"></textarea><br><button onclick="encrypt1()">加密</button><button onclick="decrypt1()">解密</button><p>结果: <label id='result'></label></p>
</body>
<script type="text/javascript">// 将字符串转换为字节数组function stringToUint8Array(str) {let arr = new Uint8Array(str.length);for (let i = 0; i < str.length; i++) {arr[i] = str.charCodeAt(i);}return arr;}// 导入密钥async function importKey(keyStr) {const keyBytes = stringToUint8Array(keyStr);const key = await window.crypto.subtle.importKey('raw',keyBytes,'AES-GCM', // 或者其他算法false,['encrypt', 'decrypt']);return key;}// 加密函数async function encrypt(message, key, iv) {let msgBuffer = new TextEncoder().encode(message);let ivBytes = stringToUint8Array(iv);let ciphertext = await window.crypto.subtle.encrypt({name: "AES-GCM",iv: ivBytes},key,msgBuffer);return ciphertext;}async function decrypt(base64Ciphertext, key, iv) {// 将 Base64 字符串转换回 ArrayBufferlet ciphertext = window.atob(base64Ciphertext);let ciphertextBuffer = new Uint8Array(ciphertext.length);for (let i = 0; i < ciphertext.length; i++) {ciphertextBuffer[i] = ciphertext.charCodeAt(i);}let ivBytes = stringToUint8Array(iv);let plaintext = await window.crypto.subtle.decrypt({name: "AES-GCM",iv: ivBytes},key,ciphertextBuffer.buffer);// 将 ArrayBuffer 转换为字符串let decoder = new TextDecoder();return decoder.decode(plaintext);}let key;let ivStr;(async () => {const keyStr = "你的密钥";  //"29H3LCRC49SGFR0A";ivStr = "iv信息";   //"FBTR064AT3LCRF4E";key = await importKey(keyStr);const ciphertext = await encrypt("uIv86omN9Fp#", key, ivStr);console.log("Encrypted:", ciphertext);})();function encrypt1() {const txt = document.getElementById("content").value;encrypt(txt, key, ivStr).then((ciphertext) => {console.log("Encrypted:", btoa(String.fromCharCode(...new Uint8Array(ciphertext))));document.getElementById("result").innerText = btoa(String.fromCharCode(...new Uint8Array(ciphertext)));});}function decrypt1() {const txt = document.getElementById("content").value;decrypt(txt, key, ivStr).then((plaintext) => {console.log("Decrypted:", plaintext);document.getElementById("result").innerText = plaintext;});}
</script>
</html>

Java加解密代码

要先引入一个包

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.77</version>
</dependency>
package com.yuanjy.sf04;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.util.StringUtils;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLDecoder;
import java.security.Security;
import java.util.Base64;public class GCMTest {private static String key = "你的密钥"; //"29H3LCRC49SGFR0A";private static String ivParameter = "iv信息"; //"FBTR064AT3LCRF4E";private static IvParameterSpec IV;private static final String ALGORITHMSTR = "AES/GCM/NoPadding";public static void main(String[] args) throws Exception {Security.addProvider(new BouncyCastleProvider());System.out.println(encrypt("admin", key));System.out.println(decrypt("yagZI4sMNgee5R/AXhdFCPAjF1k4"));}public static String decrypt(String encrypt) throws Exception {return URLDecoder.decode(decrypt(encrypt, key), "UTF-8");}public static String decrypt(String encryptStr, String decryptKey) throws Exception {return decryptByBytes(Base64.getDecoder().decode(encryptStr), decryptKey);}public static String decryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {byte[] iv = ivParameter.getBytes();IV = new IvParameterSpec(iv);KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance(ALGORITHMSTR, "BC");cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"), IV);byte[] decryptBytes = cipher.doFinal(encryptBytes);return new String(decryptBytes);}public static String encrypt(String content, String encryptKey) throws Exception {return Base64.getEncoder().encodeToString(encryptToBytes(content, encryptKey));}public static byte[] encryptToBytes(String content, String encryptKey) throws Exception {byte[] iv = ivParameter.getBytes();IV = new IvParameterSpec(iv);KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR, "BC");cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"), IV);return cipher.doFinal(content.getBytes("utf-8"));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411866.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

YOLO | YOLO目标检测算法(基础入门)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO目标检测算法 深度学习经典检测方法1、两阶段&#xff08;Two-stage&#xff09;2、单阶段&#xff08;One-stage&#xff09; 深度学习经典检测方法 1、两阶段&a…

jenkins发布文件到远程服务器

jenkins安装 安装教程 后台启动脚本 创建脚本&#xff1a;start_jenkins.sh ls for pid in $(ps -ef|grep jenkins.war|grep -v grep|cut -c 10-16); doecho $pid;kill -9 $pid; done;nohup java -Djava.awt.headlesstrue -jar /usr/local/jenkins/jenkins.war --webroot/…

游戏分享网站|基于SprinBoot+vue的游戏分享网站系统(源码+数据库+文档)

游戏分享网站 目录 基于SprinBootvue的游戏分享网站 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2后台登录 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

SpringCloud乐尚代驾学习笔记:环境搭建(二)

文章目录 1、前端环境1.1、注册微信开发者账号1.2、开通服务与插件1.3、微信开发者工具使用 2、服务器端环境2.1、安装mysql2.2、安装rabbitmq2.3、安装redis2.4、安装nacos2.5、安装minio 3、导入初始化项目 1、前端环境 1.1、注册微信开发者账号 虽然开发微信小程序可以使用…

牛客NC313 两个数组的交集 C++

牛客NC313 两个数组的交集 C 思路&#x1f914;&#xff1a; 用哈希表存储第一个数组&#xff0c;再和第二个数组对比&#xff0c;对比成功就添加到新的数组中&#xff0c;之后将哈希表的该位置变为false&#xff0c;防止重复添加。这里数据范围仅有1000&#xff0c;所以我们可…

nginx转发接口地址【非常实用】

使用场景 由于客户的需求是要访问一个外网接口 比如http://58.20.57.190:6652 实例 http://58.20.57.190:6652//uploadBasePatient?Barcode1000000073&customerCode1 比如外网才能访问&#xff0c;科室电脑是访问不了外网的 我们就需要中间在一个既有外网又有内网的前置…

少儿编程入门,Scratch、Python与C++,谁能成为孩子的首选语言?

编程已不再是专业人士的专利&#xff0c;而是成为了一项基本技能。对于孩子们来说&#xff0c;学习编程不仅能提高逻辑思维能力&#xff0c;还能为他们的未来职业生涯打下坚实基础。那么问题来了&#xff0c;面对Scratch、Python和C这三门编程语言&#xff0c;究竟哪一款更适合…

Datawhale AI夏令营

一、物体检测算法 物体检测算法主要分为两类&#xff1a;One-Stage&#xff08;一阶段&#xff09;和Two-Stage&#xff08;两阶段&#xff09;模型。 二、One-Stage目标检测算法 定义&#xff1a;One-Stage目标检测算法是一种直接在图像上进行目标检测的方法&#xff0c;无…

Docker原理及实例

目录 一 Docker简介及部署方法 1.1 Docker简介 1.1.1 什么是docker&#xff1f; 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 2 部署docker 2.1 容器工作方法 2.2 部署第一个容器 2.2.1 配置软件仓库 2.2.2 安装docker-ce并启动服…

8月28日

思维导图 作业&#xff1a; 使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 代码&#xff1a; #include <iostream>using namespace std;using datatype int; #define MAX 30struct SeqList {private:datatype *data;int size 0;int l…

SpringBoot3与AOP完美结合:轻松追踪用户操作,实现精准日志记录

程序员必备宝典https://tmxkj.top/#/ 1.pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId&g…

Spring八股文

重点 描述一下bean的生命周期 简述版 调用构造器 或者是通过工厂的方式创建Bean对象给bean对象的属性注入值调用初始化方法&#xff0c;进行初始化&#xff0c; 初始化方法是通过init-method来指定的.使用IOC容器关闭时&#xff0c; 销毁Bean对象 详细&#xff1a; 1. 实例化 …

Qt QCustomPlot画色阶图

工作中用到QCustomPlot画曲线图和色阶图&#xff0c;并且在色阶图上添加文字&#xff0c;圆圈或者几条线段画一些图形&#xff0c;这里写个简单的例子把这几个功能记录一下&#xff0c;代码在这里&#xff1a; https://download.csdn.net/download/Sakuya__/89681279https://…

ggml 简介

ggml是一个用 C 和 C 编写、专注于 Transformer 架构模型推理的机器学习库。该项目完全开源&#xff0c;处于活跃的开发阶段&#xff0c;开发社区也在不断壮大。ggml 和 PyTorch、TensorFlow 等机器学习库比较相似&#xff0c;但由于目前处于开发的早期阶段&#xff0c;一些底层…

『功能项目』怪物受击后显示受击状态UI【12】

本专栏每10章会做一次项目优化&#xff0c;但不影响具体功能 我们可以打开优化前的项目10也可以打开优化后的项目11 双击King或者怪物熊预制体 - 进入预制体空间后创建一个Image改名为StateUI01 代表第一个受击状态 修改Canvas的渲染模式 - 改为世界WorldSpace 调节Image&…

3分钟千人被裁,IBM中国 “灭霸式“裁员背后原因?

2024年8月23日&#xff0c;IMB即有员工传出“无法访问系统”&#xff0c;“无法连接到公司网络”的消息&#xff0c;后续传出裁员的传闻。 图片来源网络 2024年8月26日周一&#xff0c;IBM召开3分钟的会议&#xff0c;宣布彻底关闭IBM中国研发部门&#xff0c;之后直接切断会议…

【Go高性能】测试(单元测试、基准测试)

Go测试 一、分类1. 单元测试2. 基准测试 二、基准测试1. 介绍2. 基准测试基本原则3. 使用testing包构建基准测试3.1 执行基准测试3.2 基准测试工作原理3.3 改进基准测试的准确性3.3.1 -benchtime3.3.2 -count3.3.3 -cpu 4. 使用benchstat工具比较基准测试(可跳过&#xff09;4.…

SpringBoot日常:Spring之@PostConstruct解析

简介 spring的Bean在创建的时候会进行初始化&#xff0c;而初始化过程会解析出PostConstruct注解的方法&#xff0c;并反射调用该方法。 PostConstruct 的使用和特点 只有一个非静态方法能使用此注解&#xff1b;被注解的方法不得有任何参数&#xff1b;被注解的方法返回值必…

数据主权与隐私保护的深入探讨

随着数字化进程的加速&#xff0c;数据已成为当今世界的重要资源。数据主权和隐私保护这两个概念也越来越受到关注。数据主权涉及到国家对数据的控制权和管理权&#xff0c;而隐私保护则关乎个人数据的安全性和隐私权利。两者相互交织&#xff0c;共同塑造了数字时代的法律、经…