问题标签 [webcrypto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
149 浏览

webcrypto - @PeculiarVentures 的 `webcrypto` 和 `node-webcrypto-ossl` 有什么区别?

我是 GUN 的作者,我喜欢你的作品!

我对应该使用哪些库或哪些库相互依赖有点困惑:

  • node-webcrypto-ossl
  • webcrypto
  • webcrypto-core
  • node-webcrypto-p11

或者其他我应该知道的。

谢谢!

0 投票
1 回答
1970 浏览

javascript - WebCrypto 执行问题,由于数据类型错误而失败,并将所有处理结果编译在一个统一的字段中

我正在尝试使用静态 RSA 公钥来加密会话生成的 AES 密钥,然后用于加密密码,并且随机生成的 AES 会话密钥输入 RSA 加密密码有以下错误消息:

我尝试将随机生成的 AES 密钥数据(通过导出)转换为 Uint8Array 缓冲区,然后再将其转换为 ArrayBuffer 以在 RSA 加密代码中使用,但不知何故它不起作用。

在@pedrofb 的帮助下设法转换数组缓冲区字段后,我尝试将所有结果拉到一个统一字段中,以便集中存储处理后的输出,这会产生不一致的输出。

这是修改后的源代码,它修复了失败的执行,但产生了另一个问题,即在 HTML“输入”字段中没有一致的输出值。HTML 输入字段仅显示在所有操作中收集的部分数据。我正在尝试使用“隐藏”字段作为一种收集器来收集所有已处理的结果,但是当我将处理后的结果转移到非隐藏字段时,它只显示为部分。

以下是存档出现问题的原始源代码:

0 投票
1 回答
385 浏览

go - Golang rsa-oaep 解密失败,前端使用 webcrypto

我有这个用 Golang 编写的应用程序作为后端,Typescript 作为前端。我需要对传输的数据进行加密所以我选择RSA加密,基本上步骤如下:

* 后端 *

  1. golang生成私钥和公钥,保存在redis中
  2. Golang 使用lestrrat-go/jwx/将公钥转换为 JWK(json web key)
  3. Golang 发送 JWK

* 前端 *

  1. Typescript 使用 Webcrypto API 导入 JWK 密钥
  2. Typescript 使用导入的密钥加密一些纯文本
  3. 加密后,我得到一个 ArrayBuffer,为了防止出现任何编码问题,然后我将 ArrayBuffer 字节转换为整数数组
  4. 将转换后的整数数组发送到字符串化 JSON 中的后端

* 后端 *

  1. Golang 接收 JSON 并将整数数组转换为[]byte
  2. 从redis中检索私钥然后解密

现在我得到的只是一个decryption error...

我检查过的事情:

  • 后端 Golang 单独加密/解密就好了
  • 前端 webcrypto 单独加密/解密就好了
  • 检查 golang rsa.PublicKey -> JWK 期间是否出现任何问题

    1. 如果前端从后端获取 jwk
    2. 导入它
    3. 然后导出
    4. 将导出的密钥发送回后端
    5. 后端将jwk转回rsa公钥,等于redis中保存的公钥
  • 后端收到 int 数组并转换为 后[]byte,它的长度和内容等于前端的

代码如下:

更新

在此处添加一些打印日志:

  • 后端:
  • 前端:
0 投票
1 回答
128 浏览

ssl - 误解了 Web Crypto API 的安全上下文?

根据关于 Web Crypto Subtle API 的 MDN 文档,以及这个答案: TypeError, 'digest' of undefined, in development environment

我了解该 API 仅适用于 localhost 或通过 HTTPS 协议。

因此,为了验证这一点,我使用此 API 在桌面上的 NGinx 代理后面部署了一个前端应用程序,并尝试从另一台计算机连接到此应用程序。

使用 Chrome,代码已被阻止,因为我没有在 HTTP 上连接。

但是使用 Firefox,这些工作没有任何警报。我错过了一些关于 Firefox 的东西吗?

0 投票
1 回答
484 浏览

javascript - Webcrypto PBKDF2-SHA1

我在使用带有 Webcrypto 的 PBKDF2 时遇到问题。我想将 PBKDF2 与 SHA-1 算法一起使用。目前,我有,

但是我知道我一定是用错了,因为它是受支持的密钥派生算法,并且根据 Mozilla 的精彩文档,derivedKeyAlgorithm支持 HMAC 以及 HMAC-SHA1。我也让它AES-GCM相当直接地工作。

当我尝试时,我收到的错误消息,

Uncaught DOMException: Cannot create a key using the specified key usages.

注意:我了解不再推荐使用 SHA1,这是为了支持旧版。

注意2:当我将上面的内容替换为时,它可以工作,

谢谢你。

0 投票
0 回答
774 浏览

javascript - 使用 PKI 证书与浏览器进行签名

我有一个非常简单的用例。我的 Web 应用程序的用户应该能够对某些工作流程步骤的输出进行签名。该网站是通过相互 ssl 保护的,因此当用户登录时,系统会提示他通过他的证书。这很好,所以我知道,浏览器可以访问证书(通过 Firefox 的加密模块或 Chrome 中的 Windows 密钥库从 PKI 卡)。从那时起,应该很容易在浏览器中使用用户的证书。但似乎没有一个明显的方法。

我尝试了什么:

谷歌

有一些 StackOverflow 问题(但似乎都很旧):

网络加密API

这个 API 似乎很棒。而且那个用例似乎正是我所需要的。但最终的实现似乎没有那个能力

pkjs

作为 webcrpypto api,该功能似乎没有被实现

网络加密密钥发现

那是缺少的链接吗?我不确定....

为什么是一个新问题?由于我们现在已经 2020 年,旧的问题和答案包含很多过时的东西(active-x,java-applet),所以我希望我们能够得到一个清晰明了的答案,使其成为可能而无需任何变通办法。

更新:恐怕还是不可能:https ://techblog.bozho.net/electronic-signatures-using-the-browser/

0 投票
1 回答
302 浏览

javascript - JWK“key_ops”成员与 Web Crypto 调用指定的成员不一致

在 NodeJS 上,我生成密钥并将其导出如下,

现在,当我尝试在使用 Chrome 浏览器的客户端上导入导出的密钥时,它会引发 DOM 异常,我像这样导入它,

错误是,

令我惊讶的是,我可以在 Node 上导入相同的东西而不会出现任何错误。我的意思是客户端以几乎相同的格式生成 JWK。

0 投票
1 回答
38 浏览

encryption - 有没有办法解密密码?(网络加密?)

我离加密\解密还很远,但最近我遇到了这样的问题:

这里应该是示例加密密码或短语,已知它是使用 WebCrypto 加密的。但是所有解密示例都将短语表示为 base64,将 salt/iv 表示为十六进制。可能存在以正确方式将其转换为十六进制的函数,或者可能没有办法用上面的数据解密这个?

0 投票
1 回答
446 浏览

javascript - Uncaught (in promise) DOMException: key.algorithm does not match that of operation

生成 RSA-OAEP 密钥对(根据http://www.w3.org/TR/WebCryptoAPI/#algorithm-overview。

当用户创建秘密时,秘密使用 AES-GCM-256 和随机生成的中间密钥进行加密。最后,这个中间密钥与用户的公钥一起包装。

最后解开中间密钥和解密。

该错误是在展开中间密钥期间生成的。

0 投票
1 回答
129 浏览

javascript - WebCrypto JS SHA256 HMAC 不匹配

我有两个生成 SHA256 HMAC 的脚本,带有纯文本消息和 Base64 编码密钥。一种是用 PHP 编写的,另一种是用 JavaScript 编写的。PHP 脚本返回正确的 HMAC,但由于某种原因 JS 版本没有。这是什么原因造成的?

以下是代码示例,带有经过编辑(本质上仍然相似)的密钥。

PHP

这个脚本,返回MTYxNDExNzczNzQ2NztFdXcwQ1l0bTBTMkdIdnZ2ZnN2ZGFkTEFDMGVPbVlJeHFzZk9PQWExS1BzPQ==

JS

哪个返回MTYxNDExNzczNzQ2NztBeGxFRVJCTzVYWm5KN2ZHNCtoeWlxalJ0VmxZQmJpekNUSEwzcldMQVhzPQ==

为什么这些看似相同的脚本会返回不同的结果?