gpt4 book ai didi

javascript - 使用 WebCrypto API 包装和解开 key

转载 作者:行者123 更新时间:2023-12-03 04:00:58 26 4
gpt4 key购买 nike

我正在使用 Webcrypto API 在客户端进行一些加密工作。尽管我无法包装和解开 key ,但浏览器总是返回以下错误。

DOMException [OperationError: "The operation failed for an operation-specific reason"

你和我对此错误无能为力,所以我粘贴了我的代码。

function wrapPrivateKey(privateKey, wrappingKey) {
var iv = window.crypto.getRandomValues(new Uint8Array(12));
return window.crypto.subtle.wrapKey(
"jwk",
privateKey,
wrappingKey,
{
name: "AES-GCM",
length: 256,
iv: iv,
}
)
.then(function (key) {
return {
"key": StringToB64(arrayBufferToString(key)),
"iv": StringToB64(arrayBufferToString(iv))
};
})
.catch(function (err) {
console.error(err);
return false;
});
}

function unwrapPrivateKey(wrappedPrivateKey, unwrappingKey) {
var obj = JSON.parse(B64ToString(wrappedPrivateKey));
var key = stringToArrayBuffer(B64ToString(obj["key"]));
var iv = stringToArrayBuffer(B64ToString(obj["iv"]));
return window.crypto.subtle.unwrapKey(
"jwk",
key,
unwrappingKey,
{
name: "AES-GCM",
length: 256,
iv: iv,
},
{
name: "RSA-OAEP",
hash: {name: "SHA-256"},
},
true,
["encrypt", "decrypt"]
)
.then(function (key) {
return key;
})
.catch(function (err) {
console.error(err);
return false;
});
}

我不知道问题是否与将关键对象转换为字符串有关。不幸的是,我需要将其转换为字符串才能将其保存在数据库中。

最佳答案

这是 key 包装/解包装的简单示例。此代码适用于 Chrome/Mozilla

const rsaAlg = {
name: "RSA-OAEP",
hash: "SHA-256",
publicExponent: new Uint8Array([1, 0, 1]),
modulusLength: 2048
};
const aesAlg = {
name: "AES-GCM",
length: 256,
iv: crypto.getRandomValues(new Uint8Array(12)),
};

crypto.subtle.generateKey(rsaAlg, true, ["encrypt", "decrypt"])
.then((rsaKeys) => {
return crypto.subtle.generateKey(aesAlg, true, ["encrypt", "decrypt", "wrapKey", "unwrapKey"])
.then((aesKey) => {
return crypto.subtle.wrapKey("jwk", rsaKeys.privateKey, aesKey, aesAlg)
.then((wrappedKey) => {
console.log(wrappedKey); // ArrayBuffer

// Unwrap key
return crypto.subtle.unwrapKey("jwk", wrappedKey, aesKey, aesAlg, rsaAlg, true, ["decrypt"])
})
.then((unwrappedKey) => {
console.log(unwrappedKey);
})
})
})
.catch((err) => {
console.error(err);
})

WebCrypto API 因浏览器而异。最好使用一些可以修复它的模块webcrypto-shim , webcrypto-liner

我还看到您使用var key = stringToArrayBuffer(B64ToString(obj["key"]));。但 key 必须是CryptoKey。如果您有原始对称 key ,则必须使用 importKey 函数从 raw

创建 CryptoKey

关于javascript - 使用 WebCrypto API 包装和解开 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44726083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com