Random Number Seed Generator: Using System On Time
我试图理解为什么这个代码是一个安全缺陷。据我所知,当程序打开时,使用系统时间生成随机数种子是不安全的,但是如何猜测呢?我不确定我是否看到了可能的漏洞。
由于D.Wagner的DMCA请求而删除的代码示例
首先,您的代码有一个bug,它根本不使用EDOCX1中的值(0),它覆盖了以下行中的值:
1 | seed = time_micro_sec >> 7; |
此外,
即使你修复了这些错误,在一天结束的时候,
不要将
忽略了我认为不是故意的直接错误…
你不必预测这个问题的确切时间——只是粗略的时间。对于任何给定的种子,生成的随机值都是完全可预测的序列。所以,如果你重复做动作,你可以尝试推断出哪个种子与你看到的模式相匹配,如果你能把你的开始时间缩小到一分钟之内,比如说,那就只有60000个种子需要搜索(假设毫秒,尽管你混合了关于毫秒的评论,名为micros的变量,以及看起来都不是的值),这就是很简单。一天只比86400000大,但可行。
如果我有能力,例如崩溃您的应用程序并强制重新启动,那么预测您的种子并进一步利用它就变得容易多了。如果没有,如果您有本地访问权限,查找开始时间是很简单的。如果是远程攻击,可能会更困难,但是,例如在MMO上,服务器重启可能是可预测的,您的银行可能会在星期天晚上10点到凌晨4点进行服务更新,等等——所有这些都是泄漏开始时间。
基本上:如果你想要一些安全的东西,首先使用那些设计为安全的东西。
如果您可以预测运行程序时的系统时间(如果您是运行程序的人,这不是一个伸展),那么您可以预测输入种子的值,从而确定"随机"数字生成器将生成什么。