इसलिए, यह करने के लिए सही)।पीएचपी password_verify (बनाम अजगर bcrypt.hashpw()
मैं सेटअप एक [सरल] पीएचपी REST API जहाँ मैं एक्स-एपीआई-KEY हैडर कुंजी के माध्यम से हैश पासवर्ड प्राप्त कर रहा है। यह एक और PHP स्क्रिप्ट के साथ इंटरफेसिंग करते समय बहुत अच्छा काम करता है और वाक्यांश PHP की password_hash() विधि के माध्यम से धोया जाता है। हालांकि, जब मैं पाइथन और अनुरोध पुस्तकालय के माध्यम से एपीआई के साथ इंटरफेस करने का प्रयास करता हूं, तो कुंजी खारिज कर दी जाती है। यहाँ कुछ नमूने हैं:
पीएचपी:
<?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());
?>
पायथन:
#!/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
अब, जाहिर है वे अलग हैं उस बिंदु है, लेकिन जब आप PHP password_verify() फ़ंक्शन करने के लिए अजगर उत्पादन गुजरती हैं, यह गलत देता है। PHP आउटपुट ठीक ठीक है।
वहाँ मैं यहाँ याद कर रहा हूँ लेकिन, मुझे के जीवन के लिए, मैं यह नहीं कर सकते लगता है कुछ हो गया है। मैंने बिना सफलता के विभिन्न नमक विकल्पों का उपयोग करने की कोशिश की है। मैं क्या खो रहा हूँ? क्या दोनों बस संगत नहीं हैं? यह मूर्खतापूर्ण लगता है, अगर यह सच है।
उन्नत, तो आप बुद्धिमान इंटरनेट लोगों में धन्यवाद।
अद्यतन
PHP: $hashed = password_hash($secret, PASSWORD_BCRYPT, ['cost'=>11]);
Python: hashed = bcrypt.hashpw(secret, bcrypt.gensalt(11))
[मैं परीक्षण के लिए निम्नलिखित 2 लाइनों के साथ स्क्रिप्ट को अद्यतन किया है] और मैं इस [पीएचपी] का इस्तेमाल किया है इसके बाद के संस्करण की पुष्टि करने के:
<?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
तो, अब मैं वास्तव में उलझन में के रूप में सर्वर अभी भी नहीं पहचानता, मेरी अजगर टुकड़ों में बांटा कुंजी है, अगर मैं "$ 2y" के साथ "$ 2b" की जगह नहीं है के रूप में टिप्पणी में richardhsu ने सुझाव दिया है कि कर रहा हूँ है।
बाहर curiousity की, PHP और अजगर की क्या संस्करण आप में यह परीक्षण किया? –
आप उत्पादन 'hashing से पहले PHP में और अजगर में secret' हैं, तो वे एक ही कर रहे हैं? –
पीएचपी '$ 2y $' उपयोग कर रहा है "bcrypt" एल्गोरिथ्म पहचानकर्ता के रूप में।स्पष्ट रूप से पायथन एक अलग पहचानकर्ता का उपयोग करता है। इसके अलावा, अगला मूल्य लागत है। अलग-अलग लागत का मतलब है कि हेश दोहराए जाने वाले चक्रों की एक अलग संख्या है। पीएचपी लागत को '11'' में बदलने की कोशिश करें जैसे कि पाइथन हैश (पासवर्ड_शैश के विकल्पों में से एक के रूप में सेट किया जा सकता है) और देखें कि क्या यह पाइथन हैश से एल्गोरिदम से कम है या नहीं। –