API 接口已经有 HTTPS 的前提下,为什么还需要签名机制?

2021-04-12 19:48:35 +08:00
 dzdh

注意场景:

综合以上三点。为什么在 Https 的保护下,还要额外做签名验证?

主要疑问,如 stripe 的退款接口

curl https://api.stripe.com/v1/refunds -u "$密钥:" -d charge=$charge_id

就可以发起一笔订单的退款或者扣款。按照某些论述的话,没有签名的 Stripe 岂不是非常危险?

12831 次点击
所在节点    SSL
248 条回复
screen
2021-04-12 19:52:18 +08:00
大多数攻击来自客户端的截取、伪造而非信息传递中
xmumiffy
2021-04-12 19:53:11 +08:00
是没必要
dzdh
2021-04-12 19:53:51 +08:00
@screen 如果 SSLPinning 无效的话,那客户端用『签名』也一样能截取啊
dzdh
2021-04-12 19:55:16 +08:00
@xmumiffy 国内大厂是出于什么样的考量呢?
iyaozhen
2021-04-12 19:56:22 +08:00
签名我记得是两边约定一个 token,把参数和 token 签一下,更安全

一般用在开放接口上吧,就是接口参数大家都知道,你别的地方不小心泄露参数了,就有风险
xmumiffy
2021-04-12 19:56:28 +08:00
@dzdh 十年前 http 年代我们是这么做的 现在也没必要改
des
2021-04-12 20:04:23 +08:00
我猜测可能是这几个原因
一是方便用 http,http 也方便调试
二是即使是服务端对服务端,走的是统一的网关,不想再搞一个域名
三是不少人对 https 认识不那么够,不会搞证书认证,毕竟资料也少,相对于签名
dzdh
2021-04-12 20:08:58 +08:00
@des

1 理解
2 网关统一 HTTPS 不是更简单了么都不用再配置啥
3 emmmm 理解
momocraft
2021-04-12 20:16:58 +08:00
签名虽然现在看觉得傻 十年前不失为一个 http 下能加密+防重放攻击的方案

另外市场地位不一样 要是 stripe 敢像企鹅这样一个 QR 码写出不到十种 API 可能活不到上市
akira
2021-04-12 20:18:01 +08:00
你要这么说的话,服务端对服务端 http 就够了,ssl 都不需要上
ihipop
2021-04-12 20:22:51 +08:00
现在很多方案是前端 HTTPS 网关后面业务系统是 HTTP,如果做使用客户端做 SSL 认证,整个系统都需要要改造,不可能业务系统身份认证全做网关上吧? SSL 只 pin 服务端的证书没法验证客户身份,签名不仅仅可以防篡改,还能客户做身份认证
dzdh
2021-04-12 20:33:02 +08:00
@ihipop 还好吧,客户端证书在网关直接验证好的,到后面的 HTTP 业务的时候直接带着 https_s|c_xx 的 header 头的哇而且还伪造不了
dzdh
2021-04-12 20:33:21 +08:00
@ihipop 不是老系统改造,是新系统
wooyuntest
2021-04-12 20:56:35 +08:00
加大直接构造数据向接口发请求的难度(还得逆向 app 拿到签名算法)
dzdh
2021-04-12 20:58:55 +08:00
@wooyuntest 找密钥吧。这是客户端场景了,即便如此,仅使用 HTTPS 直接传递 ukey 的话也得逆向啊。
HOOK 方案的话无论任何方案都没辙吧。
kejialiu
2021-04-12 21:57:13 +08:00
签名是一次性的,只针对这个请求,就算被截获了也伤害不大。密钥不管什么原因被泄露了,后续所有请求都可以伪造,所以能不暴露就不暴露,哪怕是加密通道
dzdh
2021-04-12 23:05:50 +08:00
@kejialiu

一次性的根本原因是因为有 nonce 。以此为目的达到防 Replay Attack 。

但是究其根本,HTTPS 本身被抓到已有也是个无法篡改的普通 TCP 数据包。重放攻击也只能将这个数据包无数次发送给对方服务器。也就是说,只要在普通的请求参数中加入任意一个具备 nonce 特性的参数如 timestamp,那这个数据包依然可以被直接拦截。

同时,如果说 HTTPS 不用构造直接可以无限次任意请求的话,签名模式难道就不是吗?
dzdh
2021-04-12 23:11:30 +08:00
@kejialiu

即便没有 nonce 。如 http://domain/path?order_id=x&sign=n 。是的没错,这个请求无法被篡改,但是我依然可以肆无忌惮的发起查询啊。

而且肯定是要有一个『某 ID 』的参数吧?如商户 ID 、用户 ID 等标记唯一应用的参数吧。那也就是说,只是某一个『用户』或『应用』能构造针对特性对象『 order_id=x 』的请求。

那相应的,HTTPS 的话直接作为 Authentication Header 参数放进来一样的哇。
Vegetable
2021-04-13 00:09:10 +08:00
这个有历史的惯性原因吧,大家都有签名,我这没签名显得不安全。

另一个可能是,对于在网络请求中传递密钥的恐惧?我这两天正在设计一个 s2s 接口,也非常纠结到底要不要做签名
ch2
2021-04-13 01:00:47 +08:00
过滤掉不会签名的傻子,仅此而已

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

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

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

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

© 2021 V2EX