2017-02-09 8 views
0

ファイルをサーバーにアップロードするための既存のフロントエンド(角)コードを変更する必要があります。アップロードする前にファイルを暗号化する必要があります。Javascript formdata:ファイルを追加する前に暗号化

現在のアプローチは、ファイルの数を追加し、以下に示すように、単一のリクエストでそれらを送信するためにいるFormDataを使用しています。

function uploadFiles(wrappers){ 

     var data = new FormData(); 

     // Add each file 
     for(var i = 0; i < wrappers.length; i++){ 

      var wrapper = wrappers[i]; 
      var file = wrapper.file; 
      data.append('file_' + i, file); 
     } 

     $http.post(uri, data, requestCfg).then(

     /*...* 

私は他のプロジェクトでフォージを使用していないが、決してコンテキストのこの種にされていると実際にファイルを暗号化してFormDataコンテンツとして追加する方法は実際には分かりません。

フォージは簡単なAPIを提供します:

var key = forge.random.getBytesSync(16); 
var iv = forge.random.getBytesSync(8); 

// encrypt some bytes 
var cipher = forge.rc2.createEncryptionCipher(key); 
cipher.start(iv); 
cipher.update(forge.util.createBuffer(someBytes)); 
cipher.finish(); 
var encrypted = cipher.output; 

バックエンドが強敵を使用してファイルをrecievesし、すべてのファイルhanldingはすでに配線されています。したがって、既存のフロントエンドロジックを使用するだけで、暗号化ロジックを挿入することに固執したいと思います。その中で、暗号化しなければならないのはフォームデータ全体ではありません...私はこれにまだアプローチしていません。

ご提案は大歓迎です!

+2

ここでの目標は何ですか?転送中のファイルを保護しようとしているのか、Webサーバーを制御している人物からファイルを保護しようとしていますか? – Quentin

+0

ないあなたの質問が、あなたはネイティブの[暗号](https://www.w3.org/TR/WebCryptoAPI/)APIを見てきましたか? (ユーザーが確実に最新のブラウザを持っている場合には、それは本当の暗号ランダム性と内蔵のアルゴリズムを提供) – Touffy

+0

こんにちは@Quentin、確かに、リモートサーバは、内容を読み取ることができない必要があります。これは、ブラウザと実際の処理エンジンの中間ノードです。医療データは、潜在的な誤用に関しては気になるようです。 – Jem

答えて

0

いいえ、解決策を見つけて解読コードを追加しました。これにより、非同期コードのレイヤが追加されます。

 function appendFile(aFile, idx){ 

      // Encrypt if a key was provided for this protocol test 
      if(!key){ 
       data.append('dicomfile_' + idx, file); 
       appendedCount++; 
       onFileAppended(); 
      } 

      else{ 
       var reader = new FileReader(); 
       reader.onload = function(){ 

        // 1. Read bytes 
        var arrayBuffer = reader.result; 
        var bytes = new Uint8Array(arrayBuffer); // byte array aka uint8 

        // 2. Encrypt 
        var cipher = forge.cipher.createCipher('AES-CBC', key); 
        cipher.start({iv: iv}); 
        cipher.update(forge.util.createBuffer(bytes)); 
        cipher.finish(); 

        // 3. To blob (file extends blob) 
        var encryptedByteCharacters = cipher.output.getBytes();  // encryptedByteCharacters is similar to an ATOB(b64) output 
        // var asB64 = forge.util.encode64(encryptedBytes); 
        // var encryptedByteCharacters = atob(asB64); 

        // Convert to Blob object 
        var blob = byteCharsToBlob(encryptedByteCharacters, "application/octet-stream", 512); 

        // 4. Append blob 
        data.append('dicomfile_' + idx, blob, file.name); 

        // Decrypt for the sake of testing 
        if(true){ 

         var fileReader = new FileReader(); 
         fileReader.onload = function() { 
          arrayBuffer = this.result; 
          var bytez = new Uint8Array(arrayBuffer); 
          var decipher = forge.cipher.createDecipher('AES-CBC', key); 
          decipher.start({iv: iv}); 
          decipher.update(forge.util.createBuffer(bytez)); 
          decipher.finish(); 
          var decryptedByteCharacters = decipher.output.getBytes(); 
          var truz = bytes === decryptedByteCharacters; 
          var blob = byteCharsToBlob(decryptedByteCharacters, "application/octet-stream", 512); 
          data.append('decrypted_' + idx, blob, file.name + '.decrypted'); 

          appendedCount++; 
          onFileAppended();  
         }; 
         fileReader.readAsArrayBuffer(blob); 
        } 

        else{ 

         // z. Resume processing 
         appendedCount++; 
         onFileAppended();       
        } 
       } 

       // Read file 
       reader.readAsArrayBuffer(aFile); 
      } 
     } 

function onFileAppended(){ 

      // Only proceed when all files were appended and optionally encrypted (async) 
      if(appendedCount !== wrappers.length) return; 
      /* resume processing, upload or do whathever */ 
関連する問題