随机数不随机-我可以预测未来

admin 2023年10月28日23:43:00评论18 views字数 1134阅读3分46秒阅读模式

好久没有更新文章了,本次讲个代码安全的内容-伪随机数

起因

起先在公司年会上,小伙伴说,在固定的时间抽出的获奖号码是不是就是固定人的,要不每次抽大奖的时候,要准时准点的抽,并且抽出来的全是老板?可是看了抽奖代码,确实没有直接在代码中明确中奖人的号码啊?问题出在哪里?难道可以预测某个固定时间出现的随机数?随机数不随机?和时间有关?

下面就简单介绍下,代码里面的伪随机,确实是可以预测未来出现的随机数的。

伪随机

伪随机数是由计算机算法生成的数字序列,其表现类似于真随机数序列。尽管伪随机数是通过算法生成的,但它们在实践中通常足够随机,以至于很难区分它们和真随机数的区别。

伪随机数生成器是一个算法,它接受一个种子值作为输入,并生成一个看似随机的数字序列。这个种子值可以是任意的输入,例如时间戳、硬件状态或用户输入。

种子可以是时间戳,这个还真和时间有关联上了吧!为了使大家有个更直观的了解,那么我们来用程序模拟下,来预测下未来要产生的随机数。

预测下

我们用java来写个小程序,运行下大家看看运行的结论,会比较直观感受出来,我们分几步一步步来:

代码一:使用时间戳生成随机数

随机数不随机-我可以预测未来

运行后产生随机数:

随机整数: 1179905836

代码二:在现有时间上增加5秒,预测下5秒后生成的随机数,然后延迟5秒后再次获取随机数,看是否一致

随机数不随机-我可以预测未来

运行后输出

预测5秒后的随机整数: 2916021805秒后的随机整数: 298142911预测失败

预测失败了,难道预测不了?

代码三:找下原因,种子不对?延迟5秒出问题了?大家可以考虑下为啥,这里把种子时间戳打印看看:

随机数不随机-我可以预测未来

打印结果为:

5秒后的时间戳为: 1698493502008预测5秒后的随机整数: -2034252538现在的时间戳为: 16984935020255秒后的随机整数: -2053105234预测失败

可以看到时间戳差了17,所以导致了随机数的不同,那么这个时间差是哪来的?

在打印两次时间戳之间还有其他打印和程序逻辑,应该是这块产生了一部分的时间延迟,为了更准确,我们将毫秒级改为秒级,这样中间几行代码运行也不会有1秒的延迟,再次观察下随机数的产生

代码四:时间戳/1000变成秒级

随机数不随机-我可以预测未来

再次运行结果:

5秒后的时间戳为: 1698493807预测5秒后的随机整数: 478489219现在的时间戳为: 16984938075秒后的随机整数: 478489219预测成功

产生的随机数完全一样,也就是说我们成功预测了5秒后程序产生的随机数。那么基于这个时间戳来生成随机数来抽奖是完全可以预测出来的。在某个固定时间运行程序一定会出某个中奖数

伪随机数产生的漏洞

案例:jumpserver最新re-auth复现(伪随机经典案例)

原文始发于微信公众号(YY的黑板报):随机数不随机-我可以预测未来

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月28日23:43:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   随机数不随机-我可以预测未来http://cn-sec.com/archives/2155791.html

发表评论

匿名网友 填写信息