好久没有更新文章了,本次讲个代码安全的内容-伪随机数
起因
起先在公司年会上,小伙伴说,在固定的时间抽出的获奖号码是不是就是固定人的,要不每次抽大奖的时候,要准时准点的抽,并且抽出来的全是老板?可是看了抽奖代码,确实没有直接在代码中明确中奖人的号码啊?问题出在哪里?难道可以预测某个固定时间出现的随机数?随机数不随机?和时间有关?
下面就简单介绍下,代码里面的伪随机,确实是可以预测未来出现的随机数的。
伪随机
伪随机数是由计算机算法生成的数字序列,其表现类似于真随机数序列。尽管伪随机数是通过算法生成的,但它们在实践中通常足够随机,以至于很难区分它们和真随机数的区别。
伪随机数生成器是一个算法,它接受一个种子值作为输入,并生成一个看似随机的数字序列。这个种子值可以是任意的输入,例如时间戳、硬件状态或用户输入。
种子可以是时间戳,这个还真和时间有关联上了吧!为了使大家有个更直观的了解,那么我们来用程序模拟下,来预测下未来要产生的随机数。
预测下
我们用java来写个小程序,运行下大家看看运行的结论,会比较直观感受出来,我们分几步一步步来:
代码一:使用时间戳生成随机数
运行后产生随机数:
随机整数: 1179905836
代码二:在现有时间上增加5秒,预测下5秒后生成的随机数,然后延迟5秒后再次获取随机数,看是否一致
运行后输出
预测5秒后的随机整数: 291602180
5秒后的随机整数: 298142911
预测失败
预测失败了,难道预测不了?
代码三:找下原因,种子不对?延迟5秒出问题了?大家可以考虑下为啥,这里把种子时间戳打印看看:
打印结果为:
5秒后的时间戳为: 1698493502008
预测5秒后的随机整数: -2034252538
现在的时间戳为: 1698493502025
5秒后的随机整数: -2053105234
预测失败
可以看到时间戳差了17,所以导致了随机数的不同,那么这个时间差是哪来的?
在打印两次时间戳之间还有其他打印和程序逻辑,应该是这块产生了一部分的时间延迟,为了更准确,我们将毫秒级改为秒级,这样中间几行代码运行也不会有1秒的延迟,再次观察下随机数的产生
代码四:时间戳/1000变成秒级
再次运行结果:
5秒后的时间戳为: 1698493807
预测5秒后的随机整数: 478489219
现在的时间戳为: 1698493807
5秒后的随机整数: 478489219
预测成功
产生的随机数完全一样,也就是说我们成功预测了5秒后程序产生的随机数。那么基于这个时间戳来生成随机数来抽奖是完全可以预测出来的。在某个固定时间运行程序一定会出某个中奖数
伪随机数产生的漏洞
案例:jumpserver最新re-auth复现(伪随机经典案例)
原文始发于微信公众号(YY的黑板报):随机数不随机-我可以预测未来
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论