为什么使用 https 调用 API 仍然推荐需要使用 key 来签名

2022-07-26 05:55:51 +08:00
 dayeye2006199
例如如下的 API -- https://open.shipout.com/portal/documentation/introduction.html#%E9%89%B4%E6%9D%83

仍然使用了获取的 key 来签名 http 头文件。我的理解是 https 已经保证了通信过程中内容的不可篡改性,这种情况下,手动签名主要是为了解决什么问题呢?

我是安全小白。
6552 次点击
所在节点    信息安全
64 条回复
dzdh
2022-07-26 18:27:16 +08:00
@seth19960929 #38/39

抬杠。

难不难?难。 能不能?能。所以因为这个就 必须、一定、绝对 要前端签名吗?而且一直说的是 S-S 。
seth19960929
2022-07-26 18:38:25 +08:00
@dzdh S -> S 就不需要吗? 服务器被入侵了, 你的请求就不被捉了吗
seth19960929
2022-07-26 18:38:48 +08:00
直接用 appid + secretkey 和裸奔有什么区别
vantis
2022-07-26 18:45:38 +08:00
自签名还有一个功能 是证明调用方自己是合法的调用方
wanacry
2022-07-26 18:54:53 +08:00
之前也对接过这种 api ,一直都是照葫芦画瓢,也不懂哈哈
eason1874
2022-07-26 19:17:51 +08:00
参数签名可以确保,一旦请求泄露了,别人也构造不了新请求

在 HTTPS 可靠的情况,这个签名没意义,在 HTTPS 不一定可靠的情况就很有意义。比如内网有流量审计、代理上网的时候
dzdh
2022-07-26 20:25:33 +08:00
@seth19960929

#42
服务器都被入侵了你告诉我有什么手段还能是安全的?就算你硬件加密也屁用没有啊?
#43
那 stripe\google\facebook\paypal 就都不安全呗?


@vantis #44
不是光 https 就没别的了。https+ http basic auth 一样能证明啊
datoujiejie221
2022-07-26 20:47:14 +08:00
签名不是为了防监听的 是防止身份伪造的
这种方法在 openapi 很常见 比如云云对接时 a 厂商申请了好几个 appkey 那么 a 厂商是不是可以猜出规律来去暴力破解其他厂商的 key 呢 但是有了签名的保障 a 厂商很难猜出其他厂商的 key 和 secret 的
对于反编译的问题,最好还是服务器云云对接 openapi
dzdh
2022-07-26 21:05:14 +08:00
@datoujiejie221

我有个疑问。用 hmac/md*/sha*(rsa 除外啊)我不是也可以无限尝试嘛? 因为你采用的哈希算法和排列方式是公开的呀。

无非是

https://xx?key=$RANDOM 无限



https://xx?{hmac(key1value1,key2value2,$RANDOM_SALT} 的问题吗?



如果是 rsasign ,那是不是一样可以客户端证书呢?
datoujiejie221
2022-07-26 21:20:28 +08:00
@dzdh 所以 secret 生成的时候一定要足够随机
key 不能太随机主要还要考虑数据库索引性能
所以你看国内一些平台 key 或 appid 比较简单 但是 secret 很复杂
密码复杂了 暴力破解成本也很高呀
rsa 这种用在 jwt 这种场景是很很合适的
datoujiejie221
2022-07-26 21:33:05 +08:00
@dzdh rsasign 是签名方式 证书是连接建立握手的 只能说证书验证过程中用到了 rsa
dzdh
2022-07-26 22:07:16 +08:00
@datoujiejie221

不。我说的是 [客户端证书] 。必须是指定 CA 签发(私有)的证书,并且能被正确解析的从证书中解析出 COMMONNAME 当作 UID 使用的。

不是用于 HTTPS 连接的权威 CA 证书。

rsasign 指的是使用私有 RSA Private Key 对指定字符串生成的 sign 如( php: openssl_sign ($data, $private_key, $sign ))
dorothyREN
2022-07-26 22:34:35 +08:00
@dzdh #40 你怎么知道已经泄漏了呢
dzdh
2022-07-26 22:45:02 +08:00
@dorothyREN #53 那签名怎么知道 secretkey 没泄漏呢
datoujiejie221
2022-07-26 23:02:23 +08:00
@dzdh 是的呀 那他也是连接建立的时候才验证呀 验证过了才会协商密钥 客户端证书又不是每次请求都验证
sivacohan
2022-07-26 23:09:44 +08:00
@seth19960929 在 19 楼说的大体是对的。

我认为楼主的问题是不明白为什么要有一个 sign 。
这个东西在没有 HTTPS 的时代,起到了一个防篡改的作用。

在有 HTTPS 的时代,HTTPS 保证了传输过程的安全性。但是客户端的安全性仍然存在风险,比如我可以打开 chrome 的 console ,然后复制出这个请求来进行重放。

这个 sign 不是 AAA ( authentication authorization and accounting )的范畴。
这个 sign 如果直接是通过 请求参数的 map + key 生成的,那就是保证数据可靠性,避免篡改。
这个 sign 如果是 请求参数 + salt ( timestamp ) + key 生成的,就除了数据可靠性之外,增加了一个防重放攻击的能力。
Chenhe
2022-07-27 09:09:43 +08:00
简单说。https 一般是验证服务器的身份。而这些 api 还需要验证客户端的身份。
siweipancc
2022-07-27 13:45:37 +08:00
……op 有什么服务是无偿提供的吗,我想用
siweipancc
2022-07-27 13:49:22 +08:00
@siweipancc 回个点子上的吧,这是保护买资源客户,甚至预防客户的熟人作案(这边发生过,然后还改造了一版)
EminemW
2022-07-27 23:53:49 +08:00
不就是用来校验用户是否合法的,很难理解吗

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

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

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

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

© 2021 V2EX