使用 https 后,还有必要用 md5(secret+参数+时间戳)类似这样的方法做数据完整校验吗?

2018-07-09 22:44:23 +08:00
 dawniii

前几天和一个群友争论这个来着,我觉得没有必要再这么做了。https 已经在传输层保证了请求不被篡改和完整性。两者都用的话,算是增加一些别人调用你接口的门槛?但是感觉门槛并不高,在客户端都能找到。

看知乎上有类似话题 https://www.zhihu.com/question/52392988

但是觉得答案都不是太满意。回答说是请求过了负载均衡后,在内网是明文传输,所以不安全?

因此想来看看各位 v 友是怎么看待这个事情。

10496 次点击
所在节点    程序员
32 条回复
wizardoz
2018-07-10 09:54:49 +08:00
https 不只是 http + SSL,https 还包含了 CA 证书,中间人是无法伪造证书的。
还有 https 抓包的,没有服务端私钥,你能解密抓到的包?
dawniii
2018-07-10 09:57:03 +08:00
@dawniii 非常感谢大家的回复,受益匪浅。上面很多说的重放,原来是指的业务上的重放。

@seeker 发的这篇文章挺好的,解释了为什么 tls 不会被中间人重放。

http://blog.valverde.me/2015/12/07/bad-life-advice/

TLS 通过为每个连接导出一组新密钥并为每个记录分配唯一的序列号来保证加密流是不可重放的。
这可以防止攻击者复制这些记录并在另一个连接上重放这些记录,因为加密密钥不匹配。
在同一连接上重放它们也不起作用,因为序列号不匹配,并且记录将被拒​​绝。

但是中间人可以破坏连接,有的客户端会实现自动重试一次,这样来达到客户端自己重放的效果。

一般类似支付的接口,应该都是有业务状态来保持幂等的,发生重复支付的几率应该很低。

@honeycomb 您说的客户端抽风等原因,导致重复发帖的问题。貌似用到 nonce timestamp 来做请求的验证就行。并不需要再加一个 md5 校验,因为 tls 已经保证了请求的完整,感觉 md5 这部分事情做的重复了。

暂时的结论是 https 已经满足大部分场景,保证了请求的完整、不被篡改、加密。
md5(secret+参数+时间戳)这种方式,有两个作用。第一个是防止业务上的重放(如果只是防止业务重放是没必要 md5 的),第二个是增加恶意调用接口的门槛。
a7a2
2018-07-10 09:59:03 +08:00
https 不能保证不被篡改和完整性。

中间人攻击,真是过浏览器证书认证的中间人攻击。
假设攻击者是另外一个 ssl 证书提供商+勾结电信运营商或入侵你 dns 系统 呢?
政府具备以上权限

玩过一下阿里 api 市场,人家阿里也是做数据完整校的。
不信技术也信人家大企业。
BOYPT
2018-07-10 10:08:57 +08:00
传输层和业务层的“安全”完全是两个层面的东西,各有各的应用和需求,不能混为一谈。

另外楼上有说安卓不校验证书,这点不是很准确,Android 7+是强制独立 app 校验证书,我尝试系统安装自签证书,vpn 中间人抓包一些 app 的 https,都不能成功,直接拒接握手; Android 6 上是可以的。
dawniii
2018-07-10 10:13:14 +08:00
@a7a2 如果被这么高权限机构的针对,那么自己写的类似 md5 签名方法,感觉也是不堪一击啊。。。
a7a2
2018-07-10 10:21:23 +08:00
@dawniii 看了我最后一段了嘛?阿里如何做的跟上即可。
加了据完整校的话可以越过我上面说的第二段,至少加大了难度。
dawniii
2018-07-10 10:30:45 +08:00
@a7a2 想了想得分两种情况来看,服务端调用还是客户端调用。
如果是在服务端调用 api,这个 md5 里有一个保密的 secret,篡改的难度还是挺大的。如果是客户端调用的话,就会比较不堪一击了。
iwtbauh
2018-07-10 11:44:47 +08:00
@a7a2 那么这个 CA 证书就会随后被各大操作系统和浏览器厂商拉黑。这么快就忘了上回的 CNNIC 乱签证书事件了?
如果客户端可控,HTTPS public key pinning 了解一下
a7a2
2018-07-10 11:46:26 +08:00
http(s) header:
sign=md5(客户端 ip+body 内容+公共 secret 通过 https 获取+如需要认证类的加上用户名手机号码之类+每个安装前先注册,每个安装 app 内置不同的 userSecret,这个 userSecret 存到后端数据库,就是说每个安装都即时编译即时下载,这样破解一个客户端不影响其他用户,反中间人修改数据的+不重复的 timestamp 就是精确要高+hash 版本号)
timestamp=timestamp 的具体数字
hashVersion=1.0
mobile=13516521122

公共 secret 不出现在 header 中,公共 secret 可控制频率之类,看客户端业务类型设计了,实时性高的这个不要了

这个 hash 方式 入侵 /破解者 是未知的.

以上方式有一个绝对反中间人修改数据的,每一个安装量都内置不同的 userSecret,userSecret 在请求中不需要暴露在 header 中,神一般存在。这个是以前准备写 VPN 时候想到的

@dawniii

反正如果我是技术负责人我一定要求加上,安全最重要

小锁是用来防君子的,遇上大劫匪也无可奈何。正如贪腐成本不大的我也贪

想象一下我是一个垃圾技术员但是我管理着广东电信所有路由,突然有天发现你安装量上亿的 app 没有数据完整性校验,我开个菠菜网站在你 app html 页面插入广告。
Heavytiger
2018-07-10 12:10:52 +08:00
mark
zjp
2018-07-10 12:30:17 +08:00
@BOYPT 还是你这样表述明晰,md5(secret+参数+时间戳)是业务的需要

关于校验证书的,安卓 7 确实已经不信任自签证书。但我要说的安卓软件内置的校验,我只遇到过酷安有
xud6
2018-07-10 16:37:20 +08:00
secret 是为了增加伪造难度吧。如果用了 HTTPS Client Authentication 的话感觉没有也没关系。

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

https://tanronggui.xyz/t/469414

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

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

© 2021 V2EX