crypto-js不支持 AES_GCM 加密 ,听说可以用 crypto 支持?当时是自己写的....

crypto API 要求页面在安全上下文(Secure Context)中运行。localhost 和 127.0.0.1 被视为安全上下文,但通过普通 IP 地址(如 192.168.x.x)访问时,浏览器可能认为不安全。

解决方法:

如果必须使用 IP 地址,可以尝试将 IP 地址添加到浏览器的安全上下文中(不推荐,仅限开发环境)。

在生产环境中,强烈建议使用 HTTPS 来确保安全上下文。


async function deriveKeyFromMaterial(keyMaterial, lengthBits) {
// 使用 SHA-256 哈希算法来生成足够长度的密钥材料
// const hashedKey = await crypto.subtle.digest(
// "SHA-256",
// new TextEncoder().encode(keyMaterial)
// );
// console.log(hashedKey, "hashedKey");
let hashedKey = stringToBytes(keyMaterial);
hashedKey = adjustKeyLength(hashedKey, 16);
// 导入哈希后的密钥材料作为AES密钥
return await crypto.subtle.importKey(
"raw",
// lengthBits === 256 ? hashedKey : hashedKey.slice(0, lengthBits / 8),
hashedKey,
{ name: "AES-GCM" },
false,
["encrypt", "decrypt"]
);
}
function stringToBytes(str) {
const encoder = new TextEncoder(); // 默认使用 UTF-8 编码
return encoder.encode(str);
}
function adjustKeyLength(keyBytes, requiredLength) {
if (keyBytes.length === requiredLength) {
return keyBytes;
} const adjustedKey = new Uint8Array(requiredLength);
if (keyBytes.length < requiredLength) {
// 填充
adjustedKey.set(keyBytes);
for (let i = keyBytes.length; i < requiredLength; i++) {
adjustedKey[i] = 0; // 用 0 填充
}
} else {
// 截断
for (let i = 0; i < requiredLength; i++) {
adjustedKey[i] = keyBytes[i];
}
}
return adjustedKey;
}
async function encryptText(text, keyMaterial, keyLengthBits) {
const key = await deriveKeyFromMaterial(keyMaterial, keyLengthBits);
// 生成IV
const iv = crypto.getRandomValues(new Uint8Array(12)); // GCM模式推荐使用12字节IV // 加密数据
const encoder = new TextEncoder();
const encryptedData = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv,
},
key,
encoder.encode(text)
); // 将IV和加密后的数据拼接起来
const combined = new Uint8Array(iv.length + encryptedData.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encryptedData), iv.length); // 将结果编码为Base64字符串
return btoa(String.fromCharCode.apply(null, combined));
}
async function decryptText(encryptedBase64, keyMaterial, keyLengthBits) {
// 将Base64字符串转换为Uint8Array
const binaryString = atob(encryptedBase64);
const combined = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
combined[i] = binaryString.charCodeAt(i);
} // 提取IV
const iv = combined.slice(0, 12); // 提取加密数据
const encryptedBytes = combined.slice(12); // 导入密钥材料(需要确保这个密钥与Java端使用的是一样的)
const key = await deriveKeyFromMaterial(keyMaterial, keyLengthBits); try {
// 解密数据
const decryptedData = await crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: iv,
},
key,
encryptedBytes
); // 将解密后的数据转换为字符串
const decoder = new TextDecoder();
return decoder.decode(decryptedData);
} catch (error) {
console.error("Decryption failed:", error);
throw error;
}
} const keyMaterial = "_aes_secret_key_"; // 确保这与Java端的密钥一致
const textToEncrypt = "admsdsdin"; encryptText(textToEncrypt, keyMaterial).then((encrypted) => {
console.log("Encrypted:", encrypted);
decryptText(encrypted, keyMaterial).then((decrypted) => {
console.log("Decrypted:", decrypted);
});
});

