یک بررسی کلی
امروز میخواهیم ماژول crypto را در نود جی اس بیشتر به کار بگیریم. رمزگذاری و رمزگشایی به دو روش همزمان و ناهمزمان.
پیش نیازها
رمزگذاری و رمزگشایی
داده هایی که به راحتی خوانده و فهمیده میشوند، ما به اسم متن ساده میشناسیم. مشکلی در متون ساده وجود دارد این است که هرکسی می تواند آن را بخواند. ولی گاهی اوقات دوست نداریم “همه” به آنهادسترسی داشته باشد، به عبارت دیگر، محرمانه بودن دادهها باید حفظ شود.
رمزگذاری: رمزگذاری باعث میشود دادهها از امنیت بالایی بهدست آورند تا فقط افراد مجاز، به آن دسترسی داشته باشند. در رمزگذاری، متن ساده به کمک “کلید” و “الگوریتم” به متن نامفهوم تغییر شکل پیدا میکند، طوری که متن قابل خواندن ولی غیرقابل فهم باشد، تا از دادهها محافظت شود. این همان امنیت دادههاست. متنی که به رمز درآمده باشد، cipher text یا متن رمز میگوییم.
رمزگشایی: رمزگشایی فرآیند تفسیر و تغییر دادههاست، به نحوی که برای انسان و یا ماشین خواندنی و فهمیدنی باشد. در طی این فرآیند، به کمک کلید و الگوریتم، متن رمز به عنوان ورودی داده میشود و متن ساده از خروجی تحویل گرفته میشود.
انواع روشهای رمزگذاری
درحالت کلی دو روش برای رمزگذاری و رمزگشایی داریم که با جزئیات شرح داده میشوند:
۱) رمزگذاری متقارن (Symmetric) یا رمز گذاری کلید خصوصی (private key)
در حالت متقارن، کلیدهای یکسانی برای رمزگذاری و رمزگشایی بهکار میرود و درمقایسه با حالت نامتقارن، سریعتر است.
سناریو:
- آقای الف میخواهد یک پیام محرمانه به آقای ب بفرستد.
- آقای ج بین آن دو نشسته و تمام پیامهایی که آقای الف ارسال میکند، زیرنظر دارد.
- بنابراین، آقای الف به کمک کلید خصوصی خود، پیامش را رمزگذاری میکند و سپس ارسال میکند. اکنون دوحالت ممکن است پیش بیاید:
- پیام صحیح و سالم به آقای ب میرسد و او نیز به کمک کلید خصوصی، مشابه آنچه آقای الف برای رمزگذاری استفاده کرده است، رمزگشایی میکند.
- آقای ج پیام را میگیرد ولی چون کلیدی را که متن با آن رمزگذاری شده است ندارد، قادر به رمزگشایی پیام نیست، بنابراین امنیت پیام حفظ خواهد شد.
۲) رمزگذاری نامتقارن (Asymmetric) یا رمزگذاری کلید عمومی (public key)
درحالت نامتقارن، به یک جفت کلید برای رمزگذاری و رمزگشایی نیاز داریم. به زبان ساده، کلیدی که برای رمزگذاری استفاده میشود، با کلیدی که برای رمزگشایی به کار میرود، تفاوت دارد . این جفت کلید توسط openSSL یا هر مولد دیگر کلیدها تولید میشود. یکی از این کلیدها کلید عمومی است و دیگری کلید خصوصی است. کلید عمومی برای همه شناخته شده است ولی کلید خصوصی فقط دراختیار کسی است که پیام برای اوست. ببینید روش نامتقارن چه مسائلی را حل میکند:
سناریو 1:
- آقای الف میخواهد یک پیام محرمانه به آقای ب بفرستد.
- آقای ج در بین آنها نشسته و تمام پیامهایی که آقای الف ارسال میکند زیرنظر دارد.
- بنابراین آقای الف، پیام را به کمک کلید خصوصی خودش رمزگذاری میکند. اکنون دو حالت ممکن است پیش بیاد:
- پیام صحیح و سالم به آقای ب میرسد و با کمک کلید عمومی آقای الف پیام را رمزگشایی میکند.
- آقای ج پیام را میگیرد و با کلید عمومی آقای الف رمزگشایی میکند. ولی اکنون آقای ج نمیتواند پیام را مجددا رمزگذاری نماید چراکه آقای ج کلید خصوصی آقای الف را ندارد و وقتی که پیام به مقصد واقعی خودش، یعنی آقای ب، میرسد، آقای ب متوجه خواهد شد که محرمانگی پیام نقض شده و بنابراین اطلاعات درون پیام قابل اعتماد نیست.
- بنابراین یا پیام به گیرندهی واقعیاش میرسد و محرمانگیاش نیز حفظ میشود، یا اینکه متوجه خواهیم شد که محرمانگی پیام نقض شده است.
سناریو 2:
- اکنون آقای ب میخواهد به آقای الف اطلاع دهد که محرمانگی پیام نقض شده ولی نمیخواهد که آقای ج از این ماجرا بویی ببرد.
- بنابراین آقای ب پیام را با کلید عمومی آقای الف، رمزگذاری میکند و این پیام فقط با کلیدخصوصی آقای الف رمزگشایی میشود.
- اگر آقای ج به هرطریق پاسخ آقای ب به آقای الف را گرفت، بازهم نمیتواند آن را رمزگشایی کند، چرا که کلیدخصوصی فقط دست آقای الف است.
رمزگذاری و رمزگشای متقارن
متدهای توکار موردنظر، createCipher برای رمزگذاری و createDechipher برای رمزگشایی به کار میرود. برای هر دو عمل رمزگذاری و رمزگشایی کلید مشابهی بهکار میرود:
var crypto = require('crypto'),algorithm = 'aes-256-ctr',password = 'RJ23edrf'; //Here "aes-256-cbc" is the advance encryption standard we are using for encryption. //Text is the Confidential data which we need to encrypt using 'password'(Key). function encrypt(text){ var cipher = crypto.createCipher(algorithm,password) var crypted = cipher.update(text,'utf8','hex') crypted += cipher.final('hex'); return crypted; } //Here "aes-256-cbc" is the advance encyption standard we used for encrytion. //Text is the Cipher which we need to decrypt using 'password'(Key). function decrypt(text){ var decipher = crypto.createDecipher(algorithm,password) var dec = decipher.update(text,'hex','utf8') dec += decipher.final('utf8'); return dec; } //Actual content var text = "Nodejsera for all web development languages"; //Calling the encrypt function and printing the encrypted content var e = encrypt(text); console.log(e); //calling the decrypt function and printing the decrypted content var d = decrypt(e); console.log(d);
اجرا: به کمک دستور زیر قطعه برنامه بالا را اجرا می کنیم.
>node enc-pub-dec-priv.js
رمزگذاری و رمزگشایی نامتقارن
در این روش که به نام رمزگذاری و رمزگشایی کلید عمومی هم شناخته میشود، از کلیدی بجز آنچه در رمزگذاری به کار بردیم، برای رمزگشایی استفاده میکنیم. دو امکان وجود دارد که در کدهای زیر توضیح داده شده است:
۱) کلید عمومی برای رمزگذاری و کلید خصوصی برای رمزگشایی:
/** Example of Asymmetric encryption Encrypting using public key and decrypting using private key File Name : enc-pub-dec-priv.js Author : @nodejsera **/ //Including the required modules var crypto = require('crypto'); var fs = require('fs'); //Reading the Public Key pubK = privK = fs.readFileSync('pub.key').toString(); //Passing the text to be encrypted using private key var buf = Buffer.from('This is secret code', 'utf8'); //Encrypting the text secretData = crypto.publicEncrypt(pubK, buf); //printing the encrypted text console.log(secretData.toString('utf8')); //reading the Private key privK = { key: fs.readFileSync('priv.key').toString(), passphrase: 'nodejsera' } //decrypting the text using public key origData = crypto.privateDecrypt(privK, secretData) //Printing the original content console.log(origData.toString());
اجرا: به کمک دستور زیر کد فوق را اجرا کنید:
>node enc-pub-dec-priv.js
۲) کلید خصوصی برای رمزگذاری و کلید عمومی برای رمزگشایی
/** Example of Asymmetric encryption Encrypting using private key and decrypting using public key File Name : enc-priv-dec-pub.js Author : @nodejsera **/ //Including the required modules var crypto = require('crypto'); var fs = require('fs'); //Reading the Private Key privK = { key: fs.readFileSync('priv.key').toString(), passphrase: 'nodejsera' } //Passing the text to be encrypted using private key var buf = Buffer.from('rishabh', 'utf8'); //Encrypting the text secretData = crypto.privateEncrypt(privK, buf); //printing the encrypted text console.log(secretData.toString('utf8')); //reading the Public key pubK = fs.readFileSync('pub.key').toString(); //decrypting the text using public key origData = crypto.publicDecrypt(pubK, secretData) //Printing the original content console.log(origData.toString());
اجرا: از کد زیر استفاده و برنامه را اجرا کنید:
>node enc-priv-dec-pub.js
خلاصه
در درس امروز از سری آموزشهای 30 روز با نودجی اس، یاد گرفتیم چگونه از ماژول crypto در نودجی اس برای رمزگذاری و رمزگشایی استفاده کنیم. یاد گرفتیم رمزگذاری و رمزگشایی چیست، چرا رمزگذاری مهم است، چگونه رمزگذاری متقارن یا کلیدخصوصی داشته باشیم. همچنین درمورد رمزگذاری و رمزگشای نامتقارن یا کلید عمومی درسهایی فرا گرفتیم.