在 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 普及了,这里的好处并不存在了。另一点是重放攻击,我了解不多,请懂的朋友讲讲。

9449 次点击
所在节点    程序员
135 条回复
cosiner
2023-09-27 11:29:04 +08:00
HTTPS 是保证链路安全, 请求签名是鉴别请求者身份的, 作用都不一样
Wetoria
2023-09-27 11:33:42 +08:00
昨天看到了,今天还在讨论😂。

客户端加密不就是为了防止接口被不信任的人调用嘛?做过爬虫就知道了。有签名和没签名的平台,实现爬虫的工作量完全不在一个量级。

https 防止的只是在传输过程中,数据不是明文,不被直接曝光。
LynFt
2023-09-27 11:34:51 +08:00
@xmumiffy ssl 防的是第三方,签名防的是用户自己.按照银行保险柜来举例子,我老婆也知道保险柜密码,现在我和她离婚了,你怎么防?
106npo
2023-09-27 11:34:54 +08:00
@Wetoria 这个问题讨论的不是客户端 API ,而是服务端 API
106npo
2023-09-27 11:36:00 +08:00
@LynFt 向他人透露密码后果自负.
"签名防的是用户自己",对不起,签名方法也是公开的.
106npo
2023-09-27 11:38:09 +08:00
@Wetoria 这个情况下,签名算法是公开的.所以你是把你的用户开发者当爬虫防啊
LynFt
2023-09-27 11:38:50 +08:00
@xmumiffy 签名方法是公开的,所以我说的是提高攻击难度,而不是防止攻击.
brader
2023-09-27 11:40:08 +08:00
有必要,而且是有使用场景的。
比如某些不需要登录的公开 API:
无签名机制:直接抓包工具抓到接口就可薅你接口的羊毛。
有签名机制:抓包抓到接口无用,还需要反编译你的 APP ,并从混淆过的屎山代码中,找出你的签名规则部分的代码,才可薅你接口的羊毛。

虽然最终结果都是可被破解的,但我们能看到,有签名机制,增加了破解难度,可以拦截掉一大部分只是尝试心态、无能力或者无时间、无精力去反编译代码找签名规则的人。
106npo
2023-09-27 11:44:20 +08:00
@brader

你不需要什么抓包工具啊,api 文档公开网上随便下.
你的破解难度就在于怎么获取到一个有效的 api key .
你能拿到一个有效的 key,不管有没有签名都一样能用,最多就是要照着文档写一遍签名.
然后一般服务商都直接提供 SDK 帮你写了签名函数.你看服务商多好,还帮你去破解他.

或者你只是看了标题,没看内容. 这个问题讨论的不是客户端 API,而是服务商提供给别的开发者用于服务端的 API.
brader
2023-09-27 11:47:49 +08:00
@xmumiffy 奥这个啊,我以为说的是给自家 APP 用的服务端 API 呢
wuwukai007
2023-09-27 11:48:18 +08:00
参数签名加密,如果数据比较重要,对爬虫还是有点效果的
momocraft
2023-09-27 11:57:20 +08:00
讨论到现在看到的真实好处也就一个增加爬取成本
而且这是公司的好处,不是密钥没泄漏的客户的好处

说到底市场定位不一样
有的公司比如企鹅,客户捏着鼻子也得用
有的公司可能觉得自己是企鹅,或者觉得像企鹅一样折腾客户就能成为下一个企鹅
用户方便不方便最不重要,毕竟人的时间不值钱
Wetoria
2023-09-27 12:07:39 +08:00
@xmumiffy 好像是。是我欠思考了。
liuguang
2023-09-27 12:11:58 +08:00
请求签名是为了证明是你调用的,而不是别人。方便区分用户,如果不签名,别人就可以冒用你的身份。
Wetoria
2023-09-27 12:13:44 +08:00
@Wetoria 防爬虫也没必要。

前台直接调用本身还要考虑跨域问题,而解决跨域一般后端增加接口做转发。

既然做转发了,那 api key 本身就隐藏在后台,签不签名问题不大。
106npo
2023-09-27 12:23:07 +08:00
@liuguang 不签名用 key 也可以.
这个问题的关键在于 HTTPS 链路上可不可以明文传递 key
GuangXiN
2023-09-27 13:18:18 +08:00
几乎所有的 https API 都不会要求通过客户端证书建立 TLS 连接。apikey 、access_token 在每一次 API 请求时都会在网络上传输,只要一次 MITM 攻击就可能泄漏,风险较高,所以一般设计有效期都不会太长。secret 一经颁发就长期保存在客户的服务器上用于签名,不会再通过网络传输,泄漏的风险小很多。
dayeye2006199
2023-09-27 13:55:14 +08:00
X 经问题,我之前也问过: https://www.v2ex.com/t/868678#reply64

结论是:给恶意使用者制造一点麻烦,但是基本防不住厉害的东西。
因为别人都这么干,所以我也这么干就对了
QKgf555H87Fp0cth
2023-09-27 14:16:18 +08:00
需要,增加被攻击的成本。
iseki
2023-09-27 14:19:46 +08:00
只会增加开发成本,没必要

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

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

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

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

© 2021 V2EX