【问题标题】:Is it a secure method to generate token?生成令牌是一种安全的方法吗?
【发布时间】:2018-04-17 14:54:57
【问题描述】:

我不想生成令牌来验证用户的电子邮件,我了解了通用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;

}

【问题讨论】:

  • 不,永远不要推出自己的加密货币。在这种情况下,您只需要使用适当的随机源,这应该足够了$token = bin2hex(openssl_random_pseudo_bytes(16));
  • 所有这些矫枉过正的“加密货币”和一个重要的位 (rand()) 都使其易受攻击。 @JimL 是对的,使用那一行。
  • 使用确定性伪随机数生成器在密码学上永远不会安全。它只是创建了一个额外的攻击向量,即有人可以通过知道你的初始种子来预测令牌。
  • 即使openssl_random_pseudo_bytes() 也不总是加密安全的;使用random_bytes()

标签: php security token universal-hashing


【解决方案1】:

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

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

【讨论】:

  • 最重要的是,rand() 不是真正随机的,这使得解决方案如问题中所述存在缺陷。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2013-09-20
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多