我试图在php中生成一个随机密码。

但是我得到的都是'a'返回类型是数组类型,我希望它是字符串。对如何修改代码有什么想法吗?

谢谢。

function randomPassword() {
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, count($alphabet)-1);
        $pass[$i] = $alphabet[$n];
    }
    return $pass;
}

当前回答

//define a function. It is only 3 lines!   
function generateRandomPassword($length = 5){
    $chars = "0123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
    return substr(str_shuffle($chars),0,$length);
}

//usage
echo generateRandomPassword(5); //random password legth: 5
echo generateRandomPassword(6); //random password legth: 6
echo generateRandomPassword(7); //random password legth: 7

其他回答

使用这个简单的代码生成med-strong密码长度为12

$password_string = '!@#$%*&abcdefghijklmnpqrstuwxyzABCDEFGHJKLMNPQRSTUWXYZ23456789';
$password = substr(str_shuffle($password_string), 0, 12);

以下是我对选项列表的贡献。

该功能可以确保密码策略被满足。

  function password_generate($length=8, $min_lowercases=1, $min_uppercases=1, $min_numbers=1, $min_specials=0) {

    $lowercases = 'abcdefghijklmnopqrstuvwxyz';
    $uppercases = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $numbers = '0123456789';
    $specials = '!#%&/(){}[]+-';

    $absolutes = '';
    if ($min_lowercases && !is_bool($min_lowercases)) $absolutes .= substr(str_shuffle(str_repeat($lowercases, $min_lowercases)), 0, $min_lowercases);
    if ($min_uppercases && !is_bool($min_uppercases)) $absolutes .= substr(str_shuffle(str_repeat($uppercases, $min_uppercases)), 0, $min_uppercases);
    if ($min_numbers && !is_bool($min_numbers)) $absolutes .= substr(str_shuffle(str_repeat($numbers, $min_numbers)), 0, $min_numbers);
    if ($min_specials && !is_bool($min_specials)) $absolutes .= substr(str_shuffle(str_repeat($specials, $min_specials)), 0, $min_specials);

    $remaining = $length - strlen($absolutes);

    $characters = '';
    if ($min_lowercases !== false) $characters .= substr(str_shuffle(str_repeat($lowercases, $remaining)), 0, $remaining);
    if ($min_uppercases !== false) $characters .= substr(str_shuffle(str_repeat($uppercases, $remaining)), 0, $remaining);
    if ($min_numbers !== false) $characters .= substr(str_shuffle(str_repeat($numbers, $remaining)), 0, $remaining);
    if ($min_specials !== false) $characters .= substr(str_shuffle(str_repeat($specials, $remaining)), 0, $remaining);

    $password = str_shuffle($absolutes . substr($characters, 0, $remaining));

    return $password;
  }

参数$min_*可以有以下值:

1-999 =需要 True =可选 False =禁用

它可以像下面这样使用:

echo password_generate(8); // Outputs a random 8 characters long password

10个字符的密码,每组至少有2个字符:

echo password_generate(10, 2, 2, 2, 2);

只输出6个随机数

echo password_generate(6, false, false, true, false);

你需要strlen($alphabet),而不是常量字母的计数(相当于'alphabet')。

然而,rand并不是一个适合于此目的的随机函数。它的输出可以很容易地预测,因为它隐含地以当前时间作为种子。此外,兰特是不加密安全的;因此,从输出中确定其内部状态相对容易。

相反,从/dev/urandom读取以获得加密随机数据。

我知道您正在尝试以特定的方式生成密码,但您可能也想看看这个方法……

$bytes = openssl_random_pseudo_bytes(2);

$pwd = bin2hex($bytes);

它取自php.net站点,它创建了一个字符串,长度是您在openssl_random_pseudo_bytes函数中输入的数字的两倍。因此,上面的代码将创建一个长度为4个字符的密码。

总之……

$pwd = bin2hex(openssl_random_pseudo_bytes(4));

会创建一个8个字符长的密码。

但是请注意,密码只包含数字0-9和小写字母a-f!

这是基于本页的另一个答案,https://stackoverflow.com/a/21498316/525649

这个答案只生成十六进制字符,0-9,a-f。对于一些看起来不像hex的东西,试试这个:

str_shuffle(
  rtrim(
    base64_encode(bin2hex(openssl_random_pseudo_bytes(5))),
    '='
  ). 
  strtoupper(bin2hex(openssl_random_pseudo_bytes(7))).
  bin2hex(openssl_random_pseudo_bytes(13))
)

Base64_encode返回更广泛的字母数字字符 Rtrim有时会在结尾删除=

例子:

32 efvfgdg891be5e7293e54z1d23110m3zu3fmjb30z9a740ej0jz4 b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760 051年b33654c0eg201cfw0e6na4b9614ze8d2fn49e12y0zy557aucb8 y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7

对于为用户创建界面来说,这不是很可配置的,但对于某些目的来说,这是可以的。增加字符数,以弥补特殊字符的不足。