如何使用PHP生成随机密码?

39

还是有软件可以自动生成随机密码吗?

19个回答

97

可以随机生成一个由 a-zA-Z0-9(或任何你想要的字符)组成并且长度为指定长度的字符串。下面是 PHP 示例:

function generatePassword($length = 8) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $count = mb_strlen($chars);

    for ($i = 0, $result = ''; $i < $length; $i++) {
        $index = rand(0, $count - 1);
        $result .= mb_substr($chars, $index, 1);
    }

    return $result;
}

为了优化,你可以将$chars定义为方法(或父类)中的静态变量或常量,如果在单个执行期间将多次调用此函数。


9
我会删除元音字母,因为错误的人总是会得到不良的结果(这种情况已经发生过两次在我身上)。 - MathGladiator
4
在引用(确定性的)基于PHP函数(rand()或哈希函数)的解决方案中,这更具有学术性,但它是一种伪随机而非真正的随机生成算法。您可以将该部分替换为调用基于大气噪音的Web服务的API(例如http://www.random.org/clients/http/)。尽管在大多数情况下,由于随机性的差异而增加依赖可能并不值得。 - micahwittman
6
仅仅使用str_shuffle函数并不能达到完全的随机性,因为你最终只会得到零个或一个"a"、零个或一个"b"、零个或一个"c"等等。你永远不会有重复的字符,这在我看来会显著地降低价值。 - Matt Huggins
14
如果您选择使用这种方法,我建议您删除所有元音字母以及 l10o,因为这些字符在某些字体下可能会让用户感到困惑。 - nickf
2
@nickf的技巧还有一个很棒的原因。我喜欢避免为注重政治正确的人生成脏话。你会惊讶地发现,你可以经常用包含元音字母的单词生成淘气的词语。 - Joel Mellon
显示剩余4条评论

12

这里有一个简单的解决方案。它将包含小写字母和数字。

substr(str_shuffle(strtolower(sha1(rand() . time() . "my salt string"))),0, $PASSWORD_LENGTH);

这里有一个更强大的解决方案,随机生成所需字符范围内的字符代码,并在所需范围内随机生成长度。

function generateRandomPassword() {
  //Initialize the random password
  $password = '';

  //Initialize a random desired length
  $desired_length = rand(8, 12);

  for($length = 0; $length < $desired_length; $length++) {
    //Append a random ASCII character (including symbols)
    $password .= chr(rand(32, 126));
  }

  return $password;
}

请注意,第一个函数将仅返回字母a-f范围内的字母。 - lbiegaj

6

我想玩游戏。最简单的方法是:

function rand_passwd( $length = 8, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ) {
    return substr( str_shuffle( $chars ), 0, $length );
}

这基本上只是第一个答案的修改版。在第二个参数中指定您想要的字符,并在第一位中指定密码的长度。


6
这只是我回复你答案上的评论的重复内容:简单地使用str_shuffle函数并不能产生真正的随机性,因为你最终会得到零个或一个"a"、零个或一个"b"、零个或一个"c"等。你永远不会有重复的字符出现,这在我看来显著降低了价值。 - Matt Huggins
1
http://php.net/manual/en/function.str-shuffle.php - 该页面指出str_shuffle函数不能生成加密安全的值,因此不应用于加密目的。如果您需要一个加密安全的值,请考虑使用random_int()random_bytes()openssl_random_pseudo_bytes()函数。 - Eugene Mala

5

这是我做事的方式。

$pw = ""; 
for ($i = 0; $i < 13; $i++)
{
    $pw .= chr(rand(33, 126));
}

3

另外一个非常简单(而且安全!)的方法是使用以下方式生成密码(我就是用这种方式生成所有密码):

base64_encode(random_bytes(12));

这将生成一个16位字符的密码,使用相当合理的字符范围。
然而,根据您的要求(例如,如果用户需要输入他们的密码),可能希望删除容易混淆的字符(如l、I、1、0、O、5、S等)。在这种情况下,上述解决方案可能过于简单。

3
这里有一个生成密码的函数,可以设置最短长度、最少数字和字母的要求。
function generatePassword() {
$min_length=8;  //Minimum length of the password
$min_numbers=2; //Minimum of numbers AND special characters
$min_letters=2; //Minimum of letters

$password = '';
$numbers=0;
$letters=0;
$length=0;

while ( $length <= $min_length OR $numbers <= $min_numbers OR $letters <= $min_letters) {
    $length+=1;
    $type=rand(1, 3);
    if ($type==1) {
        $password .= chr(rand(33, 64)); //Numbers and special characters
        $numbers+=1;
    }elseif ($type==2) {
        $password .= chr(rand(65, 90)); //A->Z
        $letters+=1;
    }else {
        $password .= chr(rand(97, 122)); //a->z
        $letters+=1;
    }

}
return $password;   
}

我们如何设置密码的最大长度? - Pankaj Pawar

2
一个好的密码应该是大小写混合,含有数字、字母和特殊字符,并且长度大于6个字符。以下是我在我的应用程序中使用的函数。
function randomPassword( $length = 8 ) 
{ 
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?"; 
$length = rand(10, 16); 
$password = substr( str_shuffle(sha1(rand() . time()) . $chars ), 0, $length );
 return $password;
}

1

我喜欢对随机字符数组进行洗牌

$a = str_split("abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY0123456789");
shuffle($a);
echo implode($a); //maxlength
echo "\n".substr( implode($a), 0, 10 ); //instead of 10 => any length

//As function:
function getMeRandomPwd($length){
    $a = str_split("abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY0123456789"); 
    shuffle($a);
    return substr( implode($a), 0, $length );
}
echo "\n".getMeRandomPwd(8)."\n".getMeRandomPwd(11);
// Outpus something like:
// 3Ai4Xf6R2I8bYGUmKgB9jpqo7ncV5teuQhkOHJCNrTP0sLFd1wxSMlEWvyaD
// 3Ai4Xf6R2I
// JsBKWFDa
// gfxsjr3dX70

如果您需要更长的密码,只需多次连接字符列表即可 :)

1
function generate_password($length = 6) {
    $password = '';
    $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
    for ($i = 0; $i < $length; $i ++) {
        $password .= $chars[array_rand($chars)];
    }
    return $password;
}

1

你也可以尝试我写的一个函数,它可以从我的博客中获取。这个函数的优点是它对小写字母、大写字母、数字和特殊字符都给予同等重视。你可以在这里找到它: PHP随机密码生成器函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接