客户端(javascript)文件上传加密

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.使用浏览器加密和解密一个块正在运行.现在我正在下载和解密多个块.

还有一些问题需要解决:

  • 文件名丢失,尚无法为文件对象设置FileName.
  • 加密仍然阻塞(没有ui更新),但我想我可以通过webworkers解决这个问题.
  • 下载时我无法预测块大小.未加密的块大小是已知的,但对于加密数据,这似乎有所不同.这个加密数据以JSON格式存储,我不想做字符串搜索}.而且我不想存储这个服务器端.
  • 虽然我正在读取文件块,但Firefox似乎有内存泄漏或将完整文件读入内存.这成为多千兆字节文件的问题.

Vin*_*ler 6

以下是一个强有力的文件保护解决方案.

优点:

  • 攻击者可以访问服务器但无法使用该数据.
  • 即使您(开发人员)也无法访问数据.

缺点:

  • 如果用户丢失了密码,数据也会丢失.
  • 即使您(开发人员)也无法访问数据(这意味着如果遇到任何问题,您无法帮助用户).

如果它是你需要的,那就去吧^^.注意:以下所有内容都发生在服务器端.

  1. 使用https进行所有传输
  2. 当用户登录时,创建用户密码的哈希值(例如sha(密码+盐))
  3. 将哈希存储在用户的会话中
  4. 上传完成后,使用对称加密(例如AES)以存储在会话中的哈希作为密钥来加密数据.
  5. 下载完成后,使用相同的对称解密方法解密文件并将其发送回用户.

这意味着只有已登录的用户才能以普通方式访问数据.并且只有数据所属的用户.访问用户数据的唯一可能是知道他的密码.

注意:如果上传文件和读取文件的一个是不是同一个人用户,可以使用的非对称和对称加密相结合,而不是:

  1. 为收件人生成公钥/私钥对.
  2. (对称)使用收件人的哈希或其密码的依赖关系加密私钥.
  3. 上传文件时,使用收件人的公钥进行非对称加密.

  4. (新)非对称加密似乎比对称加密慢得多(10-100倍,取决于算法/架构).因此,它是更好的生成随机数(会话密钥),非对称加密两次(一次用发送者的公钥,一旦与接收方的公钥)并储存它们.然后使用对称加密来加密文件(使用普通会话密钥作为对称密钥).

  5. 当收件人想要访问该文件时:

    a)用他的哈希或密码依赖来破译他的私钥.

    b)使用私钥对文件进行非对称解密.

    b)(新)使用私钥解密收件人的加密会话密钥.然后使用对称解密来解密文件.

希望这可以帮助.