クライアント側の暗号化作業にはWebcrypto API
を使用しています。 キーをラップしたりラップを解除することはできませんが、ブラウザは常に次のエラーを返しました。WebCrypto APIを使用してキーをラップアンドラップする
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;
});
}
問題がキーオブジェクトを文字列に変換することに関連しているかどうかわかりません。残念ながら、データベースに永続化するには文字列に変換する必要があります。
WebCrypto APIでは、サポートが最小限であるためブラウザのバージョンも表示することが基本です。 1行ですべての操作を実行しようとしていることがわかります。その行を分割し、少なくともどのメソッドが原因であるかを特定します。これが基本的なデバッグです。 –