Gij*_*aar 9 javascript encryption file-upload
我正在尝试构建一种加密文件客户端并上传它的方法.目标是将加密的文件存储在服务器上,只有最终用户才能解密文件.这个问题之前有过一些问题,但我认为我取得了一些进展.
我的计划是使用新的Javascript File API来操作文件并上传它.加密可以使用Stanford Javascript Crypto Library完成.应该以块的形式读取文件,以便它不会完全读入内存.然后,每个块都由crypt库加密.我无法弄清楚如何实现这一点.首先,我有这个:
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);
Run Code Online (Sandbox Code Playgroud)
这只是一个普通的javascript上传.我正在尝试构建一个模仿File对象行为的Crypt对象,并将其传递给FormData.对于formdata读取的每个数据块,对象应从文件中读取一个块并加密.我只是无法弄清楚FormData如何处理File对象以及是否可以复制此行为.我不确定这是否是正确的方法,任何人都有建议?
更新:好的,我现在更进一步.我正在使用file.slice以块的形式读取文件.然后使用BlobBuilder将每个块加密并转换回blob.然后将此blob放入FormData对象并提交给服务器.服务器将连接这些blob.使用浏览器加密和解密一个块正在运行.现在我正在下载和解密多个块.
还有一些问题需要解决:
以下是一个强有力的文件保护解决方案.
优点:
缺点:
如果它是你需要的,那就去吧^^.注意:以下所有内容都发生在服务器端.
这意味着只有已登录的用户才能以普通方式访问数据.并且只有数据所属的用户.访问用户数据的唯一可能是知道他的密码.
注意:如果上传文件和读取文件的一个是不是同一个人用户,可以使用的非对称和对称加密相结合,而不是:
上传文件时,使用收件人的公钥进行非对称加密.
(新)非对称加密似乎比对称加密慢得多(10-100倍,取决于算法/架构).因此,它是更好的生成随机数(会话密钥),非对称加密两次(一次用发送者的公钥,一旦与接收方的公钥)并储存它们.然后使用对称加密来加密文件(使用普通会话密钥作为对称密钥).
当收件人想要访问该文件时:
a)用他的哈希或密码依赖来破译他的私钥.
b)使用私钥对文件进行非对称解密.
b)(新)使用私钥解密收件人的加密会话密钥.然后使用对称解密来解密文件.
希望这可以帮助.