在 php 中生成随机密码

2022-08-30 06:19:03

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

但是,我得到了所有的'a',返回类型是数组类型,我希望它是一个字符串。关于如何更正代码的任何想法?

谢谢。

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

答案 1

安全警告:不是加密安全的伪随机数生成器。在其他地方查找在PHP中生成加密安全的伪随机字符串rand()

试试这个(使用代替 ,因为在字符串上总是):strlencountcount1

function randomPassword() {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    $pass = array(); //remember to declare $pass as an array
    $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }
    return implode($pass); //turn the array into a string
}

演示


答案 2

TL;DR:

  • 使用和下面给出的。random_int()random_str()
  • 如果没有 ,请使用 random_compatrandom_int()

解释:

由于您正在生成密码,因此您需要确保生成的密码是不可预测的,并且确保此属性存在于实现中的唯一方法是使用加密安全的伪随机数生成器 (CSPRNG)。

对于随机字符串的一般情况,可以放宽对 CSPRNG 的要求,但在涉及安全性时则不放宽。

PHP中密码生成的简单,安全和正确的答案是使用RandomLib,不要重新发明轮子。此库已由行业安全专家以及我自己进行了审核。

对于喜欢发明自己的解决方案的开发人员,PHP 7.0.0 将为此提供 random_int()。如果你还在使用 PHP 5.x,我们为 random_int() 编写了 PHP 5 polyfill,这样你就可以在 PHP 7 发布之前使用新的 API。使用我们的 polyfill 可能比编写自己的实现更安全。random_int()

有了安全的随机整数生成器,生成安全的随机字符串比 pie 更容易:

<?php
/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    $length,
    $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
) {
    $str = '';
    $max = mb_strlen($keyspace, '8bit') - 1;
    if ($max < 1) {
        throw new Exception('$keyspace must be at least two characters long');
    }
    for ($i = 0; $i < $length; ++$i) {
        $str .= $keyspace[random_int(0, $max)];
    }
    return $str;
}

推荐