javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密

deriveKey 方法的完整示例,演示如何使用 HMAC 作为密钥派生函数(KDF)来从一个给定的秘密(如密码)派生出一个新的 AES 加密密钥。

//创建一个函数来生成随机盐function getRandomSalt(length){let array=new Uint8Array(length);window.crypto.getRandomValues(array);return array;}//生成随机数字function randomFloat(){const fooArray=new Uint32Array(1);const maxUint32=0xFFFFFFFF;return crypto.getRandomValues(fooArray)[0];}//生成随机密码,导入密钥当中function getKeyMaterial(){//const password=window.prompt("请输入你的密码");//就是为加密时用密码//这里不用输入密码,我们采用随机生成的数字,这样可以增加破解难度,提升安全性const password=randomFloat();const enc=new TextEncoder();return window.crypto.subtle.importKey("raw",enc.encode(password),"PBKDF2",false,["deriveBits","deriveKey"]);}
//创建一个函数来派生密钥async function deriveAeskey(salt,info,keyLength){//生成已有密钥//不能直接用new Textcoder().encoder(password)这样来生成密码,必须用这个函数的importKey导入密钥才行const passwordBuffer=await getKeyMaterial();const derivedKey=await crypto.subtle.deriveKey({name:'PBKDF2',salt:salt,iterations:10000,hash:'SHA-256'},passwordBuffer,{name:'AES-GCM',length:keyLength},true,["encrypt","decrypt"]);return derivedKey;}//使用派生的密钥进行加密async function encryptData(derivedKey,dataToEncrypt){const encoder=new TextEncoder();const dataBuffer=encoder.encode(dataToEncrypt);const iv=window.crypto.getRandomValues(new Uint8Array(12));const encryption=await crypto.subtle.encrypt({name:'AES-GCM',iv:iv},derivedKey,dataBuffer);return {ciphertext:encryption,iv:Array.from(iv)}}//使用派生的密钥进行解密async function decryptData(derivedKey,ciphertext,iv){const decrypted=await crypto.subtle.decrypt({name:'AES-GCM',iv:new Uint8Array(iv)},derivedKey,ciphertext);const decoder=new TextDecoder();return decoder.decode(decrypted);}//最后把他们综合到一起,进行加密和解密,以及做加密后内容的演式(async function(){const salt=getRandomSalt(16);const info=new Uint8Array();const keyLength=256;try{//派生的密钥const derivedKey=await deriveAeskey(salt,info,keyLength);//需要加密的数据const dataToEncrypt="this is data";const {ciphertext,iv}=await encryptData(derivedKey,dataToEncrypt);//这里是演式你加密后的数据样式console.log(String.fromCharCode(...new Uint8Array(ciphertext)));//解密数据const decryptedData=await decryptData(derivedKey,ciphertext,iv);console.log('解密数据:',decryptedData);}catch(error){console.log('加解密时发生错误',error);}})();

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

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

相关文章

商城购物系统

下载在最后 技术栈: ssmmysqljsp 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

React基础教程:选项卡案例

文章目录 6.1 初始化选项卡6.2 数据请求+模糊搜索6.1 初始化选项卡 新建12-卖座位选项卡.js文件 通过判断当前的索引,来绑定className属性,进行选项卡激活的显示,如果当前的索引等于index,那么就绑定属性active className={this.state.current === index ? active : }i…

Hbase简介和快速入门

一 Hbase简介 1 HBase定义 Apache HBase™ 是以hdfs为数据存储的,一种分布式、可扩展的NoSQL数据库。 2 HBase数据模型 HBase的设计理念依据Google的BigTable论文,论文中对于数据模型的首句介绍。Bigtable 是一个稀疏的、分布式的、持久的多维排序map…

Idea常用快捷键:设置自动导包

Idea设置自动导包 【File】→【Setting】(或使用快捷键【Crlt Shift S】)打开Setting设置。点击【Editor】→【General】→【Auto Import】。勾选自定导包的选项,并确定,如下: Addunambiguousimportsonthefly:添加明确的导入 …

【边缘计算与IoT】边缘计算的概念和在IoT中的应用

边缘计算与IoT:边缘计算的概念和在IoT中的应用 目录 引言边缘计算的概念 什么是边缘计算边缘计算的工作原理 边缘计算的优势 低延迟带宽优化数据隐私和安全高可靠性 边缘计算在IoT中的应用 智能家居工业自动化智慧城市医疗健康 边缘计算的技术挑战 计算资源限制数…

PHP完整表单实例

在PHP中创建一个完整的表单实例涉及多个步骤,包括设计HTML表单、处理表单提交、验证用户输入以及(可选地)将数据存储到数据库。以下是一个详细的教程,指导你完成整个过程。 第一步:设计HTML表单 首先,你需…

长上下文语言模型与RAPTOR 方法

在科技领域的前沿,长上下文语言模型(Long Context LLMs)和新兴检索方法如RAPTOR 正在引发广泛关注。本文将围绕这些技术展开讨论,并探讨它们在实际应用中的创新性和科技性。 长上下文语言模型的崛起 近几周来,随着新型…

在Windows中使用命令行将文件夹内txt文件合并成一个

打开命令提示符窗口导航到包含要合并的TXT文档的文件夹中。命令示例:cd C:\MyFiles在命令提示符窗口中键入以下命令:copy *.txt combined.txt按Enter键运行该命令。所有.TXT文档将合并到名为“Combined.TXT”的新文件中。

基于springboot+vue+uniapp的戏曲文化苑小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

判断一个变量是数组还是对象

很多人看到标题就会想到使用typeof运算符,但是实际上有些它判断不了 var a [1,2,3] console.log(typeof a) // "object"//总结: typeof运算符并不能直接判断一个变量是对象还是数组, //实际上,typeof运算符在判断基本…

Java两表查询的方法(一对一,一对多,多对多)

一、配置环境&#xff1a; 首先我们需要Maven环境; 源码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…

vue-router小结

1.什么是vue-router vue-router是vue.js官方给出的路由解决方案&#xff0c;只能结合vue项目进行使用&#xff0c;能够轻松的管理SPA项目中组件的切换 2.vue-router的用法 先安装vue-router &#xff08;npm i vue-router&#xff09; 在新建router/index.js 文件,在文件内导…

yandex图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex图标点选验证码如下: 使用过yolov8的小伙伴可能都知道,这种直接打个标注,基本上就可以了,至于问题图片由于不能很好的切割做分类,所以干脆也做成目标…

探索更高效的语言模型提示-Anthropic的元提示工具

中午看到一个视频 视频地址&#xff1a; https://youtu.be/Evg4HXvsYVY?siWZLYw7lYPXttHUyw 该视频介绍了Anthropic的元提示工具&#xff0c;可以帮助用户更好地使用他们的语言模型&#xff0c;并提供了示例和指导。该工具可用于创建更好的提示&#xff0c;从而获得更具体和…

基于图卷积神经网络(GCN)的高光谱图像分类详细教程(含python代码)

目录 一、背景 二、基于卷积神经网络的代码实现 1、安装依赖库 2、建立图卷积神经网络 3、建立数据的边 4、训练模型 5、可视化 三、项目代码 一、背景 图卷积神经网络&#xff08;Graph Convolutional Networks, GCNs&#xff09;在高光谱图像分类中是一种有效的方法…

CSS实现文本溢出处理

1.单行文本溢出 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

Dependency Injection: 如何解决依赖注入失败问题

Dependency Injection: 如何解决依赖注入失败问题 &#x1f489; **Dependency Injection: 如何解决依赖注入失败问题 &#x1f489;**摘要引言正文内容1. 依赖注入的基础概念代码示例&#xff1a;构造函数注入 2. 依赖注入失败的常见原因2.1 未能找到依赖的实例2.2 循环依赖2.…

Gogs搭建免费好用的Git服务器

1、说明 代码托管系统是开发中一个不可缺少的工具&#xff0c;通过代码托管系统可以方便协同开发&#xff0c;代码权限控制&#xff0c;代码异地灾备、版本管理、问题跟踪、项目文档管理等等项目管理所必须的工具。在项目的任何一个过程中&#xff0c;代码托管系统始终有着重要…

Axios的几种不同的responseType处理响应,以及blob与arraybuffer的解析

在使用 Axios 时&#xff0c;你可以通过设置 responseType 选项来指定如何处理响应数据。Axios 提供了几种不同的 responseType 选项&#xff0c;每种选项都会影响响应数据的格式。 以下是这些选项及其示例&#xff1a; 1. responseType: json 这是默认选项&#xff0c;表示…

App测试分发的秘密:如何让你的应用程序快速上线

App测试分发的重要性 在移动应用程序的开发过程中&#xff0c;测试分发是一个非常重要的环节。它可以帮助开发者快速地将应用程序推广到目标用户手中&#xff0c;收集反馈&#xff0c;进行bug修复和优化&#xff0c;从而提高应用程序的质量和用户体验。但是&#xff0c;测试分…