使用 WebCrypto API 生成 RSA 密钥对并使用密码保护它

2024-02-26

标题说明了一切。我想知道如何使用 WebCrypto API 生成 RSA 密钥对,以及如何使用密码保护它,以便将其存储在数据库中。


You can 使用 WebCrypto 生成 RSA 密钥对并将其导出如 jwk(Json Web 密钥)、pkcs#8(私有)或 spki(公共)。看SubtleCrypto.exportKey() https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey和下面的示例代码

要将密钥以受保护的方式导出到外部系统,您可以使用如下标准:

  • PKCS#8:PKCS#8 私钥格式定义于IETF 公钥密码标准加密#8。 https://www.rfc-editor.org/rfc/rfc5208#page-4允许使用密码进行加密,但 WebCryptography exportKey 不支持它。它提供了 PrivateKeyInfo

  • PKCS#12:PKCS#12 是一种密钥库交换格式。它可以包含私钥、带有公钥的证书和认证链。内容使用密码进行 3DES 加密。文件通常带有扩展名 .pfx 或 .p12

很遗憾WebCrypto 不支持以加密的通用格式导出例如PKCS#8- 加密或PKCS#12。您可以使用第三方库以其中一种格式导出密钥,例如forge https://github.com/digitalbazaar/forge

示例代码

WebCrypto RSASSA-PKCS1-v1_5 - 生成密钥

window.crypto.subtle.generateKey(
    {
        name: "RSASSA-PKCS1-v1_5",
        modulusLength: 2048, //can be 1024, 2048, or 4096
        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
        hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
    },
    true, //whether the key is extractable (i.e. can be used in exportKey)
    ["sign", "verify"] //can be any combination of "sign" and "verify"
)
.then(function(key){
    //returns a keypair object
    console.log(key);
    console.log(key.publicKey);
    console.log(key.privateKey);
})
.catch(function(err){
    console.error(err);
});

WebCrypto RSASSA-PKCS1-v1_5 - 导出密钥

window.crypto.subtle.exportKey(
    "pkcs8", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only)
    privateKey //can be a publicKey or privateKey, as long as extractable was true
)
.then(function(keydata){
    //returns the exported key data
    console.log(keydata);
})
.catch(function(err){
    console.error(err);
});

Forge -PKCS#8 https://github.com/digitalbazaar/forge#pkcs8

//needed: wrap webcrypto pkcs#8 to forge privateKey (see doc)

// encrypts a PrivateKeyInfo and outputs an EncryptedPrivateKeyInfo
var encryptedPrivateKeyInfo = pki.encryptPrivateKeyInfo(
  privateKeyInfo, 'password', {
    algorithm: 'aes256', // 'aes128', 'aes192', 'aes256', '3des'
  });

// 将 EncryptedPrivateKeyInfo 转换为 PEM var pem = pki.encryptedPrivateKeyToPem(encryptedPrivateKeyInfo);

Forge - PKCS#12 https://github.com/digitalbazaar/forge#pkcs12

//needed: wrap webcrypto pkcs#8 to forge privateKey (see doc)

// generate a p12 that can be imported by Chrome/Firefox
// (requires the use of Triple DES instead of AES)
var p12Asn1 = forge.pkcs12.toPkcs12Asn1(privateKey, certChain, password,  {algorithm: '3des'});

