gin 对于请求参数解密处理的优雅实现

2021-03-10 17:07:32 +08:00
 iqingqian

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

3026 次点击
所在节点    Go 编程语言
19 条回复
demobin
2021-03-10 17:09:46 +08:00
在 gateway 做
keepeye
2021-03-10 17:11:34 +08:00
啥优雅不优雅的,自己写个方法间接调用 ctx.PostForm 并解密
kiripeng
2021-03-10 17:18:55 +08:00
一种就是直接用中间件函数把 body 里的 json 每个字段遍历后解密丢回去 body 就行了,然后 用 shouldbind 。
另一种就是把 shouldbind 和解密的反射函数给封装起来就行了,这样结构体的就得到的是解密后的,当然你要考虑实现的话支持切片的问题就行了把。
hxndg
2021-03-10 17:20:55 +08:00
讲道理,这个是不是应该在别的层做?
直接 TLS 加密一次?
iqingqian
2021-03-10 17:24:12 +08:00
@kiripeng 感谢,第一种方式,遍历解密后怎么丢回 body,有支持的方法吗?
kiripeng
2021-03-10 17:31:52 +08:00
@iqingqian
if c.Request.Body != nil {
bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
}
//解密
// 复用
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
xkeyideal
2021-03-10 17:32:10 +08:00
单纯从技术上来说,这种加密方式,还不如设计一种私有的数据传输协议,统一使用 body 传参,不用考虑参数是 query, form, body 了。
对于现有的加密方式,即使用中间件来做也会导致后期代码维护性的问题,因为 API 有很多,每个 API 的传参都不一样,难道为每个 API 或每类 API 或特定需要加密的字段写一个中间件?后续需求变动,导致某 API 不能再归为此类又需要改。
MidGap
2021-03-10 17:32:32 +08:00
gin 每个路由的 handle 可以填多个的,gin.GET("/xxx",handel1,handle2) handle1 就是解密的方法 或者 前面搞个 gin.Use(handle1),但是这样就所有的接口都要解密了,前种方法可以在需要的地方解密,当然第二种方法也能搞个白名单不解密
iqingqian
2021-03-10 17:56:23 +08:00
@kiripeng 感谢
writesome6
2021-03-10 18:17:35 +08:00
这样?

```golang

gin.New().Use(func(c *gin.Context) {
c.Request.ParseForm()
encrypetData := c.Request.PostForm.Get("encrypetData")
c.Request.PostForm = Decrypet(encrypetData)
c.Next()
})
```
lewinlan
2021-03-10 19:45:01 +08:00
gin 自己的中间件设计还不够优雅吗?
ratazzi
2021-03-10 20:03:44 +08:00
好好的 TLS 为啥不用
asAnotherJack
2021-03-10 20:07:28 +08:00
middleware ?
Jirajine
2021-03-10 20:25:43 +08:00
直接 tls 不就行了,为啥要自己再加密?怕 mitm 的话配上 mtls 和 ssl pinning 。
FucUrFrd
2021-03-10 23:25:17 +08:00
不要每个字段加密,对 json body 加密
qoras
2021-03-10 23:28:54 +08:00
直接 TLS 就行了啊, 怕爬就加个参数 normalize, 不符合的直接在 nginx 层 ban 掉
liyaojian
2021-03-11 00:07:34 +08:00
@qoras #16 normalize 什么意思?
cominghome
2021-03-22 09:05:48 +08:00
客户端会使用 AES 对每个字段进行加密传输

同意#7 楼的,直接对整个 body 加密,网关解密后再丢给后端,0 侵入
cominghome
2021-03-22 09:08:17 +08:00
@Jirajine
@qoras

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760401

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX