使用rand生成确认码是否安全? PHP

时间:2015-02-24 12:36:43

标签: php security random code-access-security

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

我使用rand函数生成代码:

$code = rand ( 100000, 999999 );

这样做是否安全?

1 个答案:

答案 0 :(得分:2)

否。我们假设您要重置特权用户的密码。攻击者所要做的就是为他们控制的非特权帐户(或多个帐户)发出一堆重置,以预测下一个随机值。这意味着他们可以为特权用户请求密码重置(例如" Admin"),然后接管帐户。

更多信息:

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

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

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

请注意,这很快将在不久的将来被采用/重构到此存储库中(并且提供的功能甚至可以使其进入PHP 7核心):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字节字符串应足以阻止实际和所有已知的理论攻击。