Golang Go语言中gin对于请求参数解密处理的优雅实现
Golang Go语言中gin对于请求参数解密处理的优雅实现
本人要使用 gin 框架写 API 供安卓端调用,迫于安全,客户端会使用 AES 对每个字段进行加密传输,那么服务端这边有没有办法用中间件统一解密,不影响业务使用 ctx.PostForm(“xxx”)
获取字段解密后的值?
或者有没有其他更优雅的实现?
在 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框架时,对于请求参数的解密处理,可以通过中间件的方式优雅地实现。以下是一个基本思路:
-
定义解密函数: 首先,你需要一个解密函数,这个函数接受加密的字符串并返回解密后的原始数据。这个函数可以根据你使用的加密算法(如AES、RSA等)来实现。
-
创建中间件: 在Gin中,中间件可以用来处理请求和响应的预处理和后处理工作。你可以编写一个中间件来自动解密请求参数。这个中间件会读取请求体或查询参数中的加密数据,解密后将其设置到上下文中,以便后续的处理器(Handler)可以使用。
-
注册中间件: 在创建Gin引擎后,使用
Use
方法注册你的解密中间件。这样,所有通过该Gin引擎处理的请求都会先经过你的解密中间件处理。 -
在Handler中使用解密后的数据: 在你的Handler函数中,你可以从上下文中获取解密后的数据,然后进行后续的业务逻辑处理。
这种方法的优点是:
- 代码解耦:解密逻辑与业务逻辑分离,提高了代码的可维护性。
- 复用性强:解密中间件可以复用于多个路由或整个应用。
- 安全性高:确保所有请求参数在进入业务逻辑前都被正确解密和验证。
通过这种方式,你可以优雅地在Gin框架中实现请求参数的解密处理。