最后,我在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.
}
以下引用是什么意思。关于我应该注意什么来提供安全的加密和解密?
请注意,此示例的简单之处在于它 省略对加密数据的任何认证。如果你真的 以这种方式使用StreamReader,攻击者可以任意翻转 输出中的位。
谢谢!
答案 0 :(得分:3)
来自维基百科:
分组密码模式ECB,CBC,OFB,CFB,CTR和XTS提供机密性,但它们不能防止意外修改或恶意篡改。
可在此处找到一个很好的解释:https://security.stackexchange.com/a/33576。
Go支持其他支持完整性和身份验证检查的模式。正如rossum所说,你可以使用GCM或CCM。你可以在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可能会更容易使用。