// base64-encode p12
var p12Der = forge.asn1.toDer(p12Asn1).getBytes();
var p12b64 = forge.util.encode64(p12Der);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 WebCrypto API 生成 RSA 密钥对并使用密码保护它 的相关文章

  • Angular UI 模式的范围问题

    我无法理解 使用角度 UI 模式的范围 虽然这里不是很明显 但我已经正确设置了模块和所有内容 据我所知 但这些代码示例尤其是我发现错误的地方 index html 其中重要部分 div class btn group div
  • Jquery 悬停卡

    我在用着http designwithpc com Plugins Hovercard http designwithpc com Plugins Hovercard 但我不知道如何在悬停卡上声明 var 每个工作描述都有自己的 ID 当悬
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • Vaadin 12 将对象传递给 JavaScript 函数:无法对类进行编码

    Vaadin 12 Kotlin 项目 In my myPage html我有JavaScript myObject redirectToCheckout sessionId 1111 2222 所以我需要调用javaScript函数red
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • 使用 PHP 的 openssl_pkcs7_sign 签署 pdf 时出错

    我正在使用 TCPDF 生成 pdf 文档并对其进行签名 TCPDF 本身只是调用 PHP 的openssl pkcs7 sign函数 在我看来 它正在调用 C 的PKCS7 sign函数基于源代码 https github com php
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 在 XMLHttpRequest 中设置 Authorization 标头会更改 HTTP 动词

    今天我发现 XMLHttpRequest 的一个奇怪的行为 当我调用 GET 服务时 我发现如果我不设置授权标头 来自 Firefox 的请求是相同的 但是 如果我添加 Authorization 标头 Firefox 首先发送带有 OPT
  • IPython 笔记本在终端中显示输出

    我正在使用 IPython 笔记本 ipython notebook 但是当我尝试通过简单地给出变量名称并按 Shift Enter 来打印某些内容以获取任何输出时 而不是在笔记本 单元格旁边 中获取输出 我会在终端中启动它笔记本 我想查看
  • 在C中,只有一个元素的数组初始化是否经过特殊处理?

    在读的时候这个问题 https stackoverflow com questions 8060931 append to the beginning of an array 8061034 8061034我想测试 GCC 中的输入 看看会
  • clang 使用了错误的系统包含目录

    我的工作站是 RHEL 6 5 预装了 gcc 4 4 7 我们正在进行 C 11 工作 因此我们购买了 RedHat Developer s Toolset 存储库集 其中包括 G 4 8 2 这台机器上安装了两个版本的 G 但 4 8
  • 从可穿戴设备发送消息到手机,然后立即回复

    我今天一整天都在与 Android Wear Message API 作斗争 最终接受了我需要一些帮助 我的应用程序非常简单 移动部分由一个 MainActivity 除了显示 Hello world 之外什么也不做 和一个扩展服务组成可穿
  • 为什么不调用 doOnDispose?

    当创建这样的 Observable 时 public void foo Observable observable Observable fromCallable gt bar return doOnSubscribe disposable
  • 将片段中的文本提供给自定义 TextView

    如何在自定义 TextView 中设置构造函数以便能够从片段传递文本 换句话说 我很困惑如何将文本从我的片段 Fragment1 发送到自定义视图 View1 public class View1 extends TextView cons
  • 如何向 PWA 标题栏添加返回和刷新按钮

    我正在编写一个 PWA 应用程序 我想要的是back and refresh标题栏上的按钮 但我什么也没得到 更新 按钮应该由浏览器控制 而不是我的用户界面 The display清单文件中的属性必须是fullscreen or stand
  • 正则表达式随 Pip 安装但无法识别

    所以我尝试使用正则表达式解析文件中的数据 我已经成功安装了正则表达式 pip install regex Requirement already satisfied regex in usr local lib python3 8 site
  • Python/OpenCV — 匹配两幅图像中细菌的质心点

    我正在研究一种使用计算机视觉来匹配细菌质心的算法 由于我是计算机视觉的本科生和初学者 因此我没有专门针对此问题的代码 只是为了提供一些背景知识 我在 GUI 中使用了以下函数 bact 变量是指 Bacteria 对象 它存储每个细菌的 I
  • 如何在 php-cs-fixer 中使用其他文件扩展名,例如 .ctp?

    如何在 php cs fixer 中使用其他文件扩展名 例如 cakephp 模板 ctp 文件 我尝试过这段代码
  • Javascript 日期为该月的第二个星期一

    我正在与一个在每月第二个星期一开会的小组合作 他们希望他们的网站能够反映下一次会议的日期 我有本月第二个星期一显示的脚本 但我在使用 if else 语句时遇到了问题 我需要它来反映下一个即将发生的事件 而不仅仅是本月的日期 IE 本月的活
  • BlackBerry SQLite 数据库创建:“文件系统未就绪”

    我的应用程序从服务器获取数据并将其保存到 SQLite 数据库中 这在 9550 中工作得很好 黑莓风暴2 http en wikipedia org wiki BlackBerry Storm 2 模拟器 但是当我在任何其他模拟器中运行它
  • 如何解决“java.lang.OutOfMemoryError:超出GC开销限制”

    I read 这个堆栈溢出页面 https stackoverflow com questions 1393486 what does the error message java lang outofmemoryerror gc over
  • 将自定义 WSDL 绑定到现有 WCF 服务

    我使用 WCF 创建了一个 Web 服务 我不知道如何通过数据契约在 WSDL XSD 中设置约束和限制 如果我使用约束改进 XSD2 架构 然后将此自定义架构绑定到现有服务会怎样 如果是这样 我怎样才能使服务公开改进的 WSDL 否则 还
  • R按组计数元素的出现次数[重复]

    这个问题在这里已经有答案了 计算每个组中向量或数据帧上元素出现次数的最简单方法是什么 我的意思并不是只计算总数 正如其他 stackoverflow 问题所要求的那样 而是为每个连续发生的事件提供不同的数字 例如对于这个简单的数据框 但我将
  • jQuery Sortable - 拖放多个项目

    我有以下代码 它允许用户从一个列表拖放到另一个列表 现在 我如何允许用户选择并拖放多个项目 像这样的东西吗 http jsfiddle net T68Fn http jsfiddle net T68Fn 我尝试将 jsfiddle 中的代码
  • 用于 ASP.NET Core 应用程序生产的 Kestrel 准备好了吗?

    我有一个在 asp net core 2 0 中开发的角度应用程序使用的 api 它已部署在 IIS 中并配置为使用 kestrel 我读到 Kestrel 在公开公开应用程序时并不安全等等 真的吗 Kestrel 还没有准备好用于生产吗
  • C++ 正则表达式解析嵌套结构

    我有一个永久格式如下的字符串 First nested string Second nested string 嵌套可以是任意深度 每个子元素都采用右大括号的格式 在上一层嵌套和右大括号的基础上添加两个空格 我想接收允许获取嵌套数据的正则表
  • 使用 WebCrypto API 生成 RSA 密钥对并使用密码保护它

    标题说明了一切 我想知道如何使用 WebCrypto API 生成 RSA 密钥对 以及如何使用密码保护它 以便将其存储在数据库中 You can 使用 WebCrypto 生成 RSA 密钥对并将其导出如 jwk Json Web 密钥