我试图理解为什么这段代码是一个安全漏洞。根据我的理解,在程序打开时使用系统时间生成随机数种子是不安全的,但这是如何猜测的?我不确定我是否看到了可能的漏洞。
由于D. Wagner的DMCA请求删除了代码示例
答案 0 :(得分:3)
首先,您的代码有一个错误,它根本不使用time_in_sec
中的值 - 它会覆盖以下行中的值:
seed = time_micro_sec >> 7;
此外,time_micro_sec
只有1000000个可能的值,并且在右移7之后,减少到只有7813个可能的值。通过蛮力搜索这个空间是微不足道的。
即使你修复了这些错误,在一天结束时,srand()
/ rand()
随机数生成器也不是加密强大的PRNG。接口最终受限于srand()
采用unsigned int
参数的事实,该参数在公共平台上将初始状态中的熵限制为仅32位。这不足以防止对种子进行蛮力攻击。
请勿将srand()
/ rand()
用于安全性至关重要的随机数。
答案 1 :(得分:1)
如果您可以预测运行程序时的系统时间(如果您是运行程序的那个,那么这不是一个延伸),那么您可以预测输入种子的值,从而确定什么"随机"数字生成器将生成。
答案 2 :(得分:1)
忽略完全错误,我认为这不是故意的......
你不必预测这个问题的确切时间 - 只是粗略的时候。对于任何给定的种子,生成的随机值是完全可预测的序列。因此,如果您反复进行操作,您可以尝试推断出哪种种子与您看到的模式相匹配如果您可以将开始时间缩短到一分钟内,比如说,只有60,000种种子可供搜索(假设毫秒,尽管你混合有关millis的注释,名为micros的变量和看起来不是的值,这可能很简单。一天只有86,400,000 - 更大,但可行。
如果我有权力,例如崩溃您的应用程序并强制重新启动,预测您的种子变得更容易,然后进一步利用它。如果没有,如果您具有本地访问权限,则查找开始时间非常简单。如果是远程攻击,可能会更难,但是,例如在MMO上,服务器重启可能是可预测的,您的银行可能会在星期日晚上10点到凌晨4点之间进行服务更新,等等 - 所有这些都会泄漏启动时间。
基本上:如果你想要一些安全的东西,首先要使用一些设计安全的东西。