【问题标题】:How long should my cookie token be?我的 cookie 令牌应该有多长?
【发布时间】:2015-11-22 23:57:55
【问题描述】:

这是我想出的存储 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';
?>

【问题讨论】:

  • 你有多偏执?你要存储多少令牌?
  • 大约 10k 用户。至于偏执狂只是想安全。 33 和 64 长度有很大的安全差异吗?
  • 只需使用会话cookie并修改php.ini,特别是哈希函数和每个字符的哈希位,php.net/manual/en/…
  • 想象一个被认为是“唯一”的 GUID,然后使用“sha256”对其进行哈希处理。 base64_encode - 存储在 cookie 中。我怀疑很难预测,并且很可能对于您的目的“足够独特”? '在顶部' - 也许。

标签: php cookies random hash sha256


【解决方案1】:

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

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

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

【讨论】:

  • @RyanVincent - 没有 base62 编码的字符串包含 0-9 a-z A-Z,而 base64 编码的字符串还包含 + 和 = 字符,这在 URL 中使用时可能会导致问题。
  • 对不起 - 我的错!我刚刚学到了一些新信息。谢谢。
  • @RyanVincent - 应该明确提及,没问题。
  • bin2hex(openssl_random_pseudo_bytes(30)) 给出大小写。为什么 base62 更好?
  • @user2570937 - bin2hex 函数将每个字符转换为其十六进制表示形式(1 字节输入 -> 2 字节输出)。输出的可能字符是0-9 a-f,没有其他字符,也没有大写字符。当然,如果可以使用更大的字母表,您需要更少的数字来表示相同的值。一个例子:在我们的十进制系统中,我们可以将值 8 写入单个数字,在二进制系统中,相同的值会像这样写入 1000,并且需要 4 个数字。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2012-07-04
  • 2012-02-01
相关资源
最近更新 更多