我试图以这种方式创建随机密码:
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
的唯一值。
我不需要所有值的列表,只需要计算。
有什么想法吗?
答案 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)];
你的代码会运行得更快,因为你每次都不会改变这些字符。
PS:这适用于简单的应用程序。但是,如果您需要加密安全算法,请不要使用md_rand
,也不要将密码限制为4个字符!