[CISCN 2023 初赛]go_session 解题思路&过程

过程

下载题目的附件,是用go的gin框架写的后端,cookie-session是由gorilla/sessions来实现,而sessions库使用了另一个库:gorilla/securecookie来实现对cookie的安全传输。这里所谓的安全传输,是指保证cookie中的值不能被看出来(通过加密实现,可选)、保证传输的cookie不会被篡改。

securecookie的编码函数一共有四个主要步骤来实现这一目的:

  1. 序列化,cookie的值可以有多种形式,首先将其序列化为字节切片,方便后续操作。
  2. 加密(这一步是可选的),使用指定的对称加密方法、加密密钥,进行对value进行加密。
  3. 计算MAC值,以保证不被篡改,这里的MAC是Message Authentication Code的缩写。如何计算呢,通过指定的哈希函数来计算,对上述的加密后的value求一个摘要。
  4. 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
	}
	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值