使用rand生成确认码安全吗?php


is it safe to use rand for generating confirmation code ? php

当用户想要重置密码时,我会向他的电子邮件发送一个6位数的代码,然后检查用户是否输入了匹配的代码!

我正在使用rand函数生成代码:

$code = rand ( 100000, 999999 );

这样做安全吗?

假设您想要重置特权用户的密码。攻击者所要做的就是对他们控制的一个无特权帐户(或多个帐户)进行一系列重置,以预测下一个随机值。这意味着他们可以请求重置特权用户(例如"管理员")的密码,然后接管该帐户。

更多信息:

  • https://security.stackexchange.com/a/18034
  • https://stackoverflow.com/a/10216521/2224584

如果你真的想要任何类型的安全功能的不可预测的随机数,请随意使用我编写并维护的这个库:

https://github.com/resonantcore/lib/blob/master/src/Secure.php

$iRandom = 'Resonantcore'Lib'Secure::random(100000, 999999);

请注意,在不久的将来,这将很快被采用/重构到这个存储库中(所提供的功能甚至可能使其成为PHP7核心):https://github.com/SammyK/php-src-csprng

$iRandom = random_int(100000, 999999);

不过,它还没有出现。我的代码今天有效。

如果你不信任,你也可以看看Anthony Ferrara精彩的RandomLib项目:https://github.com/ircmaxell/RandomLib

$factory = new RandomLib'Factory;
$generator = $factory->getGenerator(new SecurityLib'Strength(SecurityLib'Strength::MEDIUM));
$iRandom = $generator->generateInt(100000, 999999);

不要将rand()mt_rand()用于任何身份验证(或绕过身份验证)目的。曾经

此外,您可能希望使用比6位数字更大的蛮力空间。十六进制编码的32字节字符串应该足以阻止实际和所有已知的理论攻击。