امروز میخواهیم ماژول 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 در نودجی اس برای رمزگذاری و رمزگشایی استفاده کنیم. یاد گرفتیم رمزگذاری و رمزگشایی چیست، چرا رمزگذاری مهم است، چگونه رمزگذاری متقارن یا کلیدخصوصی داشته باشیم. همچنین درمورد رمزگذاری و رمزگشای نامتقارن یا کلید عمومی درسهایی فرا گرفتیم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.