为了账号安全,请及时绑定邮箱和手机立即绑定

Golang AES StreamReader 加密 - 示例省略了对加密数据的任何身份验证

Golang AES StreamReader 加密 - 示例省略了对加密数据的任何身份验证

Go
守着一只汪 2021-10-04 16:50:43
最后,我在 StackOverflow 上发布了我的第一个问题。我已经使用这个网站多年了,我总能找到对我所有问题的很好的答案:)我正在实现一个基于官方 Golang 密码示例的文件加密后台守护程序:func ExampleStreamReader() {    key := []byte("example key 1234")    inFile, err := os.Open("encrypted-file")    if err != nil {        panic(err)    }    defer inFile.Close()    block, err := aes.NewCipher(key)    if err != nil {        panic(err)    }    // If the key is unique for each ciphertext, then it's ok to use a zero    // IV.    var iv [aes.BlockSize]byte    stream := cipher.NewOFB(block, iv[:])    outFile, err := os.OpenFile("decrypted-file", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)    if err != nil {        panic(err)    }    defer outFile.Close()    reader := &cipher.StreamReader{S: stream, R: inFile}    // Copy the input file to the output file, decrypting as we go.    if _, err := io.Copy(outFile, reader); err != nil {        panic(err)    }    // Note that this example is simplistic in that it omits any    // authentication of the encrypted data. If you were actually to use    // StreamReader in this manner, an attacker could flip arbitrary bits in    // the output.}func ExampleStreamWriter() {    key := []byte("example key 1234")    inFile, err := os.Open("plaintext-file")    if err != nil {        panic(err)    }    defer inFile.Close()    block, err := aes.NewCipher(key)    if err != nil {        panic(err)    }    // If the key is unique for each ciphertext, then it's ok to use a zero    // IV.    var iv [aes.BlockSize]byte    stream := cipher.NewOFB(block, iv[:])    outFile, err := os.OpenFile("encrypted-file", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)    if err != nil {        panic(err)    }    defer outFile.Close()    writer := &cipher.StreamWriter{S: stream, W: outFile}    // Copy the input file to the output file, encrypting as we go.    if _, err := io.Copy(writer, inFile); err != nil {        panic(err)    }以下引用是什么意思。关于提供安全加密和解密我应该注意什么?请注意,此示例很简单,因为它省略了对加密数据的任何身份验证。如果您真的以这种方式使用 StreamReader,攻击者可以翻转输出中的任意位。谢谢!
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

来自维基百科:


分组密码模式 ECB、CBC、OFB、CFB、CTR 和 XTS 提供机密性,但它们不能防止意外修改或恶意篡改。


一个很好的解释可以在这里找到:https : //security.stackexchange.com/a/33576。


Go 支持其他支持完整性和身份验证检查的模式。正如 rossum 所说,您可以使用GCM或CCM。您可以在godoc.org上找到很多示例。例如 HashiCorp 的成员列表库。


另一个库值得检查是NaCl的端口golang.org/x/crypto/nacl:


func Open(out []byte, box []byte, nonce *[24]byte, key *[32]byte) ([]byte, bool)

func Seal(out, message []byte, nonce *[24]byte, key *[32]byte) []byte

如果您正在处理小消息,这个 API 可能会更容易使用。


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信