HMAC-SHA1 হ্যাশ তৈরি করতে আমি কীভাবে নোড.জেএস ক্রিপ্টো ব্যবহার করব?


198

আমি একটি হ্যাশ তৈরি করতে চাই I love cupcakes (কী দিয়ে স্বাক্ষরিত abcdeg)

নোড.জেএস ক্রিপ্টো ব্যবহার করে আমি কীভাবে সেই হ্যাশ তৈরি করতে পারি?

উত্তর:


366

ক্রিপ্টোর জন্য ডকুমেন্টেশন: 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 () একটি "[অবজেক্ট স্লোবফার]" প্রদান করে এবং যদি আমি hmac.read ()। toString ('hex') ব্যবহার করে সামগ্রীগুলি পড়ার চেষ্টা করি; আমি প্রত্যাশিত মান পাই না। যদি আমি আপডেট / ডাইজেস্ট অবহেলিত পদ্ধতির ব্যবহার করি তবে এটি প্রত্যাশিত স্ট্রিংটি ফিরিয়ে দেয়। আমি আমার সার্ভারগুলিতে তৃতীয় পক্ষের পোস্ট থেকে স্বাক্ষরটি বৈধ করতে এটি ব্যবহার করছি। কোন ধারণা কি চলছে?
AngraX

সম্ভবত এইচএমএসি.আরডিট স্ট্রমে তথ্য প্রবাহিত হওয়ার আগেই ঘটছে? সম্ভবত hmac.read স্ট্রিমের সমাপ্তি ইভেন্ট দ্বারা চালিত হওয়া উচিত?
ডেভ

প্রকৃতপক্ষে আপনি যে লিঙ্কটি পোস্ট করেছেন তাতে ব্যবহারের বিষয়টি স্পষ্টভাবে উল্লেখ করা হয়েছে updateএবং নেই write। আমি বিভ্রান্ত, যা এখন সেরা অনুশীলন? আমি এমন সংস্থানগুলি খুঁজে পাচ্ছি না যা আপনি উল্লেখ করার সাথে সাথে এটি স্পষ্টভাবে বলবেন।
এসসিবুয়ারগেল.থ

5
নভেম্বর 2016 পর্যন্ত digestএবং updateআছে না অবচিত হয়েছে এবং ডকুমেন্টেশন বৈশিষ্ট্যযুক্ত করা হয়: nodejs.org/api/crypto.html#crypto_class_hmac । আপনি যদি স্ট্রিম থেকে পড়েন তবেই আমি স্ট্রিম API ব্যবহার করার পরামর্শ দিচ্ছি।
রিকার্ডো তোমাসি

22

গওয়ার্ডারের সমাধানটি কাজ করবে না কারণ hash = hmac.read();স্ট্রিমটি চূড়ান্ত হওয়ার আগেই ঘটে। এভাবে অ্যাংগ্র্যাক্সের সমস্যাগুলি। এছাড়াও 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 () {

কারণ এই উদাহরণে পাঠ্যটি একদম স্ট্রিং


আপনি ভুল, কলব্যাক যুক্ত করার দরকার নেই। এই স্ট্রিমটি সিঙ্ক্রোনাস এবং শেষ () বলা হওয়ার ঠিক পরে পঠনযোগ্য। সবচেয়ে চিত্তাকর্ষক জিনিস এটা অফিসিয়াল ডকুমেন্টেশন লেখা আছে, কিন্তু সবাই তাদের 5 (নমিত) সেন্ট দিতে হবে।
stroncium

আপনি ট্রলিং করছেন? সম্ভবত আপনি ডকুমেন্টেশন পড়া উচিত। সমাপ্ত ইভেন্টের আগে যদি আপনি স্ট্রিমটি পড়ার চেষ্টা করেন তবে এটি ব্যর্থ হবে।
ডেভ

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(...)বলা হয়েছে, " শেষ হয়েছে " অর্থ যে প্রবাহ করেছে তার ফিনিস ঘটনা উত্থাপিত , যার কারণে কমান্ড একটি কলব্যাক গ্রহণ করে। শেষ () পদ্ধতিটি বলা হওয়ার পরে, স্ট্রিমটির অন্তর্নিহিত সিস্টেমে ডেটা ফ্লাশ করার জন্য সময় প্রয়োজন। আপনি যদি সমাপ্তি ইভেন্টটি উত্থাপিত হওয়ার আগে পড়ুন () কে কল করেন তবে এটি ব্যর্থ হবে। এগিয়ে যান এবং জেএসবিনে গওয়ার্ডারের কোডটি পেস্ট করুন এবং নিজের জন্য দেখুন। এটি কীভাবে কাজ করে তা বোঝার জন্য আপনার স্ট্রিমস ডকুমেন্টেশনটি পড়া উচিত ।
ডেভ

আমি এটি কিছু সময়ের জন্য উত্পাদন কোডে ব্যবহার করেছি এবং এটি নরকের মতো স্থিতিশীল। আমি সত্যই জেএসবিনটি জানি না, তবে আমি নোটজেসে সমর্থিত কোডটি কেবল অনুলিপি-পেস্ট দিয়ে চেষ্টা করেছি এবং এটি খুব কার্যকর হয়। ডকুমেন্টেশনের অতিরিক্ত অর্থগুলি কল্পনা করা উচিত নয়। "শেষ" অর্থ ডকুমেন্টেশনের সর্বদা "সমাপ্ত" অর্থ means তবুও, আপনি মনে করছেন যে এই স্ট্রিমটির 2 টি পক্ষ রয়েছে mis এবং ডকুমেন্টেশনে এটি স্পষ্টভাবে বলা হয়েছে যে লিখনযোগ্য দিকটি শেষ হওয়ার read()পরে ব্যক্তি ব্যবহার করতে পারে , এবং সমাপ্তির ইভেন্টের কিছুই নেই।
স্ট্রোকসিয়াম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.