我正在使用bcrypt对我的密码进行哈希处理(实际上是password_compat,因为我运行了php 5.3.10)
我想将函数的结果字符串拆分为两部分:使用的盐和散列本身。 (我知道使用password_verify()来验证密码。但我需要使用哈希作为密钥来加密更广泛的安全系统中的私钥。)
对于给定的密码(abcdef),结果如下:
$2y$10$ult68Ti4/zEWX4VQ .... YCOWjL6
我稍微改变了the function,吐出了concat,salt,hash和hash_format。
... from the password_compat ...
$salt = substr($salt, 0, $required_salt_len);
$hash = $hash_format . $salt;
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen($ret) <= 13) {
return false;
}
return array( 'concat'=>$ret,
'salt'=>$salt,
'format'=>$hash_format,
'hash_format'=>$hash);
我认为结果哈希是$hash_format
,$salt
和hash
的结尾...但是最后一个字符是不同的......
_
[concat] => $2y$10$oWfFYcNqlcUeGwJM0AFUguSJ5t ..... SvWG
[salt] => oWfFYcNqlcUeGwJM0AFUgw
[hash_format] => $2y$10$oWfFYcNqlcUeGwJM0AFUgw
[format] => $2y$10$
^
正如您所看到的,在crypt函数之前和函数之后,salt中的最后一个字符是不同的。
这怎么可能?
答案 0 :(得分:12)
传递给crypt()
的盐可能与生成的哈希值中返回的盐不同的原因是,BCrypt内部仅使用126位盐,但传递给函数的盐总是包含128位。由于crypt函数需要base64编码的salt类,因此不能直接传递126位。
您可以在此处找到更详细的答案:Why does crypt/blowfish generate the same hash with two different salts?
我知道您希望使用真实哈希作为加密另一个密钥的密钥,您可以从生成的哈希值中提取它。此字符串始终为某种格式,$
用于分隔各部分,BCrypt实际哈希是最后31个字符
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
另一种可能性是计算整个字符串的哈希值(全部60个字符)。您可以选择返回所需长度的算法,例如sha256获取MCRYPT_TWOFISH的256位密钥。