浏览器内使用JS和椭圆曲线密钥交换

devtools/2024/9/20 7:27:45/ 标签: javascript, 前端, 即时通信, 密钥交换

源码:
 

之前使用GO已经可以实现秘钥交换了,这里使用浏览器发送数据,与后端服务实现秘钥交换,记录一下实现的基本函数:

javascript">// 生成密钥对,并保存到全局变量中async function createDHPair() {// 生成新的ECDH密钥对const keyPair = await window.crypto.subtle.generateKey({name: "ECDH",namedCurve: "P-256"},true, // 允许导出私钥["deriveKey", "deriveBits"] // 导出私钥的权限);return keyPair;};async function getPublicKey(keyPair) {const publicKey = await crypto.subtle.exportKey("spki", keyPair.publicKey);return publicKey;}async function getPublicKeyRaw(keyPair) {const publicKey = await crypto.subtle.exportKey("raw", keyPair.publicKey);return publicKey;}// async function getPrivateKey(keyPair) {//     const publicKey = await crypto.subtle.exportKey("pkcs8", keyPair.publicKey);//     return publicKey;// }async function calculateSharedSecret(privateKey, publicKey) {// 执行Diffie-Hellman密钥交换以计算共享密钥const sharedSecret = await window.crypto.subtle.deriveBits({name: "ECDH",namedCurve: "P-256",public: publicKey // 使用对方的公钥},privateKey, // 使用自己的私钥256,);return new Uint8Array(sharedSecret);}

getPublicKeyRaw 函数使用了 crypto.subtle.exportKey 方法来将公钥导出为原始数据格式。这里的 "raw" 参数指示将密钥导出为原始字节序列。

与之相比,通常使用的其他导出类型包括 "spki"(SubjectPublicKeyInfo)和 "pkcs8"(Private-Key Information Syntax Standard #8)。这两种类型是 ASN.1 格式的密钥编码格式,用于在不同系统之间交换和存储密钥。"spki" 用于导出公钥,"pkcs8" 用于导出私钥。

区别在于:

  1. "raw" 格式:将密钥直接导出为原始的字节序列,没有进行任何格式化。这种格式可能比较简单,但也更加直接。

  2. "spki" 格式:导出的是 SubjectPublicKeyInfo 结构,包含了公钥的算法标识和公钥本身。这种格式通常用于在 X.509 证书中传输和存储公钥。

  3. "pkcs8" 格式:导出的是 Private-Key Information Syntax Standard #8 结构,包含了私钥的算法标识和私钥本身。这种格式通常用于在 PKCS#8 格式的私钥文件中存储私钥。

测试的代码如下:

async function test1(){const keyPair1 = await createDHPair();const keyPair2 = await createDHPair();console.log("s1:", keyPair1);console.log("s2:", keyPair2);const publicKey1 = await getPublicKey(keyPair1);const publicKey2 = await getPublicKey(keyPair2);console.log("public1:", publicKey1);console.log("public2:", publicKey2);const publicKey11 = await getPublicKeyRaw(keyPair1);console.log("public1:", publicKey11);// const privateKey1 = await getPrivateKey(keyPair1);// const privateKey2 = await getPrivateKey(keyPair2);//// console.log("private1:", privateKey1);// console.log("private2:", privateKey2);// 计算共享密钥const sharedSecret1 = await calculateSharedSecret(keyPair1.privateKey, keyPair2.publicKey);const sharedSecret2 = await calculateSharedSecret(keyPair2.privateKey, keyPair1.publicKey);// sharedSecret1 和 sharedSecret2 应该是相同的(如果计算正确的话)console.log("Shared secret 1:", sharedSecret1);console.log("Shared secret 2:", sharedSecret2);}

备注:

1)公钥可以导出,私钥不允许导出,所以只能生成秘钥之后,保存共享密钥,用指纹来标记;

2)具体的使用raw导出无法与GO等交互,需要按照标准约定来导出和导入,也就是spki方式;

具体能用的代码参考项目文件。https://github.com/robinfoxnan/BirdTalkServer/blob/main/server/js/wsclient.js


http://www.ppmy.cn/devtools/5307.html

相关文章

“手撕“三大特性之一的<继承>(上)

目录 一、为什么需要继承 二、什么是继承 三、继承怎么写 四、成员的访问 1.父类与子类的成员变量不同名 2.父类与子类的成员变量同名 3.父类与子类的成员方法不同名 4.父类与子类的成员方法同名 五、super关键字 一、为什么需要继承 先让我们看一段Java代码&#…

Android Studio历史版本下载地址

https://developer.android.com/studio/archive?hlzh-cn https://blog.csdn.net/crasowas/article/details/130304836

蛋白质致病突变的计算方法(二)

(继续上一篇) 2 致病和中性突变数据库 高通量和低成本的DNA测序技术有助于积累(accumulate)大规模突变数据,并且,各种生物数据库在文献中已经被报道。这些数据库存在一些优势特性,结构化存储、…

MySQL数据加密,模糊查询

实现配置文件加密,数据库敏感字段加密,加密字段模糊查询 配置文件加密使用Jasypt。数据库加密解密方法自己用java实现mysql的aes_encrypt和aes_decrypt方法,查询时先用mysql的解密方法aes_decrypt把加密字段解密再用like查。 配置文件加密参…

Leetcode 4. 寻找两个正序数组的中位数

心路历程: 这道题暴力解很简单,一看到要求O(log(mn))的复杂度就只能是双指针,但是实测发现这道题用归并排序更快。这可能就是平均复杂度和实际复杂度的Gap吧。 二分法的思路: 要找到第 k (k>1) 小的元素,那么就取…

React + Ts + Vite + Antd 项目搭建

1、创建项目 npm create vite 项目名称 选择 react 选择 typescript 关闭严格模式 建议关闭严格模式,因为不能自动检测副作用,有意双重调用。将严格模式注释即可。 2、配置sass npm install sass 更换所有后缀css为sass vite.config.ts中注册全局样式 /…

windows命令行安装工具/包/软件后,命令行命令找不到(npm示例)

问题描述 在命令行安装工具,比如npm install, 或者windows自带的包管理工具,如Chocolatey,Scoop,WinGet等,安装软件后,然后直接在命令行运行上面安装的指令会提示命令找不到。这让经常使用linux&#xff0…

scss 和css 的区别 scss变量和css变量的区别

scss 和 css 的区别 语法差异: CSS 使用大括号 {} 和分号 ; 来定义样式规则和属性。SCSS 使用了 Sass 的语法,它允许使用类似编程语言的结构,如变量、嵌套规则、混合(mixins)和继承等。 嵌套规则: 在 SCSS …

【Java基础】14.正则表达式

文章目录 前言一、java.util.regex 包二、语法三、步骤四、Pattern类与Matcher类1.matches( )2.split( )3.find( )4.group5.start( )和end( )6.replace替换7.reset( ) 五、正则表达式的应用1.校验:手机号码2.校验:电子邮箱3.校验:身份证号实例…

stm32实现hid键盘

前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码: 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…

面向对象设计模式之概念

设计模式系列的观点结合了《HeadFirst设计模式》(中文版)以及《设计模式:可复用面向对象软件的基础》两本书的知识,以及Sunny(刘伟)的博客 《HeadFirst设计模式》(中文版): 百度网盘链接:https://pan.baidu.com/s/1osvnUGZZREm8Jb…

PgSQL之WITH Queries/Statement

PostgreSQL WITH 子句 在 PostgreSQL 中,WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。这些语句通常称为通用表表达式(Common Table Express…

ABAP 导出数据到EXCEL ,OLE

结果: 代码: "导出EXCEL,OLE TYPE-POOLS:OLE2. DATA: GS_EXCEL TYPE OLE2_OBJECT , GS_WBOOKLIST TYPE OLE2_OBJECT , GS_APPLICATION TYPE OLE2_OBJECT , GS_WBOOK TYPE OLE2_OBJECT , GS_ACTIVESHEET TYPE OLE2_O…

NLP_知识图谱_介绍、构建、问答知识

文章目录 知识图谱的介绍图图能做些什么任务基于图的推荐系统图的一些基本概念与表述有向图与无向图节点的度节点的边的数量有向图又分为入度和出度 什么是知识图谱知识图谱属于异质图知识图谱的schema知识图谱的应用场景 知识图谱的构建三元组如何构建知识图谱构建知识图谱通常…

如何使用jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

《ElementPlus 与 ElementUI 差异集合》el-popconfirm 气泡确认框之插槽写法有差异

ElementUI 直接在 el-button 上配置属性 slot&#xff1b; <el-popconfirm title"确定删除吗&#xff1f;请谨慎操作&#xff01;" confirm"delete"><el-button slot"reference" size"small" type"danger">删…

javase__进阶 day13stream流和方法引用

1.不可变集合 1.1 什么是不可变集合 ​ 是一个长度不可变&#xff0c;内容也无法修改的集合 1.2 使用场景 ​ 如果某个数据不能被修改&#xff0c;把它防御性地拷贝到不可变集合中是个很好的实践。 ​ 当集合对象被不可信的库调用时&#xff0c;不可变形式是安全的。 简单…

网卡接收数据的关键过程

网卡接收数据的关键过程 网卡中断处理网络软中断处理协议栈处理传输层处理 Linux内核tracers的实现原理与应用 前年ftrace for io /去年ftrace for mm/今年ftrace for network.今年ftrace也被深度定制加强。 在这篇文章中,我们将深入探讨网卡接收数据的完整过程,了解数据是如何…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

基于springboot的高校学科竞赛平台源码数据库

基于springboot的高校学科竞赛平台源码数据库 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了高校学科竞赛平台的开发全过程。通过分析高校学科竞赛平台管理的不足&#xff0c;创建了一个计算机管理高校学科…