2016-05-17 7 views
4

すでに存在するプロジェクトでWeb暗号化APIを使用したいと考えています。 何かを暗号化して解読するにはCryptoKeyを使用する必要がありますが、CryptoKeyにlocalStorageに保存すると、オブジェクトの代わりにString(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' on 'に復号化' を実行に失敗しました:パラメータ2がないタイプ '暗号鍵' です。 2localStorageHandler.js:39 CryptoPromise [オブジェクトCryptoKey]

localStorageを使用せずに復号化しても、データの暗号化に問題はありません。生の形式であなたの鍵を保存するには

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) }); 
} 

答えて

3

crypto.subtle.exportKeyを(使用を検討してください)とcrypto.subtle.importKey()のlocalStorageに保存する前に、ので、あなたの復号化コードは次のようになりますin 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()メソッドの両方が約束を返します。

+0

未加工キーのエクスポートにはまだ問題があります。私はsaveKeyInLocalStorage関数 'cryptoTestObject = crypto.subtle.generateKey(...).then(function(key){ saveKeyInLocalStorage(keyName、key);' を呼び出して、exportPromiseでChromeのエラーメッセージ「DOMException :キーが抜け出せない(InvalidAccessError) 'Firefoxで'パラメータまたは操作が基底のオブジェクトでサポートされていない(InvalidAccessError) ' – AntonDerProgrammierer

0

一部のキーはRAW形式でエクスポートできません。しかし、これまでのところJWK(json web key)形式はどこでもサポートされているようですので、あなたはそれを使うことができます。

// to store the key: 
window.crypto.subtle.exportKey("jwk", key) 
.then(e=>localStorage.setItem("webkey",JSON.stringify(e))); 

同様に、importKey()を戻すことができます。これは、キーのアルゴによって異なります。 構文については、https://github.com/diafygi/webcrypto-examples/

関連する問題