在 Chromium 中使用 WebCrypto 生成 RSA 密钥对

2023-12-25

以下代码适用于 Firefox 76.0.1:

"use strict"
let RSAKeys
(async () => {
  RSAKeys = await crypto.subtle.generateKey({
      name: "RSA-OAEP",
      modulusLength: 3072,
      publicExponent: new Uint8Array([1, 0, 1]),
      hash: "SHA-256"},
    true,
// Chromium bug causes it to falsely complain that the array is empty. Sometimes adding "encrypt" helps.
    ["wrapKey"])
})()

但在 Chromium 80 中我得到:

未捕获(承诺中)DOMException:创建密钥时用法不能为空。

["wrapKey"]显然不是一个空数组,所以这似乎是一个浏览器错误。大概。你可否确认?更重要的是,您知道解决方法吗? (添加encrypt使用有帮助,但只是第一次,然后出现同样的错误。)它必须是支持包装密钥的非对称密码。根据表中规范的相关章节 https://www.w3.org/TR/WebCryptoAPI/#algorithm-overview,RSA-OAEP是唯一的可能。


我可以在以下位置重现该问题Chromium版本85.0.4162.0:密钥用法["wrapKey"]生成发布的错误消息。但我无法重现添加密钥用法encrypt (i.e. ["wrapKey", "encrypt"])解决了问题(甚至不是第一次)。但是,随着密钥用法的增加解包密钥 (i.e. ["wrapKey", "unwrapKey"])错误不再发生。

SubtleCrypto.generateKey() https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey返回一个CryptoKeyPair https://developer.mozilla.org/en-US/docs/Web/API/CryptoKeyPair for "RSA-OAEP"包含 RSA 密钥对。如果您查看Firefox浏览器控制台中使用密钥生成的密钥对["wrapKey", "unwrapKey"],可以看到公钥的密钥用法是["wrapKey"]私钥是["unwrapKey"]。两者都是合理的,因为公钥用于包装,私钥用于解包:

但是,如果您查看Firefox浏览器控制台中使用密钥生成的密钥对["wrapKey"],可以看到公钥的密钥用法没有变化["wrapKey"],而私钥是empty:

So Chromium通过相应的错误消息来防止生成没有密钥使用的密钥(这显然是指具有空密钥使用的私钥)。相比之下Chromium, Firefox显然允许这样做。

现在是一个Chromium漏洞?实际上,创建一个没有密钥用途的密钥没有多大意义,因为它无法使用!

Firefox 浏览器示例:如果在火狐浏览器中执行以下代码,确实生成了密钥对,并且由于密钥的使用而包装了一个密钥wrapKey对于公钥,但解包失败并显示InvalidAccessError如果密钥使用解包密钥因为私钥丢失:

var test = async () => {

  try {
      
    var mode = document.querySelector('input[name="keyUsages"]:checked').value;
    var keyUsages = (mode === "wrap") ? ["wrapKey"] : ["wrapKey", "unwrapKey"] 
			  
    // Create RSA key pair
    var RSAKeys = await crypto.subtle.generateKey(
      {name: "RSA-OAEP", modulusLength: 3072, publicExponent: new Uint8Array([0x01, 0x00, 0x01]), hash: {name: "SHA-256"}},
      true,
      keyUsages);
				
    // Create key to wrap
    var keyToWrap = await window.crypto.subtle.generateKey(
      {name: "AES-GCM", length: 128},
      true,
      ["encrypt", "decrypt"]);
				
    // Wrap key
    var wrappedKey = await window.crypto.subtle.wrapKey(
      "raw",
      keyToWrap,
      RSAKeys.publicKey,
      {name: "RSA-OAEP", hash: {name: "SHA-256"}});
			  
    // Unwrap key
    var unwrappedKey = await window.crypto.subtle.unwrapKey(
      "raw", 	
      wrappedKey, 	
      RSAKeys.privateKey, 
      {name: "RSA-OAEP", modulusLength: 3072, publicExponent: new Uint8Array([0x01, 0x00, 0x01]), hash: {name: "SHA-256"}},
      {name: "AES-GCM", length: 128},
      false, 
      ["encrypt", "decrypt"]); 
				
    document.getElementById("result").innerHTML = "Secret key for " + unwrappedKey.algorithm.name + " unwrapped.";
    console.log(unwrappedKey);
 
    } catch(e) {
      document.getElementById("result").innerHTML = e.name + ": " + e.message;
    }
}
.as-console-wrapper { max-height: 7.0em !important; }
<!DOCTYPE html>
<html>
<body height="200">
    <input type="radio" name="keyUsages" value="wrap" checked="true"> ["wrapKey"] 
    <input type="radio" name="keyUsages" value="wrapUnwrap"> ["wrapKey", "unwrapKey"] 
    <button onclick="test()">Run</button><br/> 
    <p id="result"></p>
