از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
رمزگذاری و رمزگشایی رشته های Base64 در رمزگذاری Node.jsBase64 راهی برای تبدیل داده ها (معمولاً باینری) به مجموعه کاراکترهای ASCII است. در اینجا ذکر این نکته ضروری است که Base64 یک تکنیک رمزگذاری یا فشرده سازی نیست، اگرچه گاهی اوقات ممکن است به دلیل اینکه داده ها را مبهم می کند، به عنوان رمزگذاری اشتباه گرفته شود. در واقع، …
سرفصلهای مطلب
Base64 Encoding چیست؟
رمزگذاری Base64 راهی برای تبدیل داده ها (معمولا باینری) به مجموعه کاراکترهای ASCII است. در اینجا ذکر این نکته ضروری است که Base64 یک تکنیک رمزگذاری یا فشرده سازی نیست، اگرچه گاهی اوقات ممکن است به دلیل اینکه داده ها را مبهم می کند، به عنوان رمزگذاری اشتباه گرفته شود. در واقع، اندازه یک قطعه اطلاعات کدگذاری شده Base64 1.3333 برابر اندازه واقعی داده های اصلی شما است.
Base64 پرکاربردترین تکنیک کدگذاری پایه است که Base16 و Base32 دو طرح رمزگذاری رایج دیگر هستند.
Base64 چگونه کار می کند؟
تبدیل داده ها به base64 چند مرحله ای است process. در اینجا روش عملکرد آن برای رشته های متن است:
- نسخه باینری 8 بیتی متن ورودی را محاسبه کنید
- نسخه 8 بیتی داده ها را دوباره به چند تکه 6 بیتی گروه بندی کنید
- نسخه اعشاری هر یک از تکه های باینری 6 بیتی را پیدا کنید
- نماد Base64 را برای هر یک از مقادیر اعشاری از طریق جدول جستجوی Base64 پیدا کنید
برای درک بهتر این مفهوم، بیایید به یک مثال نگاه کنیم.
فرض کنید ما یک رشته “برو برنده” داریم و می خواهیم آن را به یک رشته Base64 تبدیل کنیم. اولین مرحله تبدیل این رشته به باینری است. نسخه باینری Go win به شرح زیر است:
01000111 01101111 00100000 01110111 01101001 01101110
در اینجا می توانید ببینید که هر کاراکتر با 8 بیت نمایش داده می شود. با این حال همانطور که قبلاً گفتیم، Base64 داده ها را به شکل باینری 8 بیتی به تکه های 6 بیتی تبدیل می کند. این به این دلیل است که قالب Base64 فقط 64 کاراکتر دارد: 26 حرف الفبای بزرگ، 26 حرف کوچک الفبا، 10 کاراکتر عددی و نمادهای “+” و “/” برای خط جدید.
Base64 از همه کاراکترهای ویژه ASCII استفاده نمی کند، بلکه فقط از این تعداد کمی استفاده می کند. توجه داشته باشید که برخی از پیاده سازی های Base64 از کاراکترهای ویژه متفاوتی نسبت به “+” و “/” استفاده می کنند.
برای بازگشت به مثال، اجازه دهید داده های 8 بیتی خود را به تکه های 6 بیتی تقسیم کنیم.
010001 110110 111100 100000 011101 110110 100101 101110
شما همیشه نمی توانید داده ها را به مجموعه های کامل 6 بیتی تقسیم کنید، در این صورت باید با padding مقابله کنید.
اکنون برای هر تکه بالا، باید مقدار اعشاری آن را پیدا کنیم. این مقادیر اعشاری در زیر آورده شده است:
Binary Decimal
010001 17
110110 54
111100 60
100000 32
011101 29
110110 54
100101 37
101110 46
در نهایت باید به مقدار Base64 برای هر یک از اعشاری که فقط از داده های باینری محاسبه کردیم نگاه کنیم. جدول کدگذاری Base64 به شکل زیر است:
در اینجا می توانید ببینید که اعشار 17 مربوط به “R” و اعشار 54 مربوط به “2” است، و به همین ترتیب روی. با استفاده از این جدول رمزگذاری میتوانیم ببینیم که رشته «Go win» با استفاده از Base64 به صورت «R28gd2lu» کدگذاری شده است. می توانید از هر مبدل متن آنلاین به Base64 برای تأیید این نتیجه استفاده کنید.
چرا از Base64 Encoding استفاده کنیم؟
ارسال اطلاعات در فرمت باینری گاهی اوقات می تواند خطرناک باشد زیرا همه برنامه ها یا سیستم های شبکه نمی توانند باینری خام را مدیریت کنند. از سوی دیگر، مجموعه کاراکترهای ASCII به طور گسترده ای شناخته شده و برای اکثر سیستم ها بسیار ساده است.
به عنوان مثال سرورهای ایمیل انتظار داده های متنی را دارند، بنابراین معمولاً از ASCII استفاده می شود. بنابراین، اگر می خواهید تصاویر یا هر فایل باینری دیگری را به یک سرور ایمیل ارسال کنید، ابتدا باید آن را در قالب متنی، ترجیحا ASCII رمزگذاری کنید. اینجاست که رمزگذاری Base64 در تبدیل داده های باینری به فرمت های صحیح بسیار مفید است.
رمزگذاری رشته های Base64 با Node.js
ساده ترین راه برای رمزگذاری رشته های Base64 در Node.js از طریق بافر هدف – شی. در Node.js، Buffer
یک شی سراسری است به این معنی که شما نیازی به استفاده از a ندارید require
بیانیه به منظور استفاده از Buffer
در برنامه های خود قرار دهید.
در داخل Buffer
یک آرایه غیرقابل تغییر از اعداد صحیح است که همچنین قادر به انجام بسیاری از رمزگذاری/رمزگشایی های مختلف است. اینها شامل کدهای UTF-8، UCS2، Base64 یا حتی Hex هستند. همانطور که کدی را می نویسید که با داده ها سروکار دارد و آنها را دستکاری می کند، احتمالاً از آن استفاده خواهید کرد Buffer
در یک نقطه اعتراض کنید
به مثال زیر دقت کنید. در اینجا ما یک رشته متنی را با استفاده از Base64 کد می کنیم Buffer
هدف – شی. کد زیر را در یک فایل ذخیره کنید encode-text.js
.
'use strict';
let data = 'rasanegar.com';
let buff = new Buffer(data);
let base64data = buff.toString('base64');
console.log('"' + data + '" converted to Base64 is "' + base64data + '"');
در اسکریپت بالا یک شی بافر جدید ایجاد می کنیم و رشته خود را که می خواهیم به Base64 تبدیل کنیم، ارسال می کنیم. سپس ما تماس می گیریم toString
روش روی آبجکت بافری که به تازگی ایجاد کرده ایم و آن را به عنوان پارامتر “base64” ارسال می کنیم. این toString
متد با پارامتر “base64” داده ها را در قالب رشته Base64 برمی گرداند. کد بالا را اجرا کنید، خروجی زیر را خواهید دید.
$ node encode-text.js
"rasanegar.com" converted to Base64 is "c3RhY2thYnVzZS5jb20="
در خروجی می توانیم همتای Base64 را برای رشته ای که به Base64 تبدیل کرده ایم ببینیم.
رمزگشایی رشته های Base64 با Node.js
رمزگشایی یک رشته Base64 کاملاً شبیه رمزگذاری آن است. شما باید یک شی بافر جدید ایجاد کنید و دو پارامتر را به سازنده آن ارسال کنید. پارامتر اول داده در Base64 و پارامتر دوم “base64” است. سپس شما به سادگی باید تماس بگیرید toString
روی شی بافر اما این بار پارامتر ارسال شده به متد “ascii” خواهد بود زیرا این نوع داده ای است که می خواهید داده Base64 شما به آن تبدیل شود. برای مرجع به قطعه کد زیر نگاه کنید.
'use strict';
let data = 'c3RhY2thYnVzZS5jb20=';
let buff = new Buffer(data, 'base64');
let text = buff.toString('ascii');
console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"');
داده ها را به ascii.js
فایل و ذخیره کنید. در اینجا ما از “Tm8gdG8gUmFjaXNt” به عنوان داده ورودی Base64 استفاده کرده ایم. هنگامی که این داده ها رمزگشایی می شوند باید “نه به نژادپرستی” را نشان دهند. این به این دلیل است که از آخرین مثال می دانیم که “نه به نژادپرستی” برابر است با “Tm8gdG8gUmFjaXNt”. کد بالا را با Node.js اجرا کنید. خروجی زیر را نمایش می دهد.
رمزگذاری داده های باینری به رشته های Base64
همانطور که در ابتدای مقاله ذکر شد، هدف اصلی از رمزگذاری Base64 تبدیل داده های باینری به فرمت متنی است. اجازه دهید مثالی را ببینیم که در آن یک تصویر (داده های باینری) را به یک رشته Base64 تبدیل می کنیم. به مثال زیر دقت کنید.
'use strict';
const fs = require('fs');
let buff = fs.readFileSync('stack-abuse-logo.png');
let base64data = buff.toString('base64');
console.log('Image converted to base 64 is:\n\n' + base64data);
در کد بالا یک تصویر را از طریق در بافر بارگذاری می کنیم readFileSync()
روش از fs
مدول. بقیه ی process شبیه ایجاد یک رشته Base64 از یک رشته ASCII معمولی است.
با اجرای کد بالا خروجی زیر را مشاهده خواهید کرد.
$ node encode-image.js
Image converted to Base64 is:
iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVUTUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5DaWb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTFiSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHhVdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5GK4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZNtFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxSbAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII=
اگرچه تصویر واقعی بسیار کوچک است (25×19)، اما خروجی هنوز نسبتاً بزرگ است، تا حدی به این دلیل که Base64 اندازه داده ها را افزایش می دهد، همانطور که قبلا ذکر کردیم.
رمزگشایی رشته های Base64 به داده های باینری
برعکس process در اینجا بسیار شبیه به روش رمزگشایی رشته های Base64 است، همانطور که در بخش قبلی دیدیم. بزرگترین تفاوت در مقصد خروجی و روش نوشتن داده ها در آنجا است. بیایید مثال را ببینیم:
'use strict';
const fs = require('fs');
let data = 'iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAA' +
'CA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0' +
'YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly' +
'93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg' +
'ICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZm' +
'Y6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVU' +
'TUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5Da' +
'Wb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA' +
'07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTF' +
'iSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM' +
'/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1' +
'Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1' +
'vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHh' +
'VdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5G' +
'K4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZN' +
'tFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxS' +
'bAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS' +
'2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII=';
let buff = new Buffer(data, 'base64');
fs.writeFileSync('stack-abuse-logo-out.png', buff);
console.log('Base64 image data converted to file: stack-abuse-logo-out.png');
در اینجا می توانید ببینید که ما با داده های Base64 (که می تواند از یک سوکت یا یک خط ارتباطی دیگر نیز دریافت شود) شروع می کنیم و آن را در یک بارگذاری می کنیم. Buffer
هدف – شی. هنگام ایجاد بافر به آن می گوییم که داخل است base64
فرمت، که به بافر اجازه می دهد تا آن را برای حافظه داخلی تجزیه و تحلیل کند.
برای ذخیره مجدد داده ها در قالب خام PNG، به سادگی آن را ارسال می کنیم Buffer
اعتراض به ما fs.writeFileSync
روش و تبدیل را برای ما انجام می دهد.
نتیجه
رمزگذاری Base64 یکی از رایج ترین روش های تبدیل داده های باینری به متن ASCII ساده است. این یک فرمت بسیار مفید برای برقراری ارتباط بین یک یا چند سیستم است که به راحتی نمی توانند داده های باینری را مدیریت کنند، مانند تصاویر در نشانه گذاری HTML یا درخواست های وب.
در Node.js Buffer
شی را می توان برای رمزگذاری و رمزگشایی رشته های Base64 به و از بسیاری از فرمت های دیگر استفاده کرد و به شما این امکان را می دهد تا در صورت نیاز به راحتی داده ها را به عقب و جلو تبدیل کنید.
معمولاً از قالب بندی Base64 در Node.js برای چه چیزی استفاده می کنید؟ در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-27 16:20:03