Golang Go语言中gin对于请求参数解密处理的优雅实现

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

Golang Go语言中gin对于请求参数解密处理的优雅实现

本人要使用 gin 框架写 API 供安卓端调用,迫于安全,客户端会使用 AES 对每个字段进行加密传输,那么服务端这边有没有办法用中间件统一解密,不影响业务使用 ctx.PostForm(“xxx”)获取字段解密后的值? 或者有没有其他更优雅的实现?

20 回复

在 gateway 做

更多关于Golang Go语言中gin对于请求参数解密处理的优雅实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


啥优雅不优雅的,自己写个方法间接调用 ctx.PostForm 并解密

一种就是直接用中间件函数把 body 里的 json 每个字段遍历后解密丢回去 body 就行了,然后 用 shouldbind 。
另一种就是把 shouldbind 和解密的反射函数给封装起来就行了,这样结构体的就得到的是解密后的,当然你要考虑实现的话支持切片的问题就行了把。

讲道理,这个是不是应该在别的层做?
直接 TLS 加密一次?

感谢,第一种方式,遍历解密后怎么丢回 body,有支持的方法吗?


if c.Request.Body != nil {
bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
}
//解密
// 复用
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

单纯从技术上来说,这种加密方式,还不如设计一种私有的数据传输协议,统一使用 body 传参,不用考虑参数是 query, form, body 了。
对于现有的加密方式,即使用中间件来做也会导致后期代码维护性的问题,因为 API 有很多,每个 API 的传参都不一样,难道为每个 API 或每类 API 或特定需要加密的字段写一个中间件?后续需求变动,导致某 API 不能再归为此类又需要改。

gin 每个路由的 handle 可以填多个的,gin.GET("/xxx",handel1,handle2) handle1 就是解密的方法 或者 前面搞个 gin.Use(handle1),但是这样就所有的接口都要解密了,前种方法可以在需要的地方解密,当然第二种方法也能搞个白名单不解密

这样?

golang<br><br> gin.New().Use(func(c *gin.Context) {<br> c.Request.ParseForm()<br> encrypetData := c.Request.PostForm.Get("encrypetData")<br> c.Request.PostForm = Decrypet(encrypetData)<br> c.Next()<br> })<br>

gin 自己的中间件设计还不够优雅吗?

好好的 TLS 为啥不用

middleware ?

直接 tls 不就行了,为啥要自己再加密?怕 mitm 的话配上 mtls 和 ssl pinning 。

不要每个字段加密,对 json body 加密

直接 TLS 就行了啊, 怕爬就加个参数 normalize, 不符合的直接在 nginx 层 ban 掉

#16 normalize 什么意思?

客户端会使用 AES 对每个字段进行加密传输

同意#7 楼的,直接对整个 body 加密,网关解密后再丢给后端,0 侵入




显然不是 TLS 的问题。这种事我们公司也有在做,主要目的是针对黑产(至少提高了门槛)

在Golang中使用Gin框架时,对于请求参数的解密处理,可以通过中间件的方式优雅地实现。以下是一个基本思路:

  1. 定义解密函数: 首先,你需要一个解密函数,这个函数接受加密的字符串并返回解密后的原始数据。这个函数可以根据你使用的加密算法(如AES、RSA等)来实现。

  2. 创建中间件: 在Gin中,中间件可以用来处理请求和响应的预处理和后处理工作。你可以编写一个中间件来自动解密请求参数。这个中间件会读取请求体或查询参数中的加密数据,解密后将其设置到上下文中,以便后续的处理器(Handler)可以使用。

  3. 注册中间件: 在创建Gin引擎后,使用Use方法注册你的解密中间件。这样,所有通过该Gin引擎处理的请求都会先经过你的解密中间件处理。

  4. 在Handler中使用解密后的数据: 在你的Handler函数中,你可以从上下文中获取解密后的数据,然后进行后续的业务逻辑处理。

这种方法的优点是:

  • 代码解耦:解密逻辑与业务逻辑分离,提高了代码的可维护性。
  • 复用性强:解密中间件可以复用于多个路由或整个应用。
  • 安全性高:确保所有请求参数在进入业务逻辑前都被正确解密和验证。

通过这种方式,你可以优雅地在Gin框架中实现请求参数的解密处理。

回到顶部