我的饼干代币应该有多长


How long should my cookie token be?

这就是我用来存储cookie以验证网站上用户的方法。

我生成的令牌应该有多长?33就足够了吗?还是应该是64?我这一代人足够安全吗?

<?PHP 
$token = bin2hex(openssl_random_pseudo_bytes(33));
echo $token.'<br>';
$hash = hash('sha256', $token);
echo $hash;
//Test user db and local cookie
    $stored_hash = '5be39777ad41916c5fa1e78681bfc8793a5cfe7c27842846ad23396e44b390a7';
    $cookie = '1a9243f95354252d937d2b99e64a7eeb462e00c72b26d488426f08ef11667522c6';
$cookie_hash = hash('sha256', $cookie);
if(hash_equals($stored_hash, $cookie_hash))
  echo 'true';
else
  echo 'false';
?>

首先建议改进令牌,而不是使用十六进制表示,我建议使用base62编码。这样的字符串包含大小写字符,因此在相同的信息下可以更短。

接下来,我们假设您创建了一个包含20个base62编码字符的随机令牌,这将允许700'000'000'0000'000'000组合!即使你能以15 Giga SHA256/秒的速度使用暴力,也需要大约7E17年才能找到正确的代币。这样一个包含20个字符的令牌只需要15个字节,所以您在第一种方法中建议的33个字节肯定绰绰有余。

我写了一个小类来帮助生成这样的base62令牌,如果你感兴趣的话,可以看看它。