php验证密码与确认密码一致,php – 从password_hash()确定salt

我用bcrypt哈希我的密码(因为我运行php 5.3.10,实际上是password_compat)

我想将函数的结果字符串拆分为两部分:使用的盐和散列本身. (我知道使用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和哈希的连续…但最后一个字符是不同的…

_

[concat] => $2y$10$oWfFYcNqlcUeGwJM0AFUguSJ5t ..... SvWG

[salt] => oWfFYcNqlcUeGwJM0AFUgw

[hash_format] => $2y$10$oWfFYcNqlcUeGwJM0AFUgw

[format] => $2y$10$

^

正如您所看到的,在crypt函数之前和函数之后,salt中的最后一个字符是不同的.

这怎么可能?

解决方法:

传递给crypt()的salt可能与生成的哈希值中返回的salt不同的原因是,BCrypt内部仅使用126位的salt,但传递给该函数的salt始终包含128位.由于crypt函数需要对base64编码的salt类,因此不能直接传递126位.

我知道您希望使用真实哈希作为加密另一个密钥的密钥,您可以从生成的哈希值中提取它.此字符串始终具有某种格式,其中$用于分隔各部分,而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位密钥.

标签:crypt,php,hash,bcrypt

来源: https://codeday.me/bug/20191005/1856193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值