协慌网

登录 贡献 社区

PHP 随机字符串生成器

我正在尝试在 PHP 中创建一个随机字符串,我绝对没有输出:

<?php
function RandomString()
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring = $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}
RandomString();
echo $randstring;

我究竟做错了什么?

答案

要具体回答这个问题,有两个问题:

  1. 当你回应它时, $randstring不在范围内。
  2. 字符在循环中没有连接在一起。

这是一个带有更正的代码片段:

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

使用以下调用输出随机字符串:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

请注意,这会生成可预测的随机字符串。如果要创建安全令牌, 请参阅此答案

注意: str_shuffle()内部使用rand() ,这不适合加密(例如生成随机密码)。你想要一个安全的随机数发生器 。它也不允许重复字符。

还有一种方法。

UPDATED (现在生成任意长度的字符串):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

而已。 :)

这个问题有很多答案,但没有一个利用密码安全伪随机数发生器 (CSPRNG)。

简单,安全和正确的答案是使用RandomLib并且不要重新发明轮子。

对于那些坚持发明自己的解决方案的人,PHP 7.0.0 将为此提供random_int() ; 如果你仍然使用 PHP 5.x,我们random_int()编写了一个PHP 5 random_int()这样你甚至可以在升级到 PHP 7 之前使用新的 API。

在 PHP 中安全地生成随机整数并非易事。在生产中部署本地算法之前,应始终与驻留的 StackExchange 加密专家核实。

使用安全的整数生成器,使用 CSPRNG 生成随机字符串就是在公园散步。

创建安全的随机字符串

/**
 * 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')
{
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

用法

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

演示https ://3v4l.org/b4PST(忽略 PHP 5 失败; 它需要 random_compat)