PHP中的随机密码生成器不返回密码

时间:2016-05-21 06:53:56

标签: php arrays

我正在尝试在php中设置随机密码生成器功能,但这对我不起作用。我收到错误:

  

注意:第12行的C:\ xampp \ htdocs \ php-testing \ index.php中的数组到字符串转换

     

阵列

我做错了什么?

<?php
function pwGenerator($len = 10) {
    $charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
    $pw = array();
    $length = strlen($charRange);
    for ($x = 0; $x < $len; $x++) {
        $n = rand(0, $length);
        $pw[] = $charRange[$n];
    }

    return $pw;
}

echo pwGenerator();

7 个答案:

答案 0 :(得分:3)

您无法直接将数组转换为字符串。因此,不是将其存储在数组中,而是可以使用字符串附加字符。现在它正在发挥作用。

<?php
    function pwGenerator($len = 10) {
        $charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
        $pw = null;
        $length = strlen($charRange);
        for ($x = 0; $x < $len; $x++) {
            $n = rand(0, $length);
            $pw .= $charRange[$n];
        }
        return $pw;
    }
    echo pwGenerator();
    ?>

答案 1 :(得分:0)

试试这个

你应该将 $ pw 定义为字符串而不是数组

$pw.=连接像这样的字符串序列

<?php


function pwGenerator($len = 10) {
    $charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
    $pw ='';
    $length = strlen($charRange);
    for ($x = 0; $x < $len; $x++) 
    {
        $n = rand(0, $length);

        $pw.= $charRange[$n];
    }

    return $pw;
}

 echo pwGenerator();

?>

答案 2 :(得分:0)

我认为你的错误是不需要将$pw声明为数组声明为普通字符串变量。尝试下面的代码工作。

<?php
    function pwGenerator($len = 10) {
        $charRange = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()";
        $pw = "";
        $length = strlen($charRange);
        for ($x = 0; $x < $len; $x++) {
            $n = rand(0, ($length-1));
            $pw .= $charRange[$n];
        }
        return $pw;
    }
    echo pwGenerator();
?>

你的返回单个密码字符串值所以不需要像Array简单声明字符串变量那样去掉。它可以帮助你。

答案 3 :(得分:0)

更快的方法可能是对字符集进行随机播放,然后抓取适当长度的字符串。

function random_password( $length = 10 ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?";

    $substr_length = 3;
    if( $length > $substr_length ) {

        $password = '';
        while ( strlen($password) < $length) {
            $current_length = strlen( $password );
            $substr_length = ($length - $current_length) > $substr_length ? $length - $current_length : $current_length;
            $password .= substr( str_shuffle( $chars ), 0, $substr_length );
        }

    } else {

        $password = substr( str_shuffle( $chars ), 0, $length );

    }

    return $password;
}

借鉴https://stackoverflow.com/a/21768419/2712737

答案 4 :(得分:0)

我就是这样做的。由于允许字符重复并使用mt_rand(),因此它不仅速度快,而且比其他一些更加随机(因此更安全)。

function generateRandomPassword($length = 10)
{
    static $chars = 'abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789!@#$%^&*()';
    static $charsLength = strlen($chars);

    $randomPassword = '';
    for ($i = 0; $i < $length; ++$i)
    {
         $randomPassword .= $chars[mt_rand(0, $charsLength - 1)];
    }

    return $randomPassword;
}

$chars$charsLength声明为static可能过度,但确实会带来性能提升。此外,mt_rand()rand()更安全。

您收到的有关“数组到字符串转换”的原始错误是因为您从函数返回了一个数组。如果你想解决这个问题,只需更改:

return $pw;

要:

return implode('', $pw);

答案 5 :(得分:0)

它可以是一个简单的解决方案。

$arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'T', 
'W', 'Y', '@', '#', '$', '*', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 
'd', 'e', 'f', 'g', 'h', 'm', 'n', 'p', 'q', 'r', 't', 'u', 'w', 'y', 'z');

$arr2 = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M', 'N', 
'P', 'Q', 'R', 'T', 'W', 'Y', 'a', 'b', 'd', 'e', 'f', 'g', 'h', 'm', 
'n', 'p', 'q', 'r', 't', 'u', 'w', 'y', 'z');

        $rnd = array_random($arr, 4);
        $rnd2 = array_random($arr2, 2);

        $password = $rnd2[0].$rnd[0].$rnd[1].$rnd[2].$rnd[3].$rnd2[1];

第一个和最后一个字符将只是Letter。中间字符为字母,数字或特殊字符。

答案 6 :(得分:0)

可靠的密码您只能使用 ascii 字符 a-zA-Z和数字0-9 。要做到这一点,最好的方法是使用加密安全方法,例如PHP7中的 random_int() random_bytes()。 Rest函数as base64_encode()您只能用作支持函数来提高字符串的可靠性,并将其更改为 ASCII 字符。

rand()不安全且非常老。 从任何字符串您必须使用random_int()。从二进制字符串您应该使用base64_encode()使二进制字符串可靠或bin2hex,但是然后您将字节仅切换到16个位置(值)。 See my implementation of this functions.