Crypt有时会生成字符串*0
而不是真正的哈希值。
const SALT_BYTE_SIZE = 24;
const HASH_PAYLOAD = 13;
public static function createHash($password, $cost = self::HASH_PAYLOAD) {
$salt = '$2a$' . $cost . '$' . base64_encode(mcrypt_create_iv(self::SALT_BYTE_SIZE, MCRYPT_DEV_URANDOM));
$password = crypt($password, $salt);
return $password;
}
我在Stackoverflow周围找到了行base64_encode(mcrypt_create_iv(self::SALT_BYTE_SIZE, MCRYPT_DEV_URANDOM));
,说明这是生成随机盐的好方法。已经过了几个星期,所以我再也找不到答案了。我想知道随机盐是否会导致crypt生成字符串*0
。
给定的密码始终是一个字母数字字符串,长度为8个字符。
答案 0 :(得分:0)
crypt
也会返回*0
- 这就是这种情况。引用the doc:
Blowfish用盐进行散列如下:
"$2a$"
,"$2x$"
或"$2y$"
, 两位数的成本参数"$"
和字母表中的22个字符 的"./0-9A-Za-z"
强>
最有可能的是,您假设base64_encode()
返回同一组字符的字符串。但它不是 - 还有一个+
符号(完整字母为[a-zA-Z0-9+/]
)。
一个明显的解决方法是将所有+
替换为.
:
$salt = '$2a$' . $cost . '$' .
str_replace('+', '.',
base64_encode(mcrypt_create_iv(self::SALT_BYTE_SIZE, MCRYPT_DEV_URANDOM)));