2016-11-16 12 views
6

इसलिए, यह करने के लिए सही)।पीएचपी 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 ने सुझाव दिया है कि कर रहा हूँ है।

+0

बाहर curiousity की, PHP और अजगर की क्या संस्करण आप में यह परीक्षण किया? –

+1

आप उत्पादन 'hashing से पहले PHP में और अजगर में secret' हैं, तो वे एक ही कर रहे हैं? –

+2

पीएचपी '$ 2y $' उपयोग कर रहा है "bcrypt" एल्गोरिथ्म पहचानकर्ता के रूप में।स्पष्ट रूप से पायथन एक अलग पहचानकर्ता का उपयोग करता है। इसके अलावा, अगला मूल्य लागत है। अलग-अलग लागत का मतलब है कि हेश दोहराए जाने वाले चक्रों की एक अलग संख्या है। पीएचपी लागत को '11'' में बदलने की कोशिश करें जैसे कि पाइथन हैश (पासवर्ड_शैश के विकल्पों में से एक के रूप में सेट किया जा सकता है) और देखें कि क्या यह पाइथन हैश से एल्गोरिदम से कम है या नहीं। –

उत्तर

0

तकनीकी तौर पर वे bcrypt या तहखाने-ब्लोफिश के दोनों अलग अलग संस्करण हैं

php में उपसर्ग $ 2y अजगर में $ 10 $ है उपसर्ग $ 2b $ 11 $

इसका मतलब यह है लागत कारकों थोड़ा हो रहा है विभिन्न 10 क्रमशः बनाम 11 अपने अद्यतन में आप इंगित करता है php CRYPT_BLOWFISH हैशिंग जहां अजगर bcrypt जो ब्लोफिश सिफर पर आधारित है उपयोग कर रहा है उपयोग कर रहा है दोनों के लिए लागत कारकों तय कर दी है उपसर्ग के अन्य भाग हो 11

क्योंकि उन मतभेदों के 2 पासवर्ड परस्पर विनिमय नहीं कर रहे हैं।

+1

काम करता है। बीक्रिप्ट एल्गोरिदम ब्लाफिश साइफर पर आधारित है, दोनों प्लेटफार्म एक ही एल्गोरिदम बीसीआरपीटी का उपयोग करते हैं। एक अलग लागत कारक हैश को असंगत नहीं बनाता है, बीसीआरपीटी का डिज़ाइन विभिन्न लागत कारकों के साथ सत्यापित करने की अनुमति देता है। – martinstoeckli

संबंधित मुद्दे