我想加密大字符串(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() );
我认为应该有更好的方法。但我无法找到一种有效的方法来做到这一点。
答案 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')