自己封装下AES_GCM加密的更多相关文章

  1. python下RSA加密解密以及跨平台问题

    Reference:  http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...

  2. PHP.TP框架下商品项目的优化3-php封装下拉框函数

    php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...

  3. 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...

  4. 痞子衡嵌入式:FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败问题. 本篇是<系统时钟配置不当会导致i.MXRT1xxx ...

  5. windows下OpenSSL加密证书安装步骤与使用方法

    OpenSSL加密证书一般用于签名认证,含私钥和公钥.在Linux系统中,OpenSSL一般是已经安装好了,可以直接使用.而在Windows系统中,是需要安装使用的. 最近在使用支付平台时,用到了Op ...

  6. .NET下的加密解密大全(3):非对称加密

    本博文列出了.NET下常用的非对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. RSA[csharp]static string EnRSA(string data,string pub ...

  7. .NET下的加密解密大全(2):对称加密

    本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. 公共代码[csharp]static byte[] CreateKey(int num) {     byt ...

  8. .NET下的加密解密大全(1): 哈希加密

    .NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家有所帮助. MD5[csharp]using System; using Sy ...

  9. 关于Objective-c和Java下DES加密保持一致的方式

    转载自:http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html 最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才 ...

  10. 路由器基础配置之ppp封装下的pap,chap认证

    我们将以上面的拓扑图完成本次实验,路由器的默认封装为HDLC,要求为把路由器全被更改为ppp封装,并在router3与router4之间用pap认证,在router4与router5之间用chap认证 ...

随机推荐

  1. UI上将BP附件放到BP结果中

    1,取附件内容放到新增的字段里 METHOD get_attachment. DATA: current TYPE REF TO if_bol_bo_property_access. DATA: dr ...

  2. GAMES101作业3

    作业要求: 作业效果: 我们需要做的: 在rasterizer.cpp中修改: 函数rasterize_triangle(const Triangle& t) //实现与作业 2 类似的插值算 ...

  3. Kong入门学习实践(9)安全防护插件

    Kong的一大特色就在于强大的可扩展性,具体实现方式就是插件.一来Kong已经提供了很多内置的插件,二来我们也可以使用Lua语言自定义开发插件.今天,我们就来了解一些常用的安全防护插件. 关于安全防护 ...

  4. 一、trackingjs初体验-颜色捕获 vue3

    前言 Tracking.js 是一个独立的JavaScript库(不依赖于任何框架),用于跟踪从相机实时收到的数据. 跟踪的数据既可以是颜色,也可以是人, 也就是说我们可以通过检测到某特定颜色,或者检 ...

  5. 智力大冲浪 C++

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者 m 元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则 ...

  6. 调试栈 linux

    参考连接 bluez 中有对于backtrace 的使用.所以看了一下这篇文章比较好.转载了 参考:CSDN大牛

  7. AE 制作 音乐频谱

    简介 RT 参考链接 https://www.bilibili.com/video/BV1Xz4y197qP?from=search&seid=15972112592919808236

  8. lvs搭建LB

    一.LVS介绍 中国人发明的 1.工作模式 1.nat模式 网站服务器是私网的 2.DR模式 lvs服务器提供一个调度的功能 客户端发送个lvs服务器,然后将请求分发给后台服务器 然后后台服务器直接回 ...

  9. DotNetty 1.0 发布,希望不会太晚。

    一.前言 通过1个月修改,今天dotnetty 发布了1.0 版本,虽然不是官方发布,但是我把最大的问题内存泄漏修复了,运行了7个小时,同时直播推流三个通道内存稳定在55mb左右,cpu 稳定在0.4 ...

  10. 使用uint64_t批量比较短字符串

    记录一下从开源代码里学来的短字符串比较优化. 这个优化只适用于长度在八字节以下的字符串,且只适用于优化相等比较. 原理 想要判断字符串相等,常见的有利用strcmp.利用字符串的hash或者利用正则表 ...