问题标签 [webcrypto-api]

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 回答
8736 浏览

javascript - 使用 RSA OAEP 加密和解密

我正在使用 Web Crypto,更具体地说,这些示例:https ://github.com/diafygi/webcrypto-examples/#rsa-oaep

我的主要目标是用我的公钥加密一个字符串并用我的私钥解密它。

公钥加密效果很好,但是当我尝试用私钥解密加密字符串时,它返回以下错误:OperationError以及一个空字符串。

我正在使用以下功能:

更新

0 投票
1 回答
1038 浏览

javascript - 解密openSSL AES CTR加密文本时遇到问题

我无法使用该openssl_encrypt方法解密在 php 中加密的消息。我正在使用新的 WebCrypto API(所以我使用crypto.subtle)。

用php加密:

示例输出:

(我可以在 php 中解密并取回明文)

在 JS 我这样解密:

当我现在跑步时,decrypt("8d8c3a57d2dbb3287aca61be0bce59fbeAQ4ILKouAQ5eizPtlUTeHU=", "ae6865183f6f50deb68c3e8eafbede0b33f9e02961770ea5064f209f3bf156b4").then(console.log)我会胡言乱语:SÌõÅ°blfçSÑ-

我遇到的问题是,我不确定counter. 我尝试了静脉注射但失败了。

这个 Github 教程建议* 1,它是 IV - 或者至少是它的一部分,因为我看到人们谈论计数器是 IV 的一部分(大约 4 个字节,这意味着 IV 是由12字节IV和4字节计数器)

如果这确实是真的,那么我的问题就变成了:当计数器只有 4 个字节时,我在哪里给脚本其他 12 个字节的 IV。

谁能给我一个在php中加密的工作示例

* 1它表示必须使用相同的计数器进行加密和解密。这让我相信,它至少类似于 IV

0 投票
1 回答
4000 浏览

javascript - 使用 WebAPI 加密数据时出现 TypeError window.crypto.subtle.encrypt()

当我尝试在 Firefox 上使用 Crypto API 时遇到了问题。( doc ) 当我尝试使用此函数加密明文时收到 TypeError :

文档

这就是我定义参数的方式:

算法编码:

钥匙:

padded-clear-txt 是我要加密的 256 位 (2*128) 消息。

这是我执行加密功能时遇到的错误:

SubtleCrypto.encrypt 的参数 2 没有实现接口 CryptoKey。

密钥的生成很顺利,它是一个 CryptoKey 对象,但我仍然收到此错误。所以也许这是一个我应该报告的错误......

0 投票
1 回答
790 浏览

javascript - 使用 Javascript 从 utf8 转换为十六进制并返回

我正在尝试使用 WebCrypto 加密文本。我将结果转换为 utf8 字符串,然后将其转换为十六进制。加密/解密有效。但是,我想将数据转换为十六进制。当我尝试转换为十六进制并返回时,结果是不同的。

这是小提琴(使用 Chrome):https ://jsfiddle.net/yxp01v5g/

测试代码在这里:

如您所见,我正在获取结果,将其转换为十六进制,然后将其转换回 utf8,希望它与原始结果相同。然而,事实并非如此。

谁能告诉我到底我做错了什么?

0 投票
1 回答
572 浏览

javascript - 使用 WebCrypto 的 AES 加密数据长度

我要做的是使用 Web 浏览器中 SubtleCrypto.encrypt() 提供的 128 位 AES-CBC 加密来加密 16 字节的数据包。

我期望找到的是 16 字节的加密数据用于 16 字节的输入。

我实际发现的是 16 字节输入的 32 字节加密数据。

具体来说,15 字节的输入产生 16 字节的输出,16 字节的输入产生 32 字节的输出,17 字节的数据产生 32 字节的输出。

我的问题是,为什么 16 字节的输入数据会产生 32 字节的输出?我会怀疑这可能只发生在 > 16 字节的输入数据,而不是 >= 16 字节的情况下。

将以下测试代码保存到文件并使用 Web 浏览器打开。

