bin2hex vs base64_encode用于随机散列令牌?

时间:2016-11-02 14:35:58

标签: hash passwords hex base64 password-encryption

要为密码重置或电子邮件激活生成安全的URL安全哈希,以下应用程序中哪一个功能更安全, bin2hex base64_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个字符长度?

1 个答案:

答案 0 :(得分:1)

编码本身并没有真正改变安全方面的任何内容。

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

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

前段时间,我写了一个small class来生成一定长度的base62令牌以进行密码重置,也许你想查看代码。