11

既存のプロジェクトで Web 暗号化 API を使用したいと考えています。何かを暗号化および復号化するには、CryptoKey を使用する必要がありますが、CryptoKey を localStorage に保存すると、オブジェクトではなく文字列 (CryptoKey) のみが保存されます。

CryptoKey を単純な型 (文字列) でシリアル化/変換することは可能ですか?

私の解読方法は

function decryptDataWithAES(keyName)
{
    var decrypt_promise; 
    var aesKey = localStorage.getItem(keyName + 'key')
    var item = localStorage.getItem(keyName)
    var invokeVektor = localStorage.getItem(keyName + 'vector')
    console.log("aesKey", aesKey )

    crypto.subtle.decrypt({ name: "AES-CBC", iv: invokeVektor }, aesKey, item).then(function (result) {
        decrypted_data = new Uint8Array(result); decrypted_data = new Uint8Array(result);

        decrypt_promise = convertArrayBufferViewtoString(decrypted_data);
        console.log('decryptDataWithAES ' + decrypt_promise);
        return decrypt_promise; 
    },
        function(e){
            console.log(e.message);
        }
    );
}

もちろん、エラーメッセージは次のとおりです。

'SubtleCrypto' で 'decrypt' を実行できませんでした: パラメータ 2 はタイプ 'CryptoKey' ではありません。2localStorageHandler.js:39 CryptoPromise[オブジェクト暗号鍵]

localStorage を使用せずに復号化すると、データの暗号化に問題はありません。

4

2 に答える 2

8

localStorage に保存する前に crypto.subtle.exportKey() と crypto.subtle.importKey() を使用することを検討してください。復号化コードは次のようになります。

function decryptDataWithAES(keyName)
{
    var decrypt_promise; 

    // read raw value of aesKey
    var aesKey_RAW = localStorage.getItem(keyName + 'key')
    var importPromise = crypto.subtle.importKey('raw', aesKey_RAW, 'AES-CBC', true, ['encrypt','decrypt']);

    importPromise.then(function(aesKey){

    var item = localStorage.getItem(keyName)
    var invokeVektor = localStorage.getItem(keyName + 'vector')

        console.log("aesKey", aesKey )

        crypto.subtle.decrypt({ name: "AES-CBC", iv: invokeVektor }, aesKey, item).then(function (result) {
            decrypted_data = new Uint8Array(result); decrypted_data = new Uint8Array(result);

            decrypt_promise = convertArrayBufferViewtoString(decrypted_data);
            console.log('decryptDataWithAES ' + decrypt_promise);
            return decrypt_promise; 
        },
            function(e){
                console.log(e.message);
            }
        );

    }, function(e){ console.log(e.message) } );
}

キーを raw 形式で localStorage に保存するには:

function saveKeyInLocalStorage(keyName, aesKey){
   var exportPromise = crypto.subtle.exportKey('raw',aesKey);
   exportPromise.then(function(aesKey_RAW){ 
        localStorage.setItem(keyName + 'key' , aesKey_RAW);
        console.log("saved.");
   });
}

exportKey() メソッドと importKey() メソッドの両方が promise を返すことに注意してください。

于 2016-05-17T18:05:43.833 に答える