我该如何使用客户端JavaScript加密大文件?

9

我正在为一种文件传输协议进行客户端加密(这样即使服务器也不知道文件是什么)。我的当前方法是将文件导入浏览器文件系统、将文件分成 1 MB 的块,存储每个块在内存中,使用 AES 加密每个块,然后连接所有块并上传。这可以防止内存过载,但效率较低。是否有更好的方法?有没有一种方式可以在浏览器文件系统中对整个文件进行加密?谢谢!


像AES这样的加密方案通常都是以块的形式工作的,因此我不确定自己对文件进行分块是否有多大好处(如果有的话)。您尝试过在整个文件上使用SJCL并查看其表现如何吗? - Matt Ball
分块是为了防止RAM超载,因为加载大文件会导致页面崩溃。 - Raphie
你能定义一个“大”文件吗? - Will Bickford
可能是重复问题:https://dev59.com/onRA5IYBdhLWcg3w4SDo。另外,也可以查看从那里链接过来的http://crypto.stanford.edu/sjcl/。 - Will Bickford
3
你有没有为此找到解决方案,@Raphie? - Vineet
显示剩余3条评论
1个回答

1
使用加密或其他密码学原语之前,应首先创建一个可信的威胁模型。您打算使用基于JavaScript的加密来防止应用程序遭受什么威胁?如果威胁来自网络上的某个人,则我们有很棒的工具可以防止基于网络的攻击 - 我们称其为带有TLS的HTTPS,而且它是免费使用的 - JavaScript无法提供替代方案。
一些实验性的“端到端”(e2e)聊天应用程序使用基于JavaScript的加密。但是,“承诺不窥探”的加密实际上并不能保护客户端免受服务器的影响 - 恶意JavaScript可以访问这些密钥,并且服务器选择不读取它们 - 这不是安全的。
任何本地攻击(或RCE)或跨域攻击(XSS)都无法通过基于JavaScript的加密进行防止 - 同样,HTTPS也无法防止这些攻击。缺乏可信威胁行为者是加密从未由客户端执行的原因 - 而是通常由应用程序服务器或{{link1:后端数据库加密静止敏感字段}}执行。这是因为后端可以将秘密保护在不受信任的客户端之外。
如果您想更好地了解开发人员如何编写安全应用程序,请考虑阅读{{link2:OWASP十大安全漏洞}}("JavaScript加密"未被列为其中之一)。

虽然与所提出的问题有关,但我认为这并不是他问题的真正答案。你假设他是出于安全原因进行加密,但他可能仅仅是出于隐私原因进行加密。 - spazworm
IT安全通常被认为包括保密性、完整性和可用性(尽管我个人认为这是一个限制性的概念,但让我们继续使用它)。加密以实现“隐私”直接与保密性相关联。因此,上述评论对我来说几乎没有意义;如果不是出于安全原因,为什么要加密呢? - Maarten Bodewes
这个回答在2022年使用webcrypto api仍然有效吗?我也在尝试类似的东西。或者在客户端加密不安全吗? - Tan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接