它是生成令牌的安全方法吗?

Is it a secure method to generate token?

我不想生成令牌来验证用户的电子邮件,我学习了通用 hashing(从一系列哈希函数中随机选择一个哈希函数),我在 PHP

生成令牌的方法安全吗?

$string ='';
$length = 60;
$pattern = 'abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY0123456789';
$hashList = array('sha256','sha384','sha512','ripemd256','ripemd320','openssl_random_pseudo_bytes');
$randNumber = mt_rand(0, 6);

for($i=0; $i<$length; $i++)
{
    $string .= $pattern[rand()%strlen($pattern)];
}

switch ($randNumber) {

    case 0:
    return substr(hash($hashList[$randNumber],$string),0,$length);    
    break;

    case 1:
    return substr(hash($hashList[$randNumber],$string),0,$length);
    break;

    case 2:
    return substr(hash($hashList[$randNumber],$string),0,$length);
    break;

    case 3:
    return substr(hash($hashList[$randNumber],$string),0,$length);
    break;

    case 4:
    return substr(hash($hashList[$randNumber],$string),0,$length);
    break;

    case 5:
    return substr(bin2hex($hashList[$randNumber]($length)),0,$length);
    break;

    default:
    return $string;
    break;

}

这对我来说似乎有点复杂,验证用户电子邮件可能不是最重要的安全事项,通过该功能生成哈希。不太可能猜测哈希值。

我会只选择一个散列函数,不要只是从用户名、电子邮件值创建散列值,向字符串中添加一些盐或随机内容。下一个选项是控制已处理的无效验证数量,并在一段时间内阻止用户进行验证。