如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
当前回答
简单的“一行”字符串哈希生成器 (1byte = 2chars)
$hash = implode('-', [
bin2hex(random_bytes(3)),
bin2hex(random_bytes(3)),
bin2hex(random_bytes(3)),
bin2hex(random_bytes(3)),
]);
其他回答
这个函数将使用数字和字母生成一个随机键:
function random_string($length) {
$key = '';
$keys = array_merge(range(0, 9), range('a', 'z'));
for ($i = 0; $i < $length; $i++) {
$key .= $keys[array_rand($keys)];
}
return $key;
}
echo random_string(50);
示例输出:
zsd16xzv3jsytnp87tk7ygv73k8zmr0ekh6ly7mxaeyeh46oe8
我喜欢在处理验证链接时使用散列键。我建议使用微时间和使用MD5的哈希,因为没有理由为什么键应该是相同的,因为它是基于微时间哈希的。
$key = md5(rand()); $key = md5(微时间());
我认为这是最好的方法。
str_shuffle(md5(rand(0,100000)))
PHP 7标准库提供了random_bytes($length)函数,该函数生成加密安全的伪随机字节。
例子:
$bytes = random_bytes(20);
var_dump(bin2hex($bytes));
上面的例子将输出类似于:
string(40) "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
更多信息:http://php.net/manual/en/function.random-bytes.php
PHP 5(过时)
我只是在寻找如何解决这个相同的问题,但我也希望我的函数创建一个令牌,可以用于密码检索以及。这意味着我需要限制令牌的猜测能力。因为uniqid是基于时间的,而根据php.net“返回值与microtime()相差不大”,uniqid不符合条件。PHP建议使用openssl_random_pseudo_bytes()来生成加密安全的令牌。
一个快速、简短、直截了当的答案是:
bin2hex(openssl_random_pseudo_bytes($bytes))
它将生成一个长度= $bytes * 2的字母数字字符的随机字符串。不幸的是,这只有一个字母[a-f][0-9],但它是有效的。
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $range);
return $min + $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet); // edited
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
}
return $token;
}
Crypto_rand_secure ($min, $max)作为rand()或mt_rand的替换。它使用openssl_random_pseudo_bytes来帮助创建一个介于$min和$max之间的随机数。
getToken($length)创建一个要在令牌中使用的字母表,然后创建一个长度为$length的字符串。
来源:http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php # 104322
斯科特,是的,你写得很好,解决得很好!谢谢。
我还需要为我的每个用户生成唯一的API令牌。以下是我的方法,我使用用户信息(Userid和Username):
public function generateUniqueToken($userid, $username){
$rand = mt_rand(100,999);
$md5 = md5($userid.'!(&^ 532567_465 ///'.$username);
$md53 = substr($md5,0,3);
$md5_remaining = substr($md5,3);
$md5 = $md53. $rand. $userid. $md5_remaining;
return $md5;
}
请看看,如果我能做什么改进,请告诉我。谢谢