gpt4 book ai didi

javascript - 使用 WebCrypto API 加密大文件

转载 作者:行者123 更新时间:2023-12-01 16:18:25 25 4
gpt4 key购买 nike

我正在尝试使用 WebCrypto API 加密大文件 (> 1GB) .

加密小文件效果很好,但是当我尝试加密大文件时,我的浏览器挂起,似乎加密从未完成。

我认为最好的选择是读取和加密文件的 block ,然后在完成读取时将 block 合并在一起。

这里有没有人有加密和合并 block 的经验?如果是这样,如果有人可以向我展示一个示例或指出我正确的更正,我将不胜感激。

提前致谢!

最佳答案

显然,高级 WebCrypto API 的设计并未考虑到流式传输/大型消息。但是,如果您查看常见的密码操作模式,您会发现您可以使用不同的模式,从而可以连接不同的密文并获得完整的密文。

您可以将 AES-CBC 用于 1 MiB block (或 16 字节的任意倍数),并使用密文的倒数第一个 16 字节作为 IV 来加密下一个 block 。您将不得不关闭最后一个 block ,因为它包含任何 block 的加密填充,当然最后一个 block 除外。不幸的是,这不是完整性/身份验证模式,结果容易受到填充 oracle 攻击,所以我仍然不推荐它。此外,当您解除填充时,您无法使用相同的方法进行解密。

同样,您可以将计数器 (CTR) 模式与计数器一起使用,并以计数器值 <nonce>|0000000000000000 开始然后在 1 MiB 之后继续使用计数器值加密 <nonce>|0000000000010000 (因为 1 MiB 包含 65536 个 block ),然后使用 <nonce>|0000000000020000在 2 MiB 等之后。nonce 是前面 IV/初始计数器 block 中唯一的 8 字节值。该密码在加密和解密之间具有完美的对称性,并且不使用填充。然而,它很容易受到对手的改变;基本上,攻击者可以翻转密文中的任何字节,从而翻转明文中的任何位。这也可能导致更多的明文预言和泄露额外的信息。

请注意,您不能对 AEAD 密码(例如 GCM)做同样的事情。在这种情况下,您需要使用 nonce 和身份验证标签来扩展密文。但是您仍然可以加密,比如说,1 MiB 并将其扩展为 12 字节的随机数、1 MiB 的密文和 16 字节的身份验证标签。然后,您可以使用更大的 block 大小解密并取回 1 MiB 明文 block 。请注意,您仍然必须对身份验证标签执行 MAC,否则攻击者可能会重新排序 1 MiB + 28B 大小的 block 。一种方法是使用身份验证标签作为 AAD 输入来执行 0 字节 GCM 加密。

唷,我想这就是你在原始意图之外使用 API 所得到的。这是完全可能的,但是,是的,我猜需要进行一些研究。

在这里使用 1 MiB 表示 1024 x 1024 字节,或 1024 KiB。 super 意味着百万,不是 - 呃,我又忘记了确切的数量。

关于javascript - 使用 WebCrypto API 加密大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com