在PHP中生成随机代码?

6

我知道这可能看起来很傻,但我想使用php生成一个8位长的随机代码,只包含数字或字母。我需要用它为每个注册用户生成一个密码,谢谢。


6
你是否尝试过在谷歌上搜索“php随机密码生成器”?会有很多相关结果。 - atk
8个回答

15

我更愿意使用md5来生成密码。

但是如果你想要一个自定义的,你可以使用类似这样的内容:

function createRandomPassword() { 

    $chars = "abcdefghijkmnopqrstuvwxyz023456789"; 
    srand((double)microtime()*1000000); 
    $i = 0; 
    $pass = '' ; 

    while ($i <= 7) { 
        $num = rand() % 33; 
        $tmp = substr($chars, $num, 1); 
        $pass = $pass . $tmp; 
        $i++; 
    } 

    return $pass; 

} 

1
使用 md5() 的想法,你可以取代现在返回的 $pass,改为 return substr(md5($pass), 0, 8); - Patrick
我猜测这里的L和1是故意保留的!因为它们看起来相似? - Nijboer IT
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Tim Dearborn
现在我会使用类似这样的代码:$chars = "abcdefghijkmnopqrstuvwxyz023456789"; $i = 0; $token = ''; while ($i <= 7) { $num = \random_int(0, 33); $token .= $chars{$num}; $i++; }(使用CSPRNG / 纯随机PHP函数) - jens1o

11

这样的代码是否更加简洁易懂:

$pass = substr(md5(uniqid(mt_rand(), true)) , 0, 8);

4
一个好的或高效的方法是:
public function generateRandomString($length = 8) {
    $characters = '0123456789abcdefghijklmnopqrs092u3tuvwxyzaskdhfhf9882323ABCDEFGHIJKLMNksadf9044OPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

通过更改$length变量,您可以根据需要生成包含字母数字的代码。


3
<?php 

$uniqid = uniqid();

$rand_start = rand(1,5);

$rand_8_char = substr($uniqid,$rand_start,8);

?>

你可能想要对时间进行加盐,否则黑客可能会利用这一点。虽然可能性很小,但仍有可能发生。 - Patrick
我认为“长枪大炮”这个说法有些保守了。 ;) - jondavidjohn
仍然,所有的黑客拥有的只是时间 :-) - Patrick
好的!我没有按照你告诉我的去做,但是我让子字符串的起始位置变成了随机的。更好了吧? ;) - jondavidjohn
我刚做了一点研究,看起来这整个来回都是徒劳的,你只需要在 uniqid() 的第二个参数中添加 true,它就会为唯一值添加熵 :-) - Patrick
我认为这会添加特殊字符,而他不想在密码中使用。 - jondavidjohn

3
这个很好用,你可以选择生成哪种类型的字符,例如:
"大写字母"、"小写字母"、"数字"、"特殊字符"
function create_random_code($length = 8, $in_params = [])
{
    $in_params['upper_case']        = isset($in_params['upper_case']) ? $in_params['upper_case'] : true;
    $in_params['lower_case']        = isset($in_params['lower_case']) ? $in_params['lower_case'] : true;
    $in_params['number']            = isset($in_params['number']) ? $in_params['number'] : true;
    $in_params['special_character'] = isset($in_params['special_character']) ? $in_params['special_character'] : false;

    $chars = '';
    if ($in_params['lower_case']) {
        $chars .= "abcdefghijklmnopqrstuvwxyz";
    }

    if ($in_params['upper_case']) {
        $chars .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }

    if ($in_params['number']) {
        $chars .= "0123456789";
    }

    if ($in_params['special_character']) {
        $chars .= "!@#$%^&*()_-=+;:,.";
    }

    return substr(str_shuffle($chars), 0, $length);
}

使用方法:

echo create_random_code(
    6,
    [
        'upper_case'        => true,
        'lower_case'        => true,
        'number'            => true,
        'special_character' => false
    ]
);

1

PHP有一个rand函数(还有一个mt_rand函数,据文档称速度更快。)

所以可以这样做:

$i = 0;
$pwd = "";
while ( $i < 10) {
    if (mt_rand() % 2 == 0) {
        $pwd .= rand();
    } else {
        $pwd .= char(rand());
        // http://php.net/manual/en/function.chr.php
    }
    $i += 1;
}

另一个选项是仅使用rand()一次,通过设置允许的最小和最大数字来生成密码,例如- $pwd = rand(10000000, 99999999); - Patrick
@Patrick -- 很好的想法!如果速度是一个问题,那么你可以用字符串连接或调用char来替换内部的随机调用。 - Sean Vieira

1
使用base64_encode()函数,将一些rand()生成的数字输入其中,并截取前8个字符,这些字符肯定是字母或数字。由于输入只是整数,所以这不是完全随机的组合。但对于默认用户密码来说已经足够了。(否则在编码之前使用chr()通过rand()生成字符。)

0

对于您的目的,您可以使用以下内容生成随机代码:

bin2hex(random_bytes(10))

请注意,这里使用的是random_bytes,它是在PHP 7中引入的,并使用加密随机生成器,如果您希望随机代码难以猜测,则这一点非常重要。 random_int也是在PHP 7中引入的,同样使用加密随机生成器。
许多其他用于生成随机值的解决方案,包括涉及time()microtime()uniqid()rand()mt_rand()str_shuffle()array_rand()shuffle()的解决方案,更容易预测,并且如果随机字符串将用作密码、承载凭据、nonce、会话标识符、“验证代码”或“确认代码”或另一个秘密值,则不适合使用。
上面的代码生成了一个由20个十六进制字符(0到9或A到F)组成的字符串。如果您想使用更大的字符集(例如所有大写字母、所有小写字母和10个数字),这是一个更复杂的过程,但是如果该字符串将用作密码、"确认码"或其他机密值,则必须使用random_int而不是rand()mt_rand()str_shuffle()等。请参见相关问题的答案
我还列出了在生成唯一标识符时需要注意的其他事项,特别是随机生成的标识符。

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