想实现那种基于 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
})
结果是播放一半直接不能播放了 显示视频时长是对的
看了看别人家的实现。好复杂。。