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

标签 encryption go aes encryption-symmetric

最后,我在 StackOverflow 上发布了我的第一个问题。我使用这个网站已经很多年了,我总是能找到所有问题的好答案:)

我正在实现一个基于 official Golang cipher example 的文件加密后台守护进程:

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)
    }

    // 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 decrypted result.
}

以下引述是什么意思。关于提供安全加密和解密我应该注意什么?

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.

谢谢!

最佳答案

来自维基百科:

The block cipher modes ECB, CBC, OFB, CFB, CTR, and XTS provide confidentiality, but they do not protect against accidental modification or malicious tampering.

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

Go 支持其他支持完整性和身份验证检查的模式。正如罗森所说,您可以使用 GCMCCM .您可以在 godoc.org 上找到很多示例.例如 HashiCorp 的 memberlist library .

另一个值得检查的库是 golang.org/x/crypto/nacl 中的 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 可能会更容易使用。

关于encryption - Golang AES StreamReader 加密 - 示例省略了加密数据的任何身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30138477/

相关文章:

java.security.NoSuchAlgorithmException :Cannot find any provider supporting AES/ECB/PKCS7PADDING

xml - 在go中遍历xml

c - C 中的 AES CBC 模式

ruby-on-rails - has_secure_password 是否使用任何形式的加盐?

android - 如何在c#中加密文件并在android和IOS上解密

session - 为什么要使用 gorilla/context 而不是 session 来进行用户身份验证?

google-app-engine - 如何使用GAE/SE go112将大文件上传到Google云端存储

java - 如何创建随机 AES 128 PrivateKey 和 IV 作为字符串?

python - 如何使用python读取加密文件夹