30 روز با Node - روز نهم: ماژول رمزنگاری Crypto - بخش اول hash و HMAC

22 مرداد 1397
security-hashing-nodejs

مقدمه

ماژول crypto در نود جی اس قابلیتهای رمز نگاری را برای ما فراهم می‌آورد. این ماژول شامل مجموعه ای است که  توابع هش openSSL، و ابزارهای دیگری همچون HMAC ، verify ، cipher ، decipher و sign را در بر میگیرد. در بخش اول توابع  hash و HMAC را فرا می‌گیریم.

هشینگ (Hashing) چیست؟

هشینگ به فرآیند محاسباتی تولید یک مقدار با طول ثابت (هش) گفته می شود. در طی فرآیند هشینگ، یک رشته توسط توابع ریاضی به هش تبدیل می‌شود که از آن در ایجاد امنیت استفاده می‌گردد.

هر هش تولید شده طی عمل هشینگ، ویژگی‌هایی دارد همچون:

  • یکتا: در هشینگ، هر ورودی یکتا، خروجی یکتایی دارد. ورودی مشابه نیز خروجی مشابه تولید می کند و مهم نیست چندبار داده‌ی مشابه وارد کنید، ولی با کوچکترین تغییر در ورودی، خروجی کاملا تغییر خواهد کرد.
  • طول ثابت: الگوریتم‌های هشینگ همواره هش با طول ثابت تولید می‌کنند و طول ورودی در طول خروجی تأثیری نخواهد داشت.
  • برگشت ناپذیر: هش‌های تولید شده برگشت ناپذیرند. یعنی از مقدار آن نمی‌توان بعنوان ورودی استفاده کرد و رشته‌ی ورودی اصلی را به‌دست آورد.

مثال‌هایی از الگوریتم‌های مختلف هشینگ

1. الگوریتم هشینگ md5: این الگوریتم که بسیار پرکاربرد بوده، از حروف اول عبارت message digest 5 گرفته شده است. خروجی این تابع، هش‌های 128-بیتی است.
//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('md5');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node md5
hash : b95ed0bc44d12e3d6cb2ce8b15e1a41f

2. الگوریتم هشینگ Whirlpool: این الگوریتم هشینگ، ورودی با هر طولی کمتر از 2256 بیت می‌گیرد و یک هش 512-بیتی تولید می‌کند.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('whirlpool');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node whirlpool.js
hash : 1d241d8e774492fcbab619d12f4e8ba82ca4327a97c0b955f97e9a8e99621be71
a3c9db8c5c55685dfd478ba1c091711534877efe249eee719d7d6132657a1dc

3. الگوریتم هشینگ SHA1:  نام این تابع رمزنگاری از Secure Hash Algorithm 1 گرفته شده است. این تابع یک خروجی با طول 40 حرف از ارقام مبنای 16 تولید می‌کند. یک هش 160-بیتی که به خلاصه پیام شناخته می‌شود.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('sha1');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node sha1.js
hash : 387d3143b0baa6beb292eda4f81b2d33e55c6744

4. الگوریتم هشینگ SHA224: از عبارت Secure Hash Algorithm 224 گرفته شده و تحت SHA2 اجرا شده است. این تابع یک خروجی 224-بیتی تولید می‌کند.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('sha224');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node sha224.js
hash : a259323c32f8c38ccb97fcd3b407a1b51a8b7d9b16f672a8d6cbb2d6

5. الگوریتم هشینگ SHA256: این الگوریتم نیز، تحت SHA2 بوجود آمده است و برای تولید یک هش 256-بیتی (خلاصه پیام) استفاده می‌شود.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('sha256');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node sha256.js
hash : 664ad54634c10149e324ffd83bd7b90badbffffcc5738c602b3e27cb7617737f

6. الگوریتم هشینگ SHA384: این الگوریتم هم تحت SHA2 بوجود می‌آید، خلاصه پیام آن هم یک هش 384-بیتی است.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('sha384');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node sha384.js
hash : 13cd574a1025ab510115701cccbb23539d7144c45ffff3909e09413362fe1b83dad99cb143f5cb311cdeb4921ec6a33e

7. الگوریتم هشینگ SHA512: این الگوریتم هم تحت SHA2 ایجاد شده است و خروجی آن یک هش 512-بیتی است که به خلاصه پیام شناخته می‌شود.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('sha512');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی:

