Encryption 如何在golang中使用AES256-GCM加密文件?
AES256-GCM可在go as中实施 但是,Encryption 如何在golang中使用AES256-GCM加密文件?,encryption,go,block-cipher,Encryption,Go,Block Cipher,AES256-GCM可在go as中实施 但是,Seal接口方法cipher.AEAD有签名: Seal(dst, nonce, plaintext, additionalData []byte) []byte 因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的 一种可能的方法是在Seal和Open上实现Reader/Writer接口,但这不应该通过AEAD的分组密码“模式”来解决吗?所以我想知道这是golang密码库的设计错误,还是我错过了GCM的一些重要功能?这不是设计错误
Seal
接口方法cipher.AEAD
有签名:
Seal(dst, nonce, plaintext, additionalData []byte) []byte
因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的
一种可能的方法是在
Seal
和Open
上实现Reader
/Writer
接口,但这不应该通过AEAD的分组密码“模式”来解决吗?所以我想知道这是golang密码库的设计错误,还是我错过了GCM的一些重要功能?这不是设计错误。只是API在这方面是不完整的
GCM是一种流式操作模式,因此能够在不停止流的情况下按需处理加密和解密。您似乎无法将相同的AEAD实例与以前的MAC状态一起重用,因此无法直接将此API用于GCM加密
您可以在
crypto.NewCTR
和您自己的GHASH实现之上实现您自己的GCM。AEADs不应用于一次性加密大量数据。API旨在阻止这种情况
在一次操作中加密大量数据意味着a)所有数据必须保存在内存中,或者b)API必须通过返回未经验证的明文以流方式运行
返回未经验证的数据是危险的,在互联网上发现有人建议使用gpg-d your_archive.tgz.gpg | tar xz
,因为gpg命令还提供流媒体接口
当然,使用AES-GCM这样的结构很容易
如果应用程序不支持,可以随意操作纯文本
在处理之前对其进行身份验证。即使应用程序很小心
在验证真实性之前,不要将明文“发布”到UI
一个流媒体设计暴露了更多的程序攻击面
通过规范大型密文,从而流式API,下一步
出现的协议更有可能在没有意识到的情况下使用它们
这些问题,因此问题依然存在
最好将明文输入分块成相当大的数据块
部分(比如16KiB)并单独加密。这些块只需要
足够大,因此额外验证器的开销是
可以忽略不计的有了这样的设计,可以以增量的方式处理大型消息
无需处理未经验证的明文即可处理,以及
AEAD API可以更安全。(更不用说更大的消息可以
自AES-GCM以来处理,例如,单个
纯文本。)
需要考虑一些问题,以确保数据块处于正确的位置
顺序,即通过计算nonce,第一个块应该是第一个,即从零开始,最后一个块应该是第一个
最后,即通过在空的终止符块上附加特殊的
其他数据。但这并不难
例如,请参见中使用的分块
即使有这样的设计,攻击者仍然会造成
要检测到截断的消息。如果你想要更高的目标,一个
可以使用all或nothing转换,尽管这需要两个
传递输入,但并不总是可行的。谢谢!作为建议,我认为这个解释可以添加到golang文档中。miniLock的链接给出了“404-未找到页面”。