从password_hash()确定salt

 兔牙的猪蹄 发布于 2023-02-06 15:37

我用bcrypt哈希我的密码(因为我运行php 5.3.10 实际上是用password_compat)
我想把函数的结果字符串分成两部分:使用的盐和哈希本身.(我知道使用password_verify()来验证密码.但是我需要使用哈希作为密钥来加密更广泛的安全系统中的私钥.)

对于给定的密码(abcdef),这是结果:

 $2y$10$ult68Ti4/zEWX4VQ       ....           YCOWjL6

我已经改变了一点功能,吐出了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);

我想结果哈希是的一个CONCAT $hash_format,$salt以及hash......但最后一个字符是不同的...

                                               _
[concat] =>        $2y$10$oWfFYcNqlcUeGwJM0AFUguSJ5t  .....  SvWG
[salt] =>                 oWfFYcNqlcUeGwJM0AFUgw
[hash_format] =>   $2y$10$oWfFYcNqlcUeGwJM0AFUgw
[format] =>        $2y$10$
                                               ^

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

这怎么可能?

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

    您可以在此处找到更详细的答案:为什么crypt/blowfish使用两种不同的盐生成相同的哈希值?

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

    2023-02-06 15:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有