>node sha512.js
hash : 45be99fad36ea7962165979444acbf558bd5c5837ae7389e3aebb48d41c6cf1aa44908d4dcd12db963f005f8d30e2e2cdda6b7499d7da0d0d46f356e5d1c
e904

8. الگوریتم هشینگ ripemd-160: خلاصه RACE Integrity Primitives Evaluation Message Digest 160 است. نسخه بهبود یافته ای از ripemd که خروجی 40-رقمی مبنای 16 تولید می‌کند.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hash object 
var hash = crypto.createHash('ripemd160');

//passing the data to be hashed
data = hash.update('nodejsera', 'utf-8');

//Creating the hash in the required format
gen_hash= data.digest('hex');

//Printing the output on the console
console.log("hash : " + gen_hash);

و خروجی آن:

>node ripemd.js
hash : 6bbb8d56edec3a9e5add3d1439046982a91c7f47

اجرای هش روی یک فایل

هش کردن فایل: می‌خواهیم به کمک  streams و filesystem در نود جی اس و الگوریتم رمز نگاری SHA256، محتوای یک فایل را هش کنیم.

//Loading the required modules in node.js
var crypto = require('crypto');
var fs = require('fs');

//Algorithm to be used for HASH
var algorithm = 'sha256';
//creating hash object
var hash = crypto.createHash(algorithm);

// reading the content of the file
var filename = "data.txt";
var file_data = fs.ReadStream(filename);

//passing the data to be hashed
file_data.on('data', function(data) {
  hash.update(data)
})

//Creating the hash in the required format and writing it in file
file_data.on('end', function() {
  var gen_hash = hash.digest('hex')
  console.log('Hash generated using ' + algorithm + ' \nHashed output is :  ' + gen_hash + ' \nFile name is :  ' + filename);
  fs.writeFileSync(filename, gen_hash);
})

نتیجه اجرای هشینک روی فایل:

>node hashing_a_file.js
Hash generated using sha256
Hashed output is :  da3811154d59c4267077ddd8bb768fa9b06399c486e1fc00485116b57c9872f5
File name is :  data.txt

چه مشکلاتی با هشینگ وجود دارد؟

یکی از بزرگترین مسایلی که به هنگام استفاده از هشینگ با آن روبرو می‌شویم، جداولی هستند که به «جدول رنگین کمان» مشهورند و بصورت از پیش تعیین شده محاسبات رمزنگاری را درخود دارند و به منظور مقاصد شکستن رمز استفاده می‌شوند.

hmac چیست؟

HMAC (یا keyd-hash message authentication code) نوعی  Message Authentication Code یا MAC است که  عمل هشینگ را به کمک یک کلید رمزنگاری انجام می دهد.

درست مثل هش، در HMAC هر خروجی هش که توسط الگوریتم‌های هشینگ تولید می شود ویژگی‌های زیر را داراست:

  • یکتا: در هشینگ، هر ورودی یکتا، خروجی یکتایی دارد. ورودی مشابه نیز خروجی مشابه تولید می کند و مهم نیست چندبار داده‌ی مشابه وارد کنید، ولی با کوچکترین تغییر در ورودی، خروجی کاملا تغییر خواهد کرد.
  • طول ثابت: الگوریتم‌های هشینگ همواره هش با طول ثابت تولید می‌کنند و طول ورودی در طول خروجی تأثیری نخواهد داشت.
  • برگشت ناپذیر: هش‌های تولید شده برگشت ناپذیرند. یعنی از مقدار آن نمی‌توان بعنوان ورودی استفاده کرد و رشته‌ی ورودی اصلی را به‌دست آورد.

مثالهایی از الگوریتم‌های مختلف HMAC

SHA256 HMAC: همانند الگوریتم هشینگ SHA256 است که در بالا توضیح دادیم، با این تفاوت که به کمک یک secret key انجام می‌شود:

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hmac object 
var hmac = crypto.createHmac('sha256', 'yoursecretkeyhere');

//passing the data to be hashed
data = hmac.update('nodejsera');

//Creating the hmac in the required format
gen_hmac= data.digest('hex');

//Printing the output on the console
console.log("hmac : " + gen_hmac);

و خروجی آن :

>node hmac_sha256.js
hmac : 89365e7dc5bde2be58737b7f6086275e4284506f00c74b5822b7b7afdb93a7a9

