在 HTTPS 时代对请求进行签名是否还有必要?

2023-09-25 19:21:43 +08:00
 cheetah

今天看到百川大模型的接口文档 https://platform.baichuan-ai.com/docs/api 中要求对请求内容和时间戳进行签名,想到前几天在 V2EX 看到的帖子吐槽腾讯大模型 API 的签名( https://v2ex.com/t/975832 )。

而我们去看 OpenAI 等公司提供的 API ,是不需要这种签名的。

所以想讨论一下,在 HTTPS 时代这种签名是否还有必要?还是一种思维惯性?

我的理解:在 HTTPS 之前,这样的签名可以有效防止请求内容被篡改,是很有必要的,但现在 HTTPS 普及了,这里的好处并不存在了。另一点是重放攻击,我了解不多,请懂的朋友讲讲。

9463 次点击
所在节点    程序员
135 条回复
fengw233
2023-09-27 16:21:29 +08:00
https 是可以被劫持的,可以通过攻击请求方拿到请求数据向 api 发起重放,签名可以避免身份验证信息明文传输 以及防止重放攻击
R4rvZ6agNVWr56V0
2023-09-27 16:27:53 +08:00
如果接口已经使用了 HTTPS(HTTP over TLS/SSL),那么参数签名的必要性会降低一些:
HTTPS 本身就可以防止中间人攻击,数据传输在加密通道内,参数不易被篡改。
但 HTTPS 无法防止客户端篡改参数后再发送请求的情况。此时参数签名可以作为最后防线,检测参数是否被篡改。

一些特殊攻击如重放攻击,HTTPS 也无法直接识别和防护。参数签名可以识别非法重复请求。
如果应用很关注请求参数的完整性,并且接口对传入参数做进一步校验使用,那么签名依然可以作为辅助手段。
所以,如果仅仅考虑传输安全性,在使用 HTTPS 的前提下,参数签名的防护效果会受到一定程度的冲减。

但总的来说,参数签名作为一种应用层的安全机制,它的价值并不完全取决于传输层是否使用 HTTPS 。
如果成本允许,最稳妥的做法是:
- 使用 HTTPS 加密传输
- 加上参数签名的验证
- 合理限制接口调用频率
- 以获得最全面深度的防护效果。这种多层防护的合作也是 RESTful 接口安全设计的一个好习惯。
me1onsoda
2023-09-27 16:32:22 +08:00
@xmumiffy #116 "这个问题的关键在于 HTTPS 链路上可不可以明文传递 key"
key 加密有什么意义?加密方式都是公开的对称的,谁都能解开
106npo
2023-09-27 16:37:50 +08:00
@me1onsoda 还是看下题目吧,这里说的是 api-key ,key 压根不用于加密,明文传递 key 用于确认身份的.
106npo
2023-09-27 16:40:06 +08:00
@me1onsoda 你就当这个 key 是无法被列举出来的 user_id 就行
rekulas
2023-09-27 21:32:41 +08:00
@CRUD 大家讨论的都是应用层的啊,应用层重放跟 tls 没半毛钱关系,我能拿到你数据直接正常握手推修改的参数就行了
106npo
2023-09-27 22:36:03 +08:00
@rekulas 你怎么拿得到?这里讨论的都不是客户端 API ,是服务器端的
rekulas
2023-09-27 23:01:30 +08:00
@xmumiffy 上面已经 n 个人说过 n 遍了 随便一个中间人攻击就拿到了
106npo
2023-09-28 09:15:25 +08:00
@rekulas https 防的不就是中间人攻击,能攻破 PKI 的看的上我的接口那我也太成功了,市值怎么也得先超过苹果加谷歌之和吧。
CRUD
2023-09-28 09:57:03 +08:00
@rekulas #126 问题是你拿不到数据,这种情况下,中间人能拿到的顶多就是 HTTPS 的密文,密文拿到了你也没法修改,想要拿到明文数据,除非你入侵到本机,在发起端上添加对中间人证书的信任。
rekulas
2023-09-28 12:52:44 +08:00
@xmumiffy 我不知道你想表达什么,讨论的是签名有无意义莫名其妙扯到能不能劫持数据去了,如果你想讨论签名有无意义看帖子别 @我


@CRUD 说的当然就是中间人劫持,例如你做一个 app ,不做签名只需要小白中间人劫持就能拿到你通信方式,简简单单就可以模拟 app 请求服务端了,如果做了签名小白就搞不定了,得经验更丰富的开发者逆向分析代码才行,提高了攻击成本,如果签名后再加密,那攻击成本就更高了

签名和加密基本要选择一个,我逆向过的 app 也有数十款了,就没大公司 app 敢直接 https 推消息的,做了签名还要做加密的也不少(字节系的特别喜欢)
106npo
2023-09-28 13:49:02 +08:00
#131
那看来我们是鸡同鸭讲了,他只了解他做的有关 APP 端的东西,对其他事务一点也不了解.
#127 中我就已经说了这里讨论的是服务器端的 API,并不是 APP 端的.
CRUD
2023-09-28 13:49:44 +08:00
@rekulas #131 我一开始就说了是服务器对服务器单向调用的情况下,回答的是题主说的 public API 的场景,你非要说其他场景,那签名也却有其存在的道理。
rekulas
2023-09-28 14:16:38 +08:00
@CRUD 抱歉看错了 没注意你说的是单纯服务器端通信
hanyuwei70
2023-09-30 09:12:07 +08:00
@cheetah 简单讲就是防篡改,为什么在 https 下还需要防篡改就要自己看原文了

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

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

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

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

© 2021 V2EX