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