2. SHA512 HMAC: این الگوریتم هم همانند الگوریتم هشینگ SHA256 است که در بالا توضیح داده شد، منتها به کمک یک secret key هش را تولید می‌کند.

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hmac object 
var hmac = crypto.createHmac('sha512', 'yoursecretkeyhere');

//passing the data to be hashed
data = hmac.update('nodejsera');

//Creating the hmac in the required format
gen_hmac= data.digest('hex');

//Printing the output on the console
console.log("hmac : " + gen_hmac);

و خروجی آن :

>node hmac_sha512.js
hmac : a81b6b65c3df83ae15fe185dd16dc9c846f9e3cb567292422785954130047ac10e2547f505515ea4a20de7e335e60d6489ae71bbfcf130114672e95603dc
4571

3. md5 HMAC: این الگوریتم هم مشابه الگوریتم md5 است که قبلا توضیح دادیم و تفاوت آن هم مجددا در این است که secret key می‌گیرد:

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hmac object 
var hmac = crypto.createHmac('md5', 'yoursecretkeyhere');

//passing the data to be hashed
data = hmac.update('nodejsera');

//Creating the hmac in the required format
gen_hmac= data.digest('hex');

//Printing the output on the console
console.log("hmac : " + gen_hmac);

و خروجی آن:

>node hmac_md5.js
hmac : d79672cea8d7d6a61d40bd27373b0a30

4. Whirlpool HMAC: این هم شبیه الگوریتم هم نام خودش است که در بالا توضیح دادیم و باز هم با این تفاوت که secret key هم می‌گیرد:

//Loading the crypto module in node.js
var crypto = require('crypto');

//creating hmac object 
var hmac = crypto.createHmac('whirlpool', 'yoursecretkeyhere');

//passing the data to be hashed
data = hmac.update('nodejsera');

//Creating the hmac in the required format
gen_hmac= data.digest('hex');

//Printing the output on the console
console.log("hmac : " + gen_hmac);

و خروجی:

>node hmac_whirlpool.js
hmac : c7fe72214a9830c397e7f01296f257a66d1aef002cea8ca7cf27fbd66e399d7ec52474bd2a0524f28955753ae93e9c2f55925584f6850f9f2829071ed218
d925

به طرق مشابه، می‌توانید تمام الگوریتم‌های هشینگ قبلی را ه همراه یک کلید رمزنگاری یا secret key، به‌صورت HMAC استفاده کنید.

HMAC روی فایل

هش کردن یک فایل به کمک الگوریتم md5 HMAC: می‌خواهیم به کمک الگوریتم md5 از نوع HMAC و با استفاده از streams و filesystem در نود جی اس، محتوای یک فایل را رمزنگاری کنیم:

// Including the required modules
var crypto = require('crypto');
var fs = require('fs');

//Algorithm to be used for HMAC
var algorithm = 'md5';
//Secret to be used with HMAC
var secret ='Rj2895647';
//creating hmac object
var hmac = crypto.createHmac(algorithm, secret);

// reading the content of the file
var filename = "data.txt";
var file_data = fs.ReadStream(filename);

//passing the data to be hashed
file_data.on('data', function(data) {
  hmac.update(data)
})

//Creating the hmac in the required format and writing it in file
file_data.on('end', function() {
  var gen_hmac = hmac.digest('hex')
  console.log('Hmac generated using ' + algorithm + ' \nHashed output is :  ' + gen_hmac + ' \nFile name is :  ' + filename);
  fs.writeFileSync(filename, gen_hmac);
}) 

		

و خروجی:

>node hmac_on_file.js
Hmac generated using md5
Hashed output is :  fe398f5177aa2a91a3a82d7b0f9e727a
File name is :  data.txt		

خلاصه

در این روز از دوره 30 روزه با نود جی اس، استفاده از ماژول crypto را برای عملیات hash و HMAC فرا گرفتیم و به کمک قطعه کدهایی الگوریتمهای مختلفی همچون:

  • SHA512
  • SHA256
  • SHA384
  • SHA224
  • SHA1
  • md5
  • whirlpool
  • ripemd160

را بررسی کردیم. همچنین درمورد هش کردن محتوای فایل با استفاده از ماژول crypto در نود جی اس نکاتی آموختیم.

نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Yuse
28 اسفند 1400
عالی و کاربردی

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
12 اردیبهشت 1401
سپاسگزاریم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.