2017-02-09 6 views
0

파일을 서버에 업로드하는 것과 관련된 기존 프론트 엔드 (각진) 코드를 수정해야합니다. 이제 파일을 업로드하기 전에 암호화해야합니다. 나는 그러나 결코 상황의 종류와, 다른 프로젝트에서 포지를 사용하고있다Javascript 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를 사용 파일을 즉시 암호화하고 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; 

백엔드 파일 강력 함 사용하여 모든 파일 hanlding이 이미 연결되어 접수에. 따라서 기존 프론트 엔드 로직을 사용하는 대신 암호화 로직을 삽입하는 방법을 고수하고 싶습니다. 그것이 암호화되어야하는 것은 전체 formdata가 아닙니다 ... 나는 아직이 문제에 접근하기위한 좋은 단서를 찾지 못했습니다.

제안을 매우 환영합니다!

+2

여기의 목표는 무엇입니까? 전송중인 파일을 보호하거나 웹 서버를 제어하는 ​​사람으로부터 파일을 보호하려고합니까? – Quentin

+0

질문이 아니지만 기본 [crypto] (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 */