</body>
</html>

因此我不会将其归类为错误(但这只是我的意见)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Chromium 中使用 WebCrypto 生成 RSA 密钥对 的相关文章

  • 如何使用开发者工具查找 Chrome 中的按钮或元素运行的代码

    我正在使用 Chrome 和我自己的网站 我从内部了解到的情况 1 我有一个表格 人们可以通过单击这个橙色图像按钮进行注册 2 我检查了它 这就是全部 img class formSend src images botoninscribir
  • Selenium 打开未登录 Chrome 帐户的 chrome

    我最近一直在使用 Selenium WebDriver 我还专门使用 chromedriver 每当我打开一个新的 chrome 窗口 driver get url 时 Chrome 都会以完全默认的状态启动 而不是我刚刚从我的扩展坞打开一
  • 带有“Sec-Fetch-User:?1”标头的重复请求扰乱了我的请求限制

    我有一个网站 并且我已经实施了自己的请求限制以提高安全性 问题是 从一台特定的机器上 我收到重复的请求 它们之间几乎相同 生成的两个请求之间存在毫秒级的时间差 当某些 JavaScript 代码以编程方式提交表单时 就会执行原始请求 它们之
  • 加密 Chrome 扩展程序?

    无论如何 要加密 Chrome 扩展程序 以免暴露源代码 您可以使用混淆器隐藏您的代码 市场上有很多可用的 像Google Closure编译器这样的工具很少 而且市场上有很多在线javascript ofuscators 你可以使用任何一
  • 添加文件://. chrome 扩展程序的权限

    如何使用 Chrome 扩展启用 file 的权限 在我的manifest json中我尝试过 permissions file and permissions file 也 permissions C 这些都不起作用 permission
  • Google 脚本:如何编写从驱动器中的 txt 自动导入电子表格的脚本?

    我以前从未使用过 Javascript 而且多年来我一直在尝试这样做 但没有成功 而且我找不到任何以前的人尝试过 我想直接从驱动器中的 txt 文档复制文本数据 可以手动完成此操作 但我希望每天自动完成 文本文件 Boxes Made 3
  • Firefox 页面未正确重定向

    当我访问我的特定网址时asp net mvc 3 questions tagged asp net mvc 3我在 Firefox 中收到此错误 有问题的页面是登录屏幕 页面未正确重定向 Firefox 检测到服务器正在重定向请求 这个地址
  • SVG 过滤器在 Firefox 中不显示,在 Chrome 中工作正常

    我想要深色背景上的一段深色文本外面有白色的光芒 虽然默认阴影滤镜 https developer mozilla org en US docs Web CSS filter drop shadow 2在 CSS 中 比如filter dro
  • 如何从上下文菜单中显示模式弹出窗口?

    如何从上下文菜单中显示模式对话框 我可以从上下文菜单中显示一个新窗口 该窗口在自己的选项卡中打开 var menuItem id rateMenu title Rate Item contexts all chrome contextMen
  • 如何解决“消息端口在收到响应之前已关闭”的问题。在 JavaScript 中的 window.location.reload() 之后

    我遇到了 javascript 问题 从 chrome v73 0 3683 86 开始 每当我在 window location reload 函数之后运行 javascript 代码时 它总是给我错误 Unchecked runtime
  • twitter bootstrap css 在 chrome 扩展中发生冲突

    我正在使用 bootstrap 来编写我正在编写的 chrome 扩展 当作为内容脚本导入时 CSS 似乎与我正在查看的许多网站发生冲突 即使在谷歌搜索结果页面中 想知道我是否可以做些什么来将其范围限制为我使用内容脚本注入的 dom 元素
  • Chrome:ERR_BLOCKED_BY_XSS_AUDITOR 详细信息

    我在尝试发布然后获得一个简单的表单时收到了这个 chrome 标志 问题是开发者控制台没有显示任何相关内容 我自己无法找到问题的根源 是否有任何选项可以更详细地查看此内容 查看触发错误的代码片段以修复它 在开发中绕过此错误的简单方法是将标头
  • 有没有办法在 Google Chrome 中获取 XPath?

    我有一个网页想要与 YQL 一起使用 但我需要特定项目的 XPath 我可以在 Google Chrome 的调试工具区域中看到它 但我没有找到复制该 XPath 的方法 有没有办法复制完整的 XPath 您可以使用 x在 Chrome j
  • 如何读取密钥文件以与 HMAC_Init_ex() 一起使用

    我使用 openssl 生成了 RSA 私钥 我需要使用纯 C 语言中的 OpenSSL 库的 HMAC 函数来对数据进行哈希 签名 但我不确定如何从该文件中正确提取私钥数据 据我所知 该文件是 B64 编码的 因此我将其取消编码并将其存储
  • 每个窗口都有单独的会话

    我正在尝试创建一个扩展 其中每个 Chrome 窗口都有自己的会话 我们之前使用过隐身模式 但问题是 虽然主窗口和隐身窗口有单独的会话 但会话在各个隐身窗口之间共享 有没有办法将 Chrome 配置为每次打开隐身窗口时使用单独的会话 您的目
  • 当 Chrome 中嵌套滚动中的数据更改时防止页面滚动

    我在页面中有一个固定大小的元素 带有 溢出 滚动 其内容经常更改 我预计该元素内部发生的更改会影响该元素的滚动 但不会影响页面滚动 但是当这个元素位于页面顶部时 页面本身开始滚动 我怎样才能防止这种情况发生 要重现此行为 我在 chrome
  • 通过 DevTools 协议从 Chromium 进行“向外”通信

    我有一个页面在无头 Chromium 实例中运行 我通过 DevTools 协议使用 Node js 中的 Puppeteer NPM 包来操作它 我正在将脚本注入到页面中 在某些时候 我希望脚本给我回电并向我发送一些信息 通过 DevTo
  • chrome 选项卡/窗口中的 window.open 行为

    我有一小段 javascript 旨在打开两个或更多选项卡 这在 FF 和 IE 中工作正常 但 chrome 会在新窗口而不是选项卡中打开第二个窗口 它不依赖于 url 因为我已经尝试过使用两个相同的 url 第一个在选项卡中打开 第二个
  • Web RTC 流的音频电平表

    我想为视频元素中播放的音频创建一个分贝计 视频元素正在播放 WebRTC 流 目前 WebRTC 流无法传递到 Web 音频分析器中 尽管这可能很快就会改变 参见Web Audio API 分析器节点 getByteFrequencyDat
  • 如何在 Node.js 中获取 RSA 公钥的模数和指数

    我正在创建一个ACME https www rfc editor org rfc rfc8555客户端和我需要找到 RSA 公钥的模数和指数 我使用以下代码生成该公钥 crypto generateKeyPairSync rsa modul

随机推荐