请教一下关于 nonce 防重放

2023-11-09 09:21:09 +08:00
 matepi
有一点没想明白,如果针对客户端是 web 页面的情况,那么 nonce 的生成算法,就一般都是在 web 端的 js 代码中了。

这样相当于 nonce 的生成过程,仍然是对客户端暴露的,只要重放人有能力进行客户端 js 的分析与模拟运行,那不是 nonce 就失效了么?
3217 次点击
所在节点    程序员
33 条回复
dyllen
2023-11-09 10:25:57 +08:00
@matepi 你是为了防止页面数据重复提交?这个随机字符串是服务器下发的,是直接渲染在页面里面的。
szandy6
2023-11-09 10:27:25 +08:00
nonce 又不是加密算法生成的,它就是一个随机串,不存在暴漏问题。
你可以理解为 nonce 保证只能请求一次,服务器会短暂保存请求过的 nonce ,下次再有人用这个 nonce ,就会被认为是重放。
matepi
2023-11-09 10:30:08 +08:00
@cylx3124 我的理解,风控、参数和逻辑校验,其实还是不能解决、正常用户的大开销的幂等查询类请求?类似于 DDoS 的请求行为?最终只能给用户上配额之类的?

但配额也是有问题的,如果自动化查询者具备了很多用户账号,实际上还是能够挤占正常用户的额度?
cylx3124
2023-11-09 10:39:26 +08:00
@matepi

这种需求如果有专业的风控团队,可以扔给风控团队去做,没有的话就只能根据 手机号、用户 id ,设备 id 、ip 等不同维度在服务端实现拦截了。

真正的反爬虫是一种很难实现的目标,因为任何一种反爬虫的方法都可能被爬虫工程师找到绕过的办法。
justplaymore
2023-11-09 10:49:38 +08:00
nonce 是用来保证明文的不可预测性。

当明文非常容易预测时:
举例:
请求 1 明文 money=10 ,签名 abc 。
请求 2 明文 money=10 ,签名 abc 。
请求 3 明文 money=10 ,签名 abc 。
这 3 个请求的明文是相同的,非常好预测,没有随机性,那么攻击者收集足够多的请求样本后,就知道明文和密文的直接对应关系了,就可以得到一个明文和密文的字典了,类比彩虹表。

当在明文中加上了 nonce ,保证不可预测性
举例:
请求 1 明文 money=10&nonce=q1w2e3r4 签名 1234
请求 2 明文 money=10&nonce=5t4r3e2w1 签名 4567
请求 3 明文 money=10&nonce=5t6y7u8i9 签名 6787
虽然这 3 个请求中都是 10 元,但是明文不同,导致签名也不同,攻击者无法通过收集的样本,分析出明文 10 元和签名的关系。

我是从不可预测性来解释 nonce 的作用,和具体的技术实现没有关系,和前端还是后端实现没有关系。
proxytoworld
2023-11-09 10:53:02 +08:00
nonce 是防 mitm 的,至于你说的限制,得在服务端进行限流
justplaymore
2023-11-09 10:57:35 +08:00
一个系统具有多个较复杂的幂等查询功能,内部用户使用。
但发现内部用户太多使用自动化手段、模拟正常用户登录,反复调用幂等查询,造成查询所占资源紧张。
尤其是内部正常用户之间还会借用多账号等手段,增加自动化并发能力。
希望通过一些手段控制,这些用户自动化重复调用、消耗系统资源的情况。

看了你的需求,这不是 nonce 能解决的场景。
对用调用量过多的情况,可以使用接口调用限流来控制,降低自动化调用的效率。
对于复杂查询,可以从查询缓存,异步计算角度去考虑。
opengps
2023-11-09 10:59:31 +08:00
后端幂等性当然得靠后端进行,办法也非常简单,就是第一次有效执行结果的缓存重发就行了
justplaymore
2023-11-09 11:00:00 +08:00
lz 的提问方式是典型的 xy 问题。

对于 X-Y Problem 的意思如下:

1 )有人想解决问题 X
2 )他觉得 Y 可能是解决 X 问题的方法
3 )但是他不知道 Y 应该怎么做
4 )于是他去问别人 Y 应该怎么做?

简而言之,没有去问怎么解决问题 X ,而是去问解决方案 Y 应该怎么去实现和操作。于是乎:

1 )热心的人们帮助并告诉这个人 Y 应该怎么搞,但是大家都觉得 Y 这个方案有点怪异。
2 )在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的问题 X 是怎么一回事。
3 )于是大家都发现,Y 根本就不是用来解决 X 的合适的方案。

X-Y Problem 最大的严重的问题就是:在一个根本错误的方向上浪费他人大量的时间和精力!
moya
2023-11-09 11:19:27 +08:00
nonce 防止 XSS 攻击
gxm44
2023-11-09 11:33:09 +08:00
nonce 服务端下发,而且 js 无法读取到
moya
2023-11-09 11:36:12 +08:00
@moya 看错忽略,以为说的是 script 标签
chanlk
188 天前
@LonnyWong #1 我看有不少文章提到 https 就自带了防止网络层面抓包的重放,那么这个 nonce + 时间戳 的形式是否是多余的呢? nonce 这并不能防止恶意用户(脚本小子)的盗刷
LonnyWong
188 天前
@chanlk #33 你再看看楼主的原始问题是什么

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

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

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

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

© 2021 V2EX