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;
我究竟做错了什么?
具体回答这个问题有两个问题:
$randstring
不在范围之内。 这是一个带有更正的代码片段:
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()
,这不适用于加密目的(例如,生成随机密码)。 你需要一个安全的随机数发生器。 它也不允许字符重复。
还有一种方法。
已更新 (现在这会生成任意长度的字符串):
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)
链接地址: http://www.djcxy.com/p/20591.html