要为密码重置或电子邮件激活生成安全的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个字符长度?
答案 0 :(得分:1)
编码本身并没有真正改变安全方面的任何内容。
正如您已经指出的那样,bytearray
对于相同的字节数将返回更长的字符串bin2hex()
,因为可能字符的基数较小。这意味着,如果给出令牌的长度,base64编码会生成具有更多熵的令牌,因此更适合。
如果您的令牌足够强大(最少20个字符a..z,A..Z,0..9),您可以使用简单的哈希函数(例如SHA-256)而无需salting和keystretching而不是password_hash。这样,您就可以在数据库中创建可搜索的哈希值。
前段时间,我写了一个small class来生成一定长度的base62令牌以进行密码重置,也许你想查看代码。