2017-02-09 247 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内容追加。

Forge提供一个简单的API:使用厉害文件和所有文件hanlding已经有线

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; 

后端临危。因此,我想坚持使用现有的前端逻辑,但只需插入加密逻辑即可。在这一点上,它不是必须加密的整个表单数据......我还没有找到一个好的方法来处理这个问题。

建议非常欢迎!

+2

这里的目标是什么?您是否试图保护传输中的文件或保护文件与控制网络服务器的人员? – 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 */