过程
下载题目的附件,是用go的gin框架写的后端,cookie-session是由gorilla/sessions来实现,而sessions库使用了另一个库:gorilla/securecookie来实现对cookie的安全传输。这里所谓的安全传输,是指保证cookie中的值不能被看出来(通过加密实现,可选)、保证传输的cookie不会被篡改。
securecookie的编码函数一共有四个主要步骤来实现这一目的:
- 序列化,cookie的值可以有多种形式,首先将其序列化为字节切片,方便后续操作。
- 加密(这一步是可选的),使用指定的对称加密方法、加密密钥,进行对value进行加密。
- 计算MAC值,以保证不被篡改,这里的MAC是Message Authentication Code的缩写。如何计算呢,通过指定的哈希函数来计算,对上述的加密后的value求一个摘要。
- base64编码。
当解密时,反过来即可,因为上述用于加密的方法与加密密钥、用于认证的哈希方法与哈希密钥,都是在服务器端设置的。准确来说就是由这个securecookie库的SecureCookie接口所规定的,通过加密密钥与认证密钥,保证了cookie不会被解密、不会被篡改的两个目的。
// main.go
func main() {
r := gin.Default()
r.GET("/", route.Index)
r.GET("/admin", route.Admin)
r.GET("/flask", route.Flask)
r.Run("0.0.0.0:8000")
}
可以看到存在三个路由。根路由、/admin路路由、/flask路由。以下是根路由对应的处理函数。
// route.go
package route
var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
func Index(c *gin.Context) {
session, err := store.Get(c.Request, "session-name")
if err != nil {
http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
return
}