can*_*an. 5 encryption go block-cipher
AES256-GCM可以在https://gist.github.com/cannium/c167a19030f2a3c6adbb5a5174bea3ff中实现
但是,Seal接口方法cipher.AEAD具有签名:
Seal(dst, nonce, plaintext, additionalData []byte) []byte
Run Code Online (Sandbox Code Playgroud)
因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的。
一种可能的方法是在和上实现Reader/ Writer接口,但是不是由AEAD的那些分组密码“模式”解决吗?所以我想知道这是否是golang密码库的设计错误,还是我错过了GCM的重要知识?SealOpen
AEAD 不应用于一次性加密大量数据。API 旨在阻止这种情况发生。
在一次操作中加密大量数据意味着 a) 所有数据都必须保存在内存中,或者 b) API 必须通过返回未经身份验证的明文以流方式操作。
返回未经验证的数据是危险的,不难在互联网上找到人们提出类似的建议gpg -d your_archive.tgz.gpg | tar xz,因为 gpg 命令还提供了流接口。
当然,使用 AES-GCM 等结构,如果应用程序在处理前未对其进行身份验证,则很容易随意操作明文。即使应用程序小心翼翼地在确定真实性之前不要将明文“发布”到 UI,流式设计也会暴露更多的程序攻击面。
通过规范化大型密文并因此流式传输 API,下一个出现的协议更有可能在没有意识到问题的情况下使用它们,因此问题仍然存在。
优选地,明文输入将被分成相当大的部分(例如 16KiB)并单独加密。这些块只需足够大,以便附加验证器的开销可以忽略不计。通过这样的设计,可以增量处理大消息,而无需处理未经身份验证的明文,并且 AEAD API 可以更安全。(更不用说可以处理更大的消息,因为 AES-GCM 对单个明文有 64GiB 的限制。)
需要一些想法来确保块的顺序正确,即通过计算随机数,第一个块应该是第一个,即从零开始随机数,最后一个块应该是最后一个,即通过附加一个空,带有特殊附加数据的终止符块。但这并不难。
有关示例,请参阅miniLock中使用的分块。
即使采用这样的设计,攻击者仍然可以导致消息被可检测地截断。如果您想要更高的目标,可以使用全有或全无变换,尽管这需要对输入进行两次传递并且并不总是可行。
| 归档时间: |
|
| 查看次数: |
2526 次 |
| 最近记录: |