使用cryptojs有效地加密/解密大文件

时间:2013-11-16 19:27:54

标签: encryption browser large-files cryptojs

我想加密大字符串(200 MB)。 该字符串来自与文件对应的dataUrl(base64)。

我在浏览器中进行加密。

我的问题是,此刻,我将字符串分成一小部分组成一个数组。 然后我加密这个块。

此时加密字符串将填满内存。 我正是这样做的。

var encryptChunk = function(chunk, index){
  encryptedChunks.push( aesEncryptor.process( chunk ));
  sendUpdateMessage( "encryption", index+1, numberOfChunks );
}
chunkedString.forEach(encryptChunk);
encryptedChunks.push( aesEncryptor.finalize() );

我认为应该有更好的方法。但我无法找到一种有效的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

你在使用加密块做什么?如果您是通过网络上传它们,则无需先将它们存储在数组中。相反,您可以按块上传加密的文件块,或者编写自己的分块上传实现(这不是非常难)或者using an existing library.

同样输入:您可以在阅读时对其进行加密。您可以使用JS File API使用.slice()方法以块的形式读取文件。

除此之外,您的代码看起来就像progressively encrypt文件的推荐方式。

答案 1 :(得分:1)

我正在做与你类似的事情。直接回答你的问题"是否有一种更有效的内存方式?" ..好吧,我使用网络工作者处理渐进式加密,这似乎有效。

  //pass in what you need here
  var worker = new Worker("path/to/worker.js");

  worker.postMessage({
                key: getKeyAndIvSomehow(),
                file: file,
                chunkSize: MY_CHUNK_SIZE
            });

  worker.addEventListener('message', function (e) {
               // create the blob from e.data.encrypted
            });

您需要将cryptoJS脚本导入您的工作人员:importScripts('cryptoJS.all.min.js')