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

源码:
 

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

// 生成密钥对,并保存到全局变量中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.mzph.cn/news/822574.shtml

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

相关文章

vue3 源码解析(7)— diff 算法源码的实现

前言 vue3 采用的 diff 算法名为快速 diff 算法,整个 diff 的过程分为以下5个阶段完成。 处理前置节点处理后置节点处理仅有新增节点处理仅有删除节点处理其他情况(新增 / 卸载 / 移动) 这里我们先定义新旧两个节点列表,接下来…

数据结构速成--栈

由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 目录 一…

JavaWeb--前端--03Vue入门

Vue入门 1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 1 Vue概述 个完整的html页面包括了视图和数据,数据是通过请求 从后台获取的,那么意味着我们需要将后台获取到的数据呈现到页面上&#…

多数之和算法题总结(二十三天)

1. 两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你…

RDP连接Ubuntu远程桌面

之前一直用vncviewer,效果不佳,Microsoft Remote Desktop连ubuntu上的win虚机很好,多了几个工作环境,于是再度试一下用RDP连Ubuntu远程桌面。 几点注意事项 先安装xrdp: apt install xrdp 踢掉ubuntu上的登录用户,例…

OSPF - 链路状态路由协议

IGP 外部网关路由协议: OSPF , IS-IS EGP 内部网关路由协议: BGP 协议算法: 距离矢量路由协议 链路状态路由协议 lsdb:链路状态数据库 - 存放lsa的地址 RIP:有方向的矢量,距离矢量路由协议&#xf…

PHP-extract变量覆盖

[题目信息]: 题目名称题目难度PHP-extract变量覆盖1 [题目考点]: 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有:$$&#x…

最前沿・量子退火建模方法(2) : Domain wall encoding讲解和python实现

前言 上篇讲的subQUBO属于方法论,这次讲个通过编码量子比特的方式,同样的约束条件,不同的编码,所需的量子比特数是不同的。有的编码方式,很节省量子比特。比如,这次要讲的Domain wall encoding。 一、Doma…

Vue.js前端开发零基础教学(六)

学习目标 了解什么是路由,能够说出前端后端路由的原理 掌握多种路由的使用方法,能够实现路由的不同功能 掌握Vue Router的安装及基本使用方法 5.1 初始路由 提到路由(Route),一般我们会联想到网络中常见的路由器(Router),…

CSS3 max/min-content及fit-content、fill-available值的详解

c3中对width的值多了几个值&#xff1a;fill-available, max-content, min-content, 以及fit-content。 1.width:fill-available 我们在页面中扔一个没有其他样式的<div>元素&#xff0c;则&#xff0c;此时&#xff0c;该<div>元素的width表现就是fill-availabl…

杰理-701-更换字库

杰里-701-更换字库显示 工具&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1yMDatiRCaJj2ioKXF-H8GQ 把使用的字库文件放进该目录下 生成后的字库文件需要修改名称 把修改好名称的字库文件放到该目录下替换 代码,把所有语言的PIX修改未新替换的字库文件&#xff08;保…

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法。以下是一般而言的目标检测实现步骤&#xff1a; 1、数据收集与标注&#xff1a;首先需要收集包含目标物体的大量图像数据&#xff0c;并对这些图像进行标注&#xff0c;标注出目标物体的位置和类别信息。这些…

字符串算法题(第二十四天)

344. 反转字符串 题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1…

富 格 林:策划安全方案阻挠受害

富 格 林指出&#xff0c;现货黄金作为一种全球性的投资产品&#xff0c;以其独特的价值储存功能和风险对冲能力&#xff0c;成为了许多投资者的首选投资项目。但是&#xff0c;如何在这复杂的投资市场中阻挠受害实现安全交易成为了大家的难题。下面富 格 林将提供一些基本的做…

一篇安装配置ubuntu22.04(步骤详细,配置成功)

一篇配置ubuntu22.04(步骤详细&#xff0c;配置成功) 官网下载相应的镜像 vitualbox安装ubuntu 新建虚拟机 第一步 第二步 第三步、按需分配内存、处理器个数、磁盘大小 第四步、一直下一步直至完成 配置虚拟机网络 第一步、先停止虚拟机 第二步、设置虚拟机网络 正常启…

【C++】一篇文章带你深入了解vector

目录 一、vector的介绍二、 标准库中的vector2.1 vector的常见接口说明2.1.1 vector对象的常见构造2.1.1.1 [无参构造函数](https://legacy.cplusplus.com/reference/vector/vector/vector/)2.1.1.2 [有参构造函数&#xff08;构造并初始化n个val&#xff09;](https://legacy.…

深度学习torch+cuda+torchvison+torchaudio版本匹配

官网版本&#xff1a;https://pytorch.org/get-started/previous-versions/ 还是在官网找好&#xff0c;再安装下载&#xff0c;否则&#xff0c;费时费力。 torch-2.1.0cu121-cp38-cp38-win_amd64.whltorchvision0.16.0torchaudio2.1.0 torch-1.8.0cu111-cp38-cp38-win_amd64.…

Advanced RAG 03:运用 RAGAs 与 LlamaIndex 评估 RAG 应用

编者按&#xff1a;目前&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术已经广泛使用于各种大模型应用场景。然而&#xff0c;如何准确评估 RAG 系统的性能和效果&#xff0c;一直是业界和学界共同关注的重点问题。若无法…

NASA数据集——ACEPOL气溶胶对气候和空气质量的影响,测量气溶胶的化学成分、粒度分布、高度剖面和光学特性

ACEPOL_AircraftRemoteSensing_RSP_Data 简介 ACEPOL 研究扫描偏振计&#xff08;RSP&#xff09;遥感数据&#xff08;ACEPOL_AircraftRemoteSensing_RSP_Data&#xff09;是在 ACEPOL 期间由 ER-2 上的研究扫描偏振计&#xff08;RSP&#xff09;收集的遥感测量数据。为了更…