地穴生成* 0

时间:2014-11-19 13:12:32

标签: php passwords

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个字符。

1 个答案:

答案 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)));