2017-06-23 5 views
0

クライアント側の暗号化作業には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; 
     }); 
} 

問題がキーオブジェクトを文字列に変換することに関連しているかどうかわかりません。残念ながら、データベースに永続化するには文字列に変換する必要があります。

+0

WebCrypto APIでは、サポートが最小限であるためブラウザのバージョンも表示することが基本です。 1行ですべての操作を実行しようとしていることがわかります。その行を分割し、少なくともどのメソッドが原因であるかを特定します。これが基本的なデバッグです。 –

答えて

1

ここでは、キーラップ/アンラッピングの簡単な例を示します。このコードは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-shimwebcrypto-liner

また、var key = stringToArrayBuffer(B64ToString(obj["key"]));を参照してください。しかし、鍵はCryptoKeyでなければなりません。生の対称キーを使用する場合は、importKey関数を使用してCryptoKeyを作成する必要があります。raw

関連する問題