gpt4 book ai didi

PHP password_verify() 与 Python bcrypt.hashpw()

转载 作者:可可西里 更新时间:2023-11-01 13:31:37 26 4
gpt4 key购买 nike

所以,就这样吧。

我已经设置了一个[简单的] PHP REST API,我通过 X-API-KEY header key 接收散列密码。这在与另一个 PHP 脚本交互时效果很好,并且该短语通过 PHP 的 password_hash() 方法进行哈希处理。但是,当我尝试通过 Python 和 Requests 库与 API 交互时, key 被拒绝。以下是一些示例:

PHP:

<?php
$usrid = '123456';
$dt = new DateTime();
$secret = "secret{$usrid}{$dt->format('Ymd')}";
$hashed = password_hash($secret, PASSWORD_BCRYPT);
echo $secret."\n";
echo $hashed."\n";
echo(phpversion());
?>

python :

#!/usr/bin/python
import bcrypt, datetime, sys
usrid = '123456' # user id
t = datetime.datetime.now().strftime('%Y%m%d')
secret = "secret{usrid}{t}".format(usrid=usrid,t=t)
hashed = bcrypt.hashpw(secret, bcrypt.gensalt())
print secret
print hashed
print '%d.%d.%d' % (sys.version_info[:3])

每一个的输出如下:

PHP:
secret12345620161116
$2y$10$/WUBS2RkTlfcgPxvmqYRI.EkBD/CPgnpE9rYvOqweERgSwFeENUDO
5.6.24

Python:
secret12345620161116
$2b$11$9v/l6KglHiNgOybw1Y8jWeCFHiAfv.cguO1Qmc7Noe4azSluoBeHO
2.7.11

现在,很明显它们是不同的,这就是重点,但是当您将 Python 输出传递给 PHP password_verify() 函数时,它返回 False。 PHP 输出验证正常。

一定有什么东西是我在这里遗漏的,但我这辈子都找不到了。我尝试使用不同的盐选项但没有成功。我错过了什么?两者只是不兼容吗?如果这是真的,这似乎很愚蠢。

先谢谢你们,你们这些聪明的互联网人。

更新

[我已经用以下两行测试更新了脚本]

PHP: $hashed = password_hash($secret, PASSWORD_BCRYPT, ['cost'=>11]);
Python: hashed = bcrypt.hashpw(secret, bcrypt.gensalt(11))

我已经使用这个 [PHP] 来验证以上内容:

<?php
$secret = 'secret12345620161116';

$php = '$2y$11$rMqK7PhWtYd3E6yqqor0K.p2XEOJqbxJSrknLLWfhqZKsbYRa1YRa'; // output from php script
$python = '$2b$11$yWzCNB4dfIIVH2FLWWEQ/efSmN/KlVmLq.MGJ54plgedE1OSQgvPu'; // putput from python script

$php_needs_rehash = password_needs_rehash($php, PASSWORD_BCRYPT);
$python_needs_rehash = password_needs_rehash($python, PASSWORD_BCRYPT);

echo 'php_needs_rehash: '.$php_needs_rehash."\n";
echo 'python_needs_rehash: '.$python_needs_rehash."\n";
echo "\n";

echo "php_info:\n";
print_r(password_get_info($php));
echo "\n";

echo "python_info:\n";
print_r(password_get_info($python));
echo "\n";

echo "php_verified: ".password_verify($secret, $php)."\n";
echo "python_verified: ".password_verify($secret, $python)."\n";
echo "\n";
?>

输出如下:

php_needs_rehash: 1
python_needs_rehash: 1

php_info:
Array
(
[algo] => 1
[algoName] => bcrypt
[options] => Array
(
[cost] => 11
)

)

python_info:
Array
(
[algo] => 0
[algoName] => unknown
[options] => Array
(
)

)

php_verified: 1
python_verified: 1

所以,现在我真的很困惑,因为服务器仍然无法识别我的 python 散列 key ,如果我不按照 richardhsu 在评论中的建议将“$2b”替换为“$2y”,那就是.

最佳答案

从技术上讲,它们都是 bcrypt 或 crypt-blowfish 的不同版本

在 php 中前缀是 $2y$10$在 python 中,前缀是 $2b$11$

这意味着成本因素分别略有不同,分别为 10 和 11在您的更新中,您已将成本因素固定为 11

前缀的另一部分表示 php 使用的是 CRYPT_BLOWFISH 哈希,而 python 使用的是基于 Blowfish 密码的 bcrypt。

由于这些差异,2 个密码不可互换。

关于PHP password_verify() 与 Python bcrypt.hashpw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40643196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com