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 岂不是非常危险?

13085 次点击
所在节点    SSL
248 条回复
dzdh
2021-04-13 15:42:56 +08:00
@VHacker1989 55

所以安全就不用做了呗?无论你做任何安全都可以被逆向、动态调试?
dzdh
2021-04-13 15:43:33 +08:00
@hxndg 有理。
dzdh
2021-04-13 15:44:50 +08:00
@xuanbg 64

同理,如果客户端环境安全无法保证的前提下,怎么保证『签名模式』是安全的呢?
jhdxr
2021-04-13 16:04:12 +08:00
Server 端到 Server 端 这一点是如何保证的?就是说,我提供了一个接口,我预期对方应该也是 server 端,但我如何可以保证这一点?
dzdh
2021-04-13 16:09:13 +08:00
@jhdxr

在思考这一点之前,先思考如何保证『签名模式』下对方一定也是 Server 端。

我的接口是为了 Server 端调用而设计,客户错误使用暴露出去,屏蔽 ClientID (调用凭证)即可
ashuai
2021-04-13 16:25:18 +08:00
https 能保证信息的完整传输吗?

例如我给服务器发 123456,因为网络抖动,结果服务器有可能只收到 1234

有以上可能吗?如果有,这就是签名的意义
newmlp
2021-04-13 16:27:28 +08:00
@dzdh 你没看到我说的是增加反编译难度吗
newmlp
2021-04-13 16:32:54 +08:00
@dzdh Xposed+JustTrustMe 就可以破解证书固定,so easy
abersheeran
2021-04-13 16:42:34 +08:00
把 Token 加入签名内容的签名,可以防止 Token 明文传输。把 Timestamp 加进签名内容可以防重放攻击。

不过如果依赖于 HTTPS (这里需要注意证书),这两都可以不要。我觉得可能现在还这么做的大厂,惯性更多一点吧,毕竟代码已经写好了,可以跑了,改设计,没必要。
3dwelcome
2021-04-13 16:45:09 +08:00
"所有人的质疑是否代表着 Stripe 和 Paypal 现在是极度危险状态?"

你用国外网站举例没意义,国外信用卡支付没密码是安全的,放国内基本不可能。

同理国外电子支付没有签名是安全的,国内设计的 API 没签名?想都别想,和钱有关的,必须加码,管他有没有用。

这和软件加壳一个道理,你不知道破解者的能力和权限(说不定就是你隔壁同事),越套一层防范,单纯从理论上来说,就能阻断一部分破解者的尝试,也就变相代表着越安全。

就安全系数来说,有签名的 API 和没签名的 API PK 一下,有签名的得分高。光刷公司的 KPI,也必须加。
3dwelcome
2021-04-13 16:47:07 +08:00
@abersheeran “我觉得可能现在还这么做的大厂,惯性更多一点吧,毕竟代码已经写好了,可以跑了,改设计,没必要。”

为了支付系统上出 BUG 可以甩锅,小码农根本赔不起。“看,API 设计够好了,还有签名!”
LeeReamond
2021-04-13 16:54:06 +08:00
@akira 显然不对,tcp 只保证连接可靠,不保证数据可靠,单纯 http 肯定是有缺陷的,居然还有两个人点赞
LeeReamond
2021-04-13 16:57:56 +08:00
@dzdh 必要性是没有,但应该也没有非必要性。很难有 api 在设计层面说脱离开 tls 我干脆就禁用,大部分是保留支持能力的,那如果已经写好了逻辑,就没有删除的理由。哈希算法成本很低,hs256 也仅在百纳秒的数量级,而不以抗哈希攻击为目的的快速哈希可以做到远更快
timedivision
2021-04-13 18:34:21 +08:00
@dzdh 所以为了更安全,任何提高安全性的手段都是必要的呀
dzdh
2021-04-13 18:47:53 +08:00
@ashuai 86

"有以上可能吗?如果有,这就是签名的意义"

没可能
dzdh
2021-04-13 18:54:39 +08:00
@newmlp 88

> Server 端到 Server 端。

同理,HOOK 也可以轻松拿到用于『签名模式』的签名密钥,so easy~
dzdh
2021-04-13 19:00:08 +08:00
@3dwelcome 90

> 管他有没有用
所以并不是出于安全考虑,就是为了『加』而『加』?

> 你用国外网站举例没意义,国外信用卡支付没密码是安全的,放国内基本不可能
公共网络的、任何人都可以进行调用的、处于公网环境的 HTTPS 接口,甚至有详细的文档。为什么他就『安全』呢?支付宝接口如果不用『签名』设计就『不安全』了?比如如果支付宝现在开始不用签名了,会导致什么问题呢?包括但不限于下单、退款、关闭订单、转账等接口,就直接像 stripe 一样 `curl -u $key https://api.alipay.com/api/transfer?to=xxx&amount=1000` 。
dzdh
2021-04-13 19:06:00 +08:00
@3dwelcome 91

如果有签名的时候被黑了呢,接口 bug 了呢 这不是一样吗
dzdh
2021-04-13 19:09:16 +08:00
@timedivision

所以是,仅仅 HTTPS 已经足够安全,所谓签名只是锦上添花?
catchexception
2021-04-13 19:23:06 +08:00
大多数回答都不在点子上。一个是传输层,一个是业务层。

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

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

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

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

© 2021 V2EX