我正在尝试构建一种客户端加密文件并上传的方法。目标是将文件加密存储在服务器上,只有最终用户才能解密该文件。这个问题之前已经被问过,但我认为我取得了一些进展。
我的计划是使用新的Javascript文件API来操作文件并上传它。可以使用Stanford Javascript Crypto Library进行加密。应该分块读取文件,以便不会完全读入内存。然后,每个块都由加密库加密。我无法弄清如何实现此功能。作为一个开始,我有以下内容:
我的计划是使用新的Javascript文件API来操作文件并上传它。可以使用Stanford Javascript Crypto Library进行加密。应该分块读取文件,以便不会完全读入内存。然后,每个块都由加密库加密。我无法弄清如何实现此功能。作为一个开始,我有以下内容:
var fd = new FormData();
var file = document.getElementById('file').files[0];
fd.append("file", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", "/upload/");
xhr.send(fd);
这只是一个常规的JavaScript上传。我正在尝试构建一个模拟File对象行为并将其传递给FormData的Crypt对象。对于FormData读取的每个数据块,该对象应从文件中读取一个块并加密它。我仍然无法弄清楚FormData如何处理File对象以及是否可能复制此行为。我不确定是否这是正确的方法,有没有人有建议?
更新:好的,现在我进展很多了。我正在使用file.slice分块读取文件。然后加密每个块,并使用BlobBuilder将其转换回blob。然后将此blob放入FormData对象中并提交到服务器。服务器将连接这些blob。使用浏览器加密和解密一个块是可以工作的。现在我正在处理下载和解密多个块。
仍然有一些问题需要解决:
- 文件的名称丢失了,目前还不能为文件对象设置FileName。
- 加密仍然是阻塞的(没有UI更新),但我认为我可以用Webworkers来解决这个问题。
- 我无法预测下载时的块大小。未加密的块大小已知,但对于加密数据,它似乎有所不同。这些加密数据以JSON形式存储,我不想对}进行字符串搜索。而且我希望不要把这些数据存储在服务器上。
- 虽然我正在分块读取文件,但Firefox似乎存在内存泄漏或将整个文件读入内存。对于多吉字节的文件,这成为一个问题。