【问题标题】:Efficiently encrypt/decrypt large file with cryptojs使用 cryptojs 有效地加密/解密大文件
【发布时间】:2013-11-30 03:02:25
【问题描述】:

我想加密大字符串(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() );

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

【问题讨论】:

    标签: encryption browser large-files cryptojs


    【解决方案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')

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我确实是通过网络发送的。目前,我构建了数组,然后将数组传递给 Blob 构造函数。然后在 FormData 对象中添加 blob。您打算如何进行?
      • 这就是我最终所做的,而且效果很好。就我而言,我能够发送 2go 文件。我最终在开幕式上遇到了问题,但这与这里的问题无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2015-08-27
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多