bin2hex vs base64_encode 用于随机哈希令牌?

bin2hex vs base64_encode for random hashed token?

要为密码重置或电子邮件激活生成安全的 URL 安全散列,这些函数中的哪一个更安全,bin2hexbase64_encode在下面的应用中?

1.生成令牌(使用其中之一):

$token = bin2hex(openssl_random_pseudo_bytes(32));
$token = strtr(base64_encode(openssl_random_pseudo_bytes(64)), "+/=", "XXX");

2。存储在数据库中:

$token_hash = password_hash($token, PASSWORD_BCRYPT);
INSERT INTO hash_table SET token_hash='$token_hash', series='X'

3。验证令牌:

SELECT token_hash FROM hash_table WHERE series='X'
if (password_verify($hash_from_url,$token_hash)) {
  // Success
}

我注意到当 $hash_from_url 超过 72 个字符时,它不再有任何区别。

但是使用 base64 来获得 61 个不同的字符而不是仅使用 16 个的 bin2hex 会更好吗,假设我使用更大数量的随机字节,对于一个同样长的字符串,即 72 个字符长度?

编码本身实际上并没有改变安全方面的任何内容。

正如您已经指出的那样,对于相同的字节数,bin2hex() 将 return 比 base64_encode() 更长的字符串,因为可能的字符基数较小。这意味着,如果给定令牌的长度,base64 编码会产生具有更多熵的令牌,因此更适合。

如果您的令牌足够强大(最少 20 个字符 a..z、A..Z、0..9),您可以使用简单的散列函数(例如 SHA-256),无需加盐和密钥拉伸,而不是password_hash。这样您就可以在数据库中创建可搜索的哈希值。

前段时间写了一个small class生成一定长度的base62 token用于密码重置,或许你想看看代码