2013-01-09 50 views
5

मैं हैडिंग पासवर्ड के लिए node.js में pbkdf2 का उपयोग कर रहा हूं।crypto.pbkdf2 असीमित है, मैं इसे सिंक्रोनस के रूप में कैसे मानूं?

मेरी समस्या यह है कि मैं प्रमाणीकरण के लिए अनुरोध का जवाब दे रहा हूं और यदि प्रमाणित प्रमाण-पत्र सही हैं तो मैं प्रमाणीकरण के बीच में हूं। मुझे लगता है कि pbkdf2 async है क्योंकि यह संभावित रूप से बड़ी मात्रा में ले सकता है (पुनरावृत्तियों के आकार पर निर्भर)। हालांकि कॉलबैक का उपयोग करने के लिए शेष प्रमाणीकरण तर्क को एक अलग विधि में ले जाना एक बदसूरत लगता है।

क्या टाइमर का उपयोग करने या लगातार सभी प्रमाणीकरण तर्क को एक अलग फ़ंक्शन में फेंकने से बेहतर तरीका है? मुझे पता है कि ज्यादातर लोग कहेंगे कि मुझे कॉलबैक का उपयोग करना चाहिए, लेकिन मेरे उपयोग के मामले में यह समझ में नहीं आता है। मैं प्रमाणीकरण जारी नहीं रख सकता जब तक कि मैंने पास पासवर्ड पर pbkdf2 लागू नहीं किया है।

उत्तर

4

मैं आपकी समस्या के लिए दो समाधान देख सकता हूं।

सबसे पहले एसिंक्रोनस कॉल को लपेटने के लिए कुछ लाइब्रेरी का उपयोग करना है। आप node-sync या node-promise आज़मा सकते हैं। node-sync आप जो चाहते हैं उसके लिए बेहतर अनुकूल है।

दूसरा समाधान क्रिप्टो के बजाय bcrypt उपयोग करने के लिए है:

var bcrypt = require('bcrypt'); 
var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync(password, salt); 

bcrypt नोड में पासवर्ड हैशिंग के लिए एक विशेष पुस्तकालय है। यह क्रिस्टो मॉड्यूल में और अधिक सुरक्षित है और hashSync और compareSync जैसे कुछ उपयोगी तरीके प्रदान करता है।

+0

क्या मैं यह मानने में सही हूं कि bcrypt blowfish पर आधारित है (node.bcrypt.js प्रोजेक्ट से विकिपीडिया लिंक के अनुसार)? मैं पीबीकेडीएफ 2 का उपयोग 128 बिट्स से बड़े नमक के साथ और 10000 पुनरावृत्तियों के साथ कर रहा था, जो कि एनआईएसटी अनुमोदित है, जबकि ब्लाफिश बीक्रिप्ट नहीं है (विकिपीडिया कलात्मक देखें)। मैं आपकी टिप्पणी पर उत्सुक हूं कि bcrypt अधिक सुरक्षित है। मेरे उद्देश्यों के लिए यह सबसे अधिक संभावना है। यह महत्वपूर्ण नहीं है, लेकिन मैं सबसे सुरक्षित दृष्टिकोण का उपयोग करना चाहता हूं। – Metalskin

+0

@ मेटलस्किन, मैंने थोड़ा और जांच की। छोटे पथदर्शी पर 'Bcrypt' मजबूत है, लेकिन यह 55 वर्णों के बाद पथदर्शी पर' pbkdf2' को खोना शुरू कर देता है। लेकिन वे दोनों पर्याप्त सुरक्षित हैं, इसलिए कोई वास्तविक अंतर नहीं है। अधिक जानकारी के लिए [यह उत्तर] देखें (http://stackoverflow.com/questions/4433216/password-encryption-pbkdf2-using-sha512-x-1000-vs-bcrypt)। –

+0

धन्यवाद कि लिंक वास्तव में सहायक था, मुझे नहीं लगता कि मैं 55 से अधिक वर्णों पर जाउंगा इसलिए यह bcrypt का उपयोग करना ठीक होना चाहिए। ऐसा लगता है कि स्क्रिप बेहतर होगा लेकिन मुझे node.js. के लिए कोई सक्रिय प्रोजेक्ट नहीं मिल सका। – Metalskin

5

Node.js crypto docs के अनुसार, पीबीकेडीएफ 2 फ़ंक्शन के एक असीमित और तुल्यकालिक संस्करण दोनों हैं।

crypto.pbkdf2 (पासवर्ड, नमक, पुनरावृत्तियों, keylen, कॉलबैक)

अतुल्यकालिक PBKDF2 कूट-यादृच्छिक समारोह HMAC-SHA1 प्राप्त करने के लिए लागू होता है दिया पासवर्ड, नमक और पुनरावृत्तियों से दिया लंबाई के एक प्रमुख । कॉलबैक दो तर्क (err, derivedKey) प्राप्त करता है।

crypto.pbkdf2Sync (पासवर्ड, नमक, पुनरावृत्तियों, keylen)

तुल्यकालिक PBKDF2 कार्य करते हैं। रिटर्न व्युत्पन्न या त्रुटि फेंकता है।

+1

धन्यवाद केविन, मुझे यकीन नहीं है कि मैंने पिछले साल क्यों नहीं देखा। यदि यह काम करता है तो यह एक बेहतर जवाब है क्योंकि मैं वास्तव में यही चाहता था। जब मुझे मौका मिलता है तो मैं कोड और परीक्षण पर फिर से जाउंगा। – Metalskin