所以,对它。PHP password_verify()vs Python bcrypt.hashpw()
我已经设置了一个[简单] PHP REST API,其中通过X-API-KEY标头键接收哈希密码。当与另一个PHP脚本接口并且通过PHP的password_hash()方法对短语进行哈希处理时,这非常有效。但是,当我尝试通过Python和请求库与API进行交互时,密钥被拒绝。下面是一些样本:
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输出验证很好。
我必须在这里失去一些东西,但对于我而言,我无法找到它。我尝试过使用不同的盐选项,但没有成功。我错过了什么?这两者不兼容?这看起来很愚蠢,如果这是真的。
谢谢你先进的,你智能的互联网人。
UPDATE
PHP: $hashed = password_hash($secret, PASSWORD_BCRYPT, ['cost'=>11]);
Python: hashed = bcrypt.hashpw(secret, bcrypt.gensalt(11))
[I具有与以下两行的测试更新脚本]我已经使用这个[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散列键,如果我没有用richardhsu在评论中建议的“$ 2y”替换“$ 2b”是。
出于好奇,您测试了哪些版本的PHP和Python? –
如果你在散列之前用PHP和Python输出'secret',它们是一样的吗? –
PHP使用'$ 2y $'作为“bcrypt”算法标识符。显然python使用不同的标识符。另外,下一个值是成本。不同的成本意味着哈希将重复的循环次数不同。尝试像python哈希(可以设置为password_hash的选项之一)将php成本更改为'11',并查看它是否与python哈希值减去算法一致。 –