phode

2014-04-11 6 views
10

में उत्पन्न किया गया था जो nodejs में पासवर्ड हैश सत्यापित करें मेरा PHP कोड password_hash का उपयोग करके हैश उत्पन्न करता है जिसे मैं डेटाबेस में संग्रहीत करता हूं। नीचे PHP कोड है:phode

$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost)); 

मैं इस हैश के खिलाफ नोडज में पासवर्ड सत्यापित/जांचना चाहता हूं।

मैंने बहुत सारे नोड मॉड्यूल (bcrypt, phpass, node-bcrypt) देखा, लेकिन उनमें से सभी मुझे झूठा देते हैं। नीचे PHP में जेनरेट किया गया नमूना हैश है और जिसे मैं नोडज में सत्यापित करने की कोशिश कर रहा हूं।

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 

var bcrypt = require('bcrypt'); 

bcrypt.compare("secret", hash, function(err, res) { 
    console.log(res); 
}); 

(यहाँ रहस्य है असली पासवर्ड)

मेरे वर्तमान workaround (किसी को भी, जो एक समाधान की जरूरत के लिए) नोड के माध्यम से एक PHP स्क्रिप्ट कॉल करने के लिए सत्यापित करने के लिए है

var exec = require('child_process').exec; 
var cmd = 'php verify.php password encryped_pasword'; 
exec(cmd, function (error, stdout, stderr) { 
    // output is in stdout 
    console.log(stdout); 
//If stdout has 1 it satisfies else false 
}); 

यह एक हैक है और इस समस्या का अच्छा जवाब नहीं है। क्या इस तरह के कामकाज के बिना नोडज में पासवर्ड को सत्यापित करने का कोई तरीका है?

+0

आप मैं o0rebelious0o https://www.npmjs.org/package/bcrypt-nodejs – o0rebelious0o

+0

@ पर एक नज़र लिया है इसका उपयोग करने की तुलना करने की कोशिश की, यह शून्य को भी झूठ नहीं देता है और कोई त्रुटि नहीं – Sudesh

+0

सावधान रहें, $ लागत getRounds() से मेल खाना चाहिए, यह एच है ओउ bcrypt काम करता है। – erenon

उत्तर

18

$ 2a $ के साथ हैश पासवर्ड में $ 2y $ बदलें, तो bcrypt.compare आपको सही परिणाम देना चाहिए।

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 
var bcrypt = require('bcrypt'); 
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1'); 
bcrypt.compare("secret", hash, function(err, res) { 
    console.log(res); 
}); 
ES6 पर

:

import bcrypt from 'bcrypt'; 
let hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1'); 
bcrypt.compare('secret', hash, function(err, res) { 
    console.log(res); 
}); 
+2

इससे मुझे बहुत धन्यवाद मिली! हालांकि यह जानने में दिलचस्पी होगी कि अगर किसी को पता है तो इसकी आवश्यकता क्यों है? – iamjonesy

+0

यह काम किया! क्या कोई समझा सकता है कि ऐसा क्यों है? –

+1

इस पर अपडेट प्राप्त करने के लिए टिप्पणी करना (यदि कोई भी एक वर्ष से अधिक हो गया है!) – Sushruth

9

मैं इस उत्तर दिया गया है पता है, लेकिन ऐसा लगता है कि थोड़ा और विस्तार की आवश्यकता है टिप्पणियों से लगता है।

Bcrypt php password_hash() फ़ंक्शन द्वारा उत्पादित हैश इस प्रकार विभाजित हैं:

$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2

|  |  |      | 
|  |  Salt     Hashed Password 
|  | 
|  Algorithm options (cost, in this case) 
| 
Algorithm type 

यह यहां अन्य उत्तर से लगता है इतना है कि, जबकि के PHP और नोड संस्करणों Bcrypt विभिन्न एल्गोरिदम का उपयोग करते हैं, हैश आउटपुट में एकमात्र अंतर उपसर्ग है। इसलिए 0Sऔर बॉब के चाचा के लिए $2y$ को स्वैप करने के लिए @ सुदेश द्वारा वर्णित सभी की आवश्यकता है।

सूत्रों का कहना है

http://php.net/manual/en/faq.passwords.php

$2y bcrypt hashes in Node.js

Comparing BCrypt hash between PHP and NodeJS