2017-02-09 16 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(

     /*...* 

Я использую Forge в других проектах, но никогда в этом виде контекста и на самом деле не вижу, как шифровать файлы «на лету» и все еще добавлять их в качестве содержимого FormData.

Forge предоставляет простой 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

Какая цель? Вы пытаетесь защитить файлы в пути или защитить файлы от лица, контролирующего веб-сервер? – Quentin

+0

не ваш вопрос, но вы посмотрели на собственный [crypto] (https://www.w3.org/TR/WebCryptoAPI/) API? (в случае, если ваши пользователи имеют надежные последние браузеры, они обеспечивают реальную криптографическую случайность и встроенные алгоритмы) – Touffy

+0

Hi @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 */