PHP bcrypt 到 PYTHON bycrypt 不提供相同的值

PHP bcrypt to PYTHON bycrypt not giving same values

您好,我正在 python 上构建一个 API 来创建用户并在数据库中插入密码。问题是应用程序在 Laravel PHP 上并使用 bcrypt。
例如在 PYTHON 中加密 "test1234$%" 给出 "$2b$12$rsGZPtjctbI6bSGzS4P3mOSdrABnJuHfnKxEQwvm4KFu72BN3XNKK" 并在 PHP 给出$2y$10$cO2nvRURLRdlW8j6CbWu8OeVlv7dyeozpBZcxVB2nd8hbyILyg7Xa

并且当尝试使用 api 在应用程序上创建的用户登录时,它不起作用。 即使我用这个测试它也不起作用输出是 invalid:

$hash = 'b$rsGZPtjctbI6bSGzS4P3mOSdrABnJuHfnKxEQwvm4KFu72BN3XNKK';

//validade hash in php
if(password_verify ( "test1234$%", $hash )){
  echo "valid";
} else {
  echo "invalid";
}

echo("\n".phpversion());

在python端使用了以下代码:

pip install bcrypt

 import bcrypt
 
 password = item.password
 bpassword = b"password"
 hashed = bcrypt.hashpw(bpassword, bcrypt.gensalt())

PHP 侧:

if (! function_exists('bcrypt')) {
    /**
     * Hash the given value against the bcrypt algorithm.
     *
     * @param  string  $value
     * @param  array  $options
     * @return string
     */
    function bcrypt($value, $options = [])
    {
        return app('hash')->driver('bcrypt')->make($value, $options);
    }
}

bcrypt 在每个运行时使用不同的盐,这就是为什么它非常适合在数据库中存储密码......除非你每次都强制它使用相同的盐,它会继续生成不同的结果哈希

我在 Python api 中找到了一个解决方案 我在 PHP 中使用子进程

调用了 bcrypt
code = """echo password_hash("""'"'+item.password+'"'""",PASSWORD_BCRYPT);"""
    hashed_password = await myClass.php(code)
  async def php(self, code):
        p = subprocess.Popen(["php", "-r", code],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out = p.communicate()
        if out[1] != b'': raise Exception(out[1].decode('UTF-8'))
        return out[0].decode('UTF-8')