我的 cookie 令牌应该有多长?

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'000'000'000'000'000'000'000'000'000 组合!即使您可以使用 15 Giga SHA256/second 进行暴力破解,也需要大约 7E17 年才能找到正确的令牌。这样一个 20 个字符的 token 只需要 15 个字节,所以你在第一种方法中建议的 33 个字节肯定绰绰有余。

我写了一个小的class来帮助生成这样的base62 token,有兴趣的可以看看。