0 投票
1 回答
2442 浏览

javascript - 基准测试 WebCrypto 比第三方库慢很多?

我正在评估 WebCrypto 性能与第三方加密库SJCLForge的比较。我希望 WebCrypto 会快得多,因为它是本机浏览器实现。这也已经在之前进行了基准测试,并且已经证明了这一点。

我使用Benchmark.js实现了以下测试,以测试密钥派生 (PBKDF2-SHA256)、加密 (AES-CBC) 和解密 (AES-CBC)。这些测试表明,网络加密的加密/解密速度明显慢于 SJCL 和 Forge。

基准代码

在这里看小提琴:https ://jsfiddle.net/kspearrin/1Lzvpzkz/

基准测试结果(铬)

基准测试结果 (Firefox)

这里发生了什么?为什么 WebCrypto 的加密/解密功能如此之慢?我是在错误地使用 Benchmark.js 还是什么?

0 投票
3 回答
987 浏览

javascript - Web Crypto API:如何将密码添加到私钥

我们window.crypto.subtle.generateKey用来生成一个 RSA 密钥对。

我们如何使用 Web Crypto API 为私钥添加密码?

0 投票
1 回答
880 浏览

javascript - 让 crypto.subtle.encrypt 像 CryptoJS.AES.encrypt 一样工作

我编写了一个使用 CryptoJS 实现的系统。

编写代码后,我发现crypto.subtle.encrypt这是浏览器内置的 AES 实现。

我想将我的代码从使用 CryptoJs 改为使用 crypto.subtle.encrypt。

以旧方式(CryptoJS)编码的数据必须与新方式(crypto.subtle.encrypt)兼容。

我怎样才能做到这一点?

当我写我的原始代码时,它看起来很像这样:

传入的“key”只是一个字符串。根据我从其他 stackoverflow 问题中了解到的内容,CryptoJS 将此字符串转换为“key”和“iv”。这究竟是如何实现的?我尝试浏览 CryptoJS 源代码,但找不到我要找的东西。

微妙.crypt.encrypt 的工作方式是您必须明确地传递密钥和 iv。这是我的代码:

这有效,但返回不同的结果。我需要修改alg传入字符串时与 CryptoJS 使用的参数相匹配的参数。我该怎么做呢?

0 投票
3 回答
2010 浏览

javascript - 如何通过客户端从 Chrome/Mozilla 导入 Windows 操作系统证书存储中的个人证书

我已经使用 JavaScript 库WebCrypto API和使用 CSR 请求的 3rd 方 Web 服务生成了密钥对并创建了自签名证书。现在我想将带有私钥的证书存储在客户端 PC 的 Windows 个人证书存储中。我在这里发现通过JavaScript是不可能的。使用java很容易。但是由于现在不鼓励jApplet,客户端还有其他方法。通过创建 chrome/mozilla 扩展,是否有可能?

请注意,我知道如果我将证书与私钥一起导出为文件,我可以在 Windows 证书存储中手动将其导入为个人证书。但我想自动化这个过程 - 用户只需从浏览器填写表格并通过服务器通信,证书将被创建并将与私钥一起存储在客户端的 Windows 存储中。

0 投票
2 回答
1030 浏览

javascript - Web Crypto API using Microsoft Edge (38.14393.0.0)

I am using the Web Crypto API (https://www.w3.org/TR/WebCryptoAPI/) successfully on Chrome (since first Web Crypto support), Firefox (since first Web Crypto support) and even on Safari TP (10.2) with support of a WebCrypto Liner a pollyfill for WebCrypto API (https://github.com/PeculiarVentures/webcrypto-liner).

Now I want to test our code using Microsoft Edge. But encrypting and decrypting a sample ArrayBuffer already fails. Here the code:

This code is failing in the decrypting phase (step 3. in the code) on Edge, while its working fine on Chrome, Firefox and even Safari. The wired part it that the decryptedDataPromise is rejected with an exception but the returned data doesnt look like an exception at all:

Does anybody have a clue why this fails on Microsoft Edge?