Golang Go语言中如何实现基于 aes-ctr+s3 的中转加解密

发布于 1周前 作者 songsunli 来自 Go语言

想实现那种基于 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 Go语言中如何实现基于 aes-ctr+s3 的中转加解密的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中实现基于AES-CTR(高级加密标准-计数器模式)和Amazon S3的中转加解密,可以遵循以下步骤:

  1. AES-CTR加密/解密

    • 使用标准库crypto/aescrypto/cipher来实现AES-CTR加密。
    • 创建一个新的AES cipher block,并使用cipher.NewCTR来初始化一个CTR模式的stream cipher。
    • 使用一个nonce(唯一值,例如UUID)作为初始计数器值,以确保加密的唯一性和安全性。
    • 加密时,将明文和nonce一起加密;解密时,先提取nonce再进行解密。
  2. Amazon S3存储/读取

    • 使用AWS SDK for Go来与S3交互。
    • 在上传前,将加密后的数据(包括nonce)作为对象存储。
    • 下载时,从S3读取数据,首先提取nonce,然后进行解密。
  3. 综合实现

    • 编写一个函数,该函数接受明文和S3对象信息(如bucket name和key),加密明文并上传到S3。
    • 编写另一个函数,该函数从S3下载加密数据,提取nonce并解密。
  4. 注意事项

    • 确保密钥管理安全,避免硬编码在代码中。
    • 使用HTTPS来与S3通信,以防止数据在传输过程中被窃取。
    • 考虑错误处理和重试机制,以增强系统的健壮性。

通过上述步骤,你可以在Golang中实现基于AES-CTR和S3的中转加解密,确保数据在传输和存储过程中的安全性。

回到顶部