计算随机密码生成器的可能唯一值

时间:2017-08-12 18:45:17

标签: php

我试图以这种方式创建随机密码:

function givemepass() {
    $pass = '';
    for ($i = 0; $i < 4; $i++) {
        $abc = str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
        $x = mt_rand(0, 35);
        $pass .= substr($abc, $x, 1);
    }
    return $pass;
}

我很有兴趣使用上面的代码可以获得$pass的唯一值。

我不需要所有值的列表,只需要计算。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您正在生成一个包含4个字符的密码,其中每个字符有36种可能性。这使得36 ^ 4或1.679.616可能性。

此外,我想指出mt_rand不是生成密码的安全方式:

  

此函数不会生成加密安全值,也不应用于加密目的。如果您需要加密安全值,请考虑使用random_int(),random_bytes()或openssl_random_pseudo_bytes()代替。

许多随机生成器,如mt_rand,生成可预测的随机数(这也是他们称之为伪随机数生成器或PRNG的原因),这意味着,如果一个人可以连续获得几个密码,他们就可以计算所有下一个以及之前分配给其他用户的所有密码。你另外打电话给str_shuffle会让事情变得更难,但仍然......

答案 1 :(得分:2)

每个角色可以是36种可能性中的一种。对于每个角色,下一个角色可以是36种可能中的一种......

因此,使用4个字符的密码的可能性总数为36 * 36 * 36 * 36

您可以简化代码:

$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$pass = '';
foreach(range(1,4) as $i) $pass .= $chars[mt_rand(0,35)];

你的代码会运行得更快,因为你每次都不会改变这些字符。

Live demo

PS:这适用于简单的应用程序。但是,如果您需要加密安全算法,请不要使用md_rand,也不要将密码限制为4个字符!