如何使用数字和字母生成用于验证链接的随机唯一字符串?比如,当你在网站上创建一个帐户时,它会向你发送一封带有链接的电子邮件,你必须单击该链接才能验证你的帐户
如何使用PHP生成其中一个
PHP7标准库提供了生成加密安全伪随机字节的random_bytes($length)函数
例如:
$bytes=随机字节(20);
变量转储(bin2hex($bytes));
上面的示例将输出类似于:
字符串(40)";5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9“;
更多信息:http://php.net/manual/en/function.random-bytes.php
PHP5(过时)
我只是在研究如何解决这个问题,但我也希望我的函数能够创建一个令牌,该令牌也可以用于密码检索。这意味着我需要限制令牌的猜测能力。因为uniqid是基于时间的,并且根据php.net;返回值与microtime()相差不大uniqid不符合标准。PHP建议使用openssl\u random\u pseudo\u bytes()来生成加密安全令牌
一个快速、简短且切中要害的答案是:
bin2hex(openssl_随机_伪_字节($bytes))
它将生成一个随机的字母数字字符串,长度=$bytes*2。不幸的是,它只有一个字母表[a-f][0-9],但它可以工作
下面是我能做的满足条件的最强函数(这是Erik答案的实现版本)。
函数加密和安全($min,$max)
{
$range=$max-$min;
如果($range<;1)返回$min;//不太随机。。。
$log=ceil(log$range,2));
$bytes=(int)($log/8)+1;//字节长度
$bits=(int)$log+1;//以位为单位的长度
$filter=(int)(1<;<;$bits)-1;//将所有低位设置为1
做{
$rnd=hexdec(bin2hex(openssl_random_pseudo_bytes($bytes));
$rnd=$rnd&;$filter;//丢弃不相关的位
}而($rnd>;$range);
返回$min+$rnd;
}
函数getToken($length)
{
$token=";;
$code字母表=“ABCDEFGHIJKLMNOPQRSTUVWXYZ”;;
$codeAlphabet.=“abcdefghijklmnopqrstuvwxyz”;;
$codeAlphabet.=“0123456789”;;
$max=strlen($codelphabet);//已编辑
对于($i=0;$i<;$length;$i++){
$token.=$codeAlphabet[crypto_rand_secure(0,$max-1)];
}
返回$token;
}
crypto\u rand\u secure($min,$max)作为rand()或mt\u rand的替代品。它使用openssl_random_pseudo_字节帮助创建一个介于$min和$max之间的随机数
getToken($length)创建一个要在令牌中使用的字母表,然后创建一个长度字符串$length
资料来源:http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322