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

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);}})();

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • git--本地仓库修改同步到远程仓库
  • 基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
  • SPSS个人版是什么软件
  • qt--做一个拷贝文件器
  • 深入理解Spring依赖注入与生命周期管理
  • 取消Idea文件夹的自动合并操作!
  • Unity C#底层原理(二)
  • 【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’
  • Tomcat响应数据过程
  • 背单词工具(C++)
  • stm32番外-----0.96寸OLED播放电影《你的名字》
  • vue、react前端框架实现TodoList页面案例
  • HTTP模块(二)
  • “论大数据处理架构及其应用”写作框架,软考高级论文,系统架构设计师论文
  • HTML常见标签——超链接a标签
  • 0x05 Python数据分析,Anaconda八斩刀
  • HashMap剖析之内部结构
  • js如何打印object对象
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React+TypeScript入门
  • Service Worker
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 程序员最讨厌的9句话,你可有补充?
  • 基于游标的分页接口实现
  • 聊聊redis的数据结构的应用
  • 前嗅ForeSpider教程:创建模板
  • 深度解析利用ES6进行Promise封装总结
  • 中文输入法与React文本输入框的问题与解决方案
  • 走向全栈之MongoDB的使用
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ArcGIS Pro 如何批量删除字段
  • ​iOS实时查看App运行日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # centos7下FFmpeg环境部署记录
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $ git push -u origin master 推送到远程库出错
  • (7) cmake 编译C++程序(二)
  • (C语言)fgets与fputs函数详解
  • (web自动化测试+python)1
  • (八)c52学习之旅-中断实验
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (黑马C++)L06 重载与继承
  • (转载)(官方)UE4--图像编程----着色器开发
  • .ai域名是什么后缀?
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 8.0 发布到 IIS
  • .NET CORE Aws S3 使用
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Remoting学习笔记(三)信道
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net6Api后台+uniapp导出Excel
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @cacheable 是否缓存成功_Spring Cache缓存注解