我的 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,有兴趣的可以看看。
这是我用来存储 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,有兴趣的可以看看。