Golang Go语言中如何实现基于 aes-ctr+s3 的中转加解密
想实现那种基于 s3 协议的网络存储加密后的视频文件流式还原成原本内容
加密解密这么做的:
func encode(buff []byte) []byte {
key := []byte("1234567887654321")
iv := bytes.Repeat([]byte("0"), 16)
block, _ := aes.NewCipher(key)
stream := cipher.NewCTR(block, iv)
encoded := make([]byte, len(buff))
stream.XORKeyStream(encoded, buff)
return encoded
}
// 加解密密一个文件
readed, _ := open.ReadFile(test.mp4)
encryptd := encode(readed)
decrypted := encode(encrypted)
测试经过加密再解密后的文件 能正常打开也不影响播放
然后基于 http 这么写了个东西
http.HandleFunc("/test.mp4", (w,r) {
opened , _ := os.open("test.mp4")
// cipher.StreamReader 没有实现 io.Seeker
// 自己做了个 wrapper
/*
type myReader struct {
cipher.StreamReader
}
func (reader *myReader) Seek(offset int64, whence int) (int64, error) {
// os.open 返回的是 file ,是支持 seeker 的 streamreader 要求的接口是 io.reader
return reader.R.(io.Seeker).Seek(offset, whence)
}
*/
key := []byte("1234567887654321")
iv := bytes.Repeat([]byte("0"), 16)
block, _ := aes.NewCipher(key)
stream := cipher.NewCTR(block, iv)
reader := &myReader{StreamReader:cipher.StreamReader{R:open, S:stream} }
http.ServeContent(w,r,"test.mp4",time.Now(), reader)// 这个 reader 要求实现 io.Seeker
})
结果是播放一半直接不能播放了 显示视频时长是对的
看了看别人家的实现。好复杂。。
Golang Go语言中如何实现基于 aes-ctr+s3 的中转加解密
更多关于Golang Go语言中如何实现基于 aes-ctr+s3 的中转加解密的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
在Golang中实现基于AES-CTR(高级加密标准-计数器模式)和Amazon S3的中转加解密,可以遵循以下步骤:
-
AES-CTR加密/解密:
- 使用标准库
crypto/aes
和crypto/cipher
来实现AES-CTR加密。 - 创建一个新的AES cipher block,并使用
cipher.NewCTR
来初始化一个CTR模式的stream cipher。 - 使用一个nonce(唯一值,例如UUID)作为初始计数器值,以确保加密的唯一性和安全性。
- 加密时,将明文和nonce一起加密;解密时,先提取nonce再进行解密。
- 使用标准库
-
Amazon S3存储/读取:
- 使用AWS SDK for Go来与S3交互。
- 在上传前,将加密后的数据(包括nonce)作为对象存储。
- 下载时,从S3读取数据,首先提取nonce,然后进行解密。
-
综合实现:
- 编写一个函数,该函数接受明文和S3对象信息(如bucket name和key),加密明文并上传到S3。
- 编写另一个函数,该函数从S3下载加密数据,提取nonce并解密。
-
注意事项:
- 确保密钥管理安全,避免硬编码在代码中。
- 使用HTTPS来与S3通信,以防止数据在传输过程中被窃取。
- 考虑错误处理和重试机制,以增强系统的健壮性。
通过上述步骤,你可以在Golang中实现基于AES-CTR和S3的中转加解密,确保数据在传输和存储过程中的安全性。