1. 引言
随机密码是我们在很多场合需要使用的功能,比如在网站注册、修改密码等场景下,经常会看到有随机密码这个选项。其原因在于随机密码比较难猜测,提高了账户的安全性。PHP提供了多种生成随机密码的方式,本文就介绍其中的三种方法。
2. 使用rand函数生成随机数
php提供的rand函数可以生成一个指定范围内的随机数,我们可以根据这个特性生成一个随机密码。下面是一个示例代码:
function generate_password() {
$password = '';
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i=0;$i<8;$i++)
$password .= substr($chars,rand(0,strlen($chars)),1);
return $password;
}
echo generate_password();
上面的代码中,定义了一个函数generate_password(),它会在$chars中随机选择8个字符,然后返回这8个字符组成的字符串。$chars是包含了a~z,A~Z和0~9的字符串。
2.1 优化代码
尽管随机密码的位数、字符集大小等因素不同,最终的随机字符串长度也不同,但是生成随机字符串的实现方式可以通过一定的优化来达到更好的效果。下面对generate_password()函数进行优化:
function generate_password() {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return substr(str_shuffle($chars), 0, 8);
}
echo generate_password();
可以看到实现非常简单清晰。首先定义了$chars,它包含了a~z,A~Z和0~9的所有字符,然后通过str_shuffle()函数打乱了$chars中的字符位置,最后使用substr()函数获取前8个字符,即生成了一个随机密码字符串。
3. 使用mt_rand函数生成随机数
PHP还提供了一种生成随机数的方法,那就是使用mt_rand()函数。mt_rand()函数是比rand()更加随机的随机数生成函数。下面是一个示例代码:
function generate_password() {
$password = '';
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i=0;$i<8;$i++)
$password .= substr($chars, mt_rand(0,strlen($chars)),1);
return $password;
}
echo generate_password();
上面的代码和使用rand()函数的示例代码非常类似,这里不再赘述。
4. 使用openssl_random_pseudo_bytes函数生成随机数
openssl_random_pseudo_bytes()函数可以用来生成用于加密的随机数、初始化向量或盐值。下面是一个示例代码:
function generate_password() {
$password = '';
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i=0;$i<8;$i++) {
$password .= $chars[ord(openssl_random_pseudo_bytes(1)) % strlen($chars)];
}
return $password;
}
echo generate_password();
上面的代码中,使用openssl_random_pseudo_bytes()函数生成了一个随机字节,然后保存为$byte。我们再把$byte模$char的长度,即可得到一个索引值,最后使用$char中的对应字符组成随机密码。该函数的意义在于,可以生成更加随机的随机数。
5.总结
本文针对PHP生成随机密码的三种方法进行了讲解。其中,rand()函数和mt_rand()函数的效率较高,适用于密码长度不大的场景。openssl_random_pseudo_bytes()函数虽然效率不高,但是生成的随机数较难被猜测,可以提高账户的安全性。