मैं HMAC-SHA1 हैश बनाने के लिए Node.js Crypto का उपयोग कैसे करूं?


199

मैं एक हैश I love cupcakes(कुंजी के साथ हस्ताक्षरित abcdeg) बनाना चाहता हूं

Node.js Crypto का उपयोग करके मैं वह हैश कैसे बना सकता हूं?

जवाबों:


368

क्रिप्टो के लिए प्रलेखन: http://nodejs.org/api/crypto.html

const crypto = require('crypto')

const text = 'I love cupcakes'
const key = 'abcdeg'

crypto.createHmac('sha1', key)
  .update(text)
  .digest('hex')

'हेक्स' की हमेशा जरूरत नहीं होती है, उदाहरण के लिए, माणिक के बराबर एचएएमएसी पाचन करने के लिए।
htafoya

6
और एक हैश को सत्यापित करने के लिए, आपको उपयोग करना चाहिए crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b)): stackoverflow.com/questions/31095905/…
baptx

1
सर्कल पूरा हो गया है: nodejs.org/api/crypto.html#crypto_crypto
रिकार्डो

98

कुछ साल पहले यह कहा गया था कि update()और digest()विरासत के तरीके थे और नए स्ट्रीमिंग एपीआई दृष्टिकोण को पेश किया गया था। अब डॉक्स का कहना है कि या तो विधि का उपयोग किया जा सकता है। उदाहरण के लिए:

var crypto    = require('crypto');
var text      = 'I love cupcakes';
var secret    = 'abcdeg'; //make this your secret!!
var algorithm = 'sha1';   //consider using sha256
var hash, hmac;

// Method 1 - Writing to a stream
hmac = crypto.createHmac(algorithm, secret);    
hmac.write(text); // write in to the stream
hmac.end();       // can't read from the stream until you call end()
hash = hmac.read().toString('hex');    // read out hmac digest
console.log("Method 1: ", hash);

// Method 2 - Using update and digest:
hmac = crypto.createHmac(algorithm, secret);
hmac.update(text);
hash = hmac.digest('hex');
console.log("Method 2: ", hash);

नोड v6.2.2 और v7.7.2 पर परीक्षण किया गया

Https://nodejs.org/api/crypto.html#crypto_class_hmac देखें । स्ट्रीमिंग दृष्टिकोण का उपयोग करने के लिए अधिक उदाहरण देता है।


एक-लाइनर नहीं, और कॉल डेज़ी-जंजीर नहीं हो सकता ... लेकिन मैं इस दृष्टिकोण का उपयोग करूंगा।
tfmontague

2
मैं, मेरे जीवन के लिए, यह काम नहीं कर सकता। hmac.read () एक "[ऑब्जेक्ट SlowBuffer]" लौटाता है और अगर मैं hmac.read () का उपयोग करके सामग्री को पढ़ने की कोशिश करता हूं; मुझे अपेक्षित मूल्य नहीं मिला। अगर मैं अपडेट / डाइजेस्ट अपचेटेड अप्रोच का उपयोग करता हूं, तो यह अपेक्षित स्ट्रिंग लौटाता है। मैं अपने सर्वर पर किसी तृतीय पक्ष POST से एक हस्ताक्षर को मान्य करने के लिए इसका उपयोग कर रहा हूं। कुछ पता है कि क्या चल रहा है?
अंग्रेक्स

शायद hmac.read डेटा को स्ट्रीम में फ्लश करने से पहले हो रहा है? शायद hmac.read को स्ट्रीम के फिनिश इवेंट द्वारा संचालित किया जाना चाहिए?
डेव

वास्तव में आपके द्वारा पोस्ट किए गए लिंक में इसके उपयोग का उल्लेख है updateया नहीं write। मैं भ्रमित हूँ, जो अब सबसे अच्छा अभ्यास है? मुझे ऐसे संसाधन नहीं मिलेंगे जो यह बताएं कि जितना स्पष्ट रूप से आप इसका उल्लेख करते हैं।
SCBuergel.eth

5
नवम्बर 2016 के रूप में, digestऔर updateहै नहीं जिसे बंद कर दिया और दस्तावेज में विशेष रुप से प्रदर्शित कर रहे हैं: nodejs.org/api/crypto.html#crypto_class_hmac । यदि आप किसी स्ट्रीम से पढ़ रहे हैं तो मैं केवल स्ट्रीम एपीआई का उपयोग करने की सलाह देता हूं।
रिकार्डो तोमासी

22

Gwerder का समाधान अभ्यस्त कार्य होगा क्योंकि hash = hmac.read();धारा को अंतिम रूप देने से पहले होता है। इस प्रकार AngraX के मुद्दे। hmac.writeइस उदाहरण में बयान भी आवश्यक है।

इसके बजाय यह करें:

var crypto    = require('crypto');
var hmac;
var algorithm = 'sha1';
var key       = 'abcdeg';
var text      = 'I love cupcakes';
var hash;

hmac = crypto.createHmac(algorithm, key);

// readout format:
hmac.setEncoding('hex');
//or also commonly: hmac.setEncoding('base64');

// callback is attached as listener to stream's finish event:
hmac.end(text, function () {
    hash = hmac.read();
    //...do something with the hash...
});

अधिक औपचारिक रूप से, यदि आप चाहें, तो लाइन

hmac.end(text, function () {

लिखा जा सकता है

hmac.end(text, 'utf8', function () {

क्योंकि इस उदाहरण में टेक्स्ट एक utf स्ट्रिंग है


आप गलत हैं, कॉलबैक जोड़ने की कोई आवश्यकता नहीं है। यह धारा समकालिक है और अंत के बाद पढ़ने योग्य है () कहा जाता है। सबसे आकर्षक बात यह है कि यह आधिकारिक दस्तावेज में लिखा गया है, लेकिन सभी को अपना 5 (मुड़ा हुआ) सेंट
लगाना होगा

क्या आप ट्रोलिंग कर रहे हैं? शायद आपको प्रलेखन पढ़ना चाहिए। यदि आप फिनिश इवेंट से पहले स्ट्रीम को पढ़ने का प्रयास करते हैं, तो यह विफल हो जाएगा।
डेव

1
[ Nodejs.org/api/crypto.html#crypto_class_hmac] से It is a stream that is both readable and writable. The written data is used to compute the hmac. Once the writable side of the stream is ended, use the read() method to get the computed digest. आप इसे पढ़ते हैं जब लिखने योग्य पक्ष समाप्त हो जाता है , तो आपको पढ़ने योग्य पक्ष पठनीय हो जाता है (हालांकि यह निश्चित रूप से होता है) तब तक प्रतीक्षा करने की आवश्यकता नहीं है । कृपया अपने प्रलेखन पढ़ें।
स्ट्रॉन्शियम कैल्शियम

createHmac एक स्ट्रीम बनाता है । आपके द्वारा ऊपर बताई गई डॉक्यूमेंटेशन लाइन में " समाप्त " का मतलब यह नहीं hmac.end(...)कहा गया है, " समाप्त " का अर्थ है कि स्ट्रीम ने अपना फिनिश इवेंट उठाया है , यही वजह है कि कमांड एक कॉलबैक स्वीकार करता है। अंत () विधि कहा जाता है के बाद, स्ट्रीम को अंतर्निहित सिस्टम में डेटा को फ्लश करने के लिए समय की आवश्यकता होती है। यदि आप फिनिश इवेंट को पूरा करने से पहले रीड () कहते हैं, तो यह विफल हो जाएगा। आगे बढ़ो और जेस्बिन में गॉडर के कोड को पेस्ट करें और अपने लिए देखें। आपको यह समझने के लिए कि यह कैसे काम करता है , धाराओं के दस्तावेज को पढ़ना चाहिए ।
डेव

मैंने इसे कुछ समय के लिए उत्पादन कोड में उपयोग किया है और यह नरक के रूप में स्थिर है। मैं ईमानदारी से नहीं जानता कि जेएसबीएन क्या है, लेकिन मैंने नोडज में समर्थित कोड को केवल कॉपी-पेस्ट के साथ आज़माया है और यह काम भी करता है। आपको प्रलेखन के लिए अतिरिक्त अर्थों की कल्पना नहीं करनी चाहिए। प्रलेखन में हर जगह "समाप्त" का अर्थ हमेशा "समाप्त" होता है। फिर भी, आप गलत समझ रहे हैं कि धारा के 2 पहलू हैं। और दस्तावेज़ीकरण में यह स्पष्ट रूप से कहा गया है कि व्यक्ति उपयोग कर सकता है read()जब लेखन पक्ष समाप्त हो गया है, और फिनिश इवेंट के बारे में कुछ भी नहीं है।
स्ट्रॉन्शियम कैल्शियम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.