رمزگذاری / رمزگشایی
Base64، Base64URL، رمزگذاری درصدی URL، موجودیتهای HTML و هگز را هنگام تایپ رمزگذاری یا رمزگشایی کنید، با پشتیبانی کامل از UTF-8.
هیچ چیزی که وارد میکنید ذخیره نمیشود - در همان درخواست تبدیل و بازگردانده میشود.
Base64، Base64URL، رمزگذاری درصدی URL، موجودیتهای HTML و هگز را هنگام تایپ رمزگذاری یا رمزگشایی کنید، با پشتیبانی کامل از UTF-8.
هیچ چیزی که وارد میکنید ذخیره نمیشود - در همان درخواست تبدیل و بازگردانده میشود.
یک توکن در لاگ، یک رشته پرسوجو در ریدایرکت، یک ایمیل پر از &: متن رمزگذاریشده در کار همهجا پیدا میشود. آن را اینجا بچسبانید، قالب را انتخاب کنید و نتیجه رمزگذاری یا رمزگشایی را همزمان با تایپ ببینید.
یک JSON Web Token سه بخش Base64URL است که با نقطه به هم وصل شدهاند: سرآیند، محتوا (payload) و امضا. بخش میانی را بچسبانید، Base64URL را انتخاب و رمزگشایی کنید تا ادعاهای JSON مانند شناسه کاربر و زمان انقضای exp را ببینید (یک تایماستمپ یونیکس که با مبدل تایماستمپ یونیکس خوانده میشود). رمزگشایی یعنی خواندن، نه تأیید: هر کسی میتواند محتوای JWT را بخواند و فقط بررسی امضا روی سرور ثابت میکند که تغییر نکرده است.
Base64 بدون padding، که برخی سیستمها برای صرفهجویی در فضا حذفش میکنند، در رمزگشاهای سختگیر خطا میدهد؛ این ابزار علامتهای = جاافتاده را اضافه میکند و به شما میگوید. بسیاری از سرورها + را در رشته پرسوجو فاصله میخوانند، پس مقدار Base64 که بدون کدگذاری در لینک چسبانده شود خراب میرسد؛ آن را به عنوان جزء URL کدگذاری کنید یا از Base64URL استفاده کنید. متنی که دو بار رمزگذاری شده به شکل %2520 یا & دیده میشود و باید دو بار رمزگشایی شود.
رمزگشایی Base64 فاصلهها و شکست خط را نادیده میگیرد، پس مقداری که مثل یک ایمیل در چند خط شکسته شده، همانطور که چسبانده شده رمزگشایی میشود. Base64URL علامتهای + و / را هم میپذیرد، ولی Base64 معمولی - و _ را رد میکند، پس بخشی از یک JWT به گزینه Base64URL نیاز دارد. رمزگشایی hex از فاصله، دونقطه، ویرگول، خط تیره و پیشوند 0x میگذرد، پس هم 48:65:6c:6c:6f و هم 0x48 0x65 کار میکنند. رمزگشایی URL علامت + را به فاصله تبدیل میکند، پس یک علامت جمع واقعی باید به شکل %2B برسد. رمزگذاری HTML پنج نویسه & < > " و ' را escape میکند؛ رمزگشایی HTML همه موجودیتهای نامدار HTML5 مانند و … و موجودیتهای عددی مانند ₹ برای نماد روپیه را میشناسد.
رمزگذاری URL در اینجا یک مقدار را رمزگذاری میکند، مثلا یک پارامتر پرسوجو، پس همه نویسههای رزروشده escape میشوند: https://example.com/a b?x=1&y=2 به https%3A%2F%2Fexample.com%2Fa%20b%3Fx%3D1%26y%3D2 تبدیل میشود. فقط مقداری را که در پیوند میگذارید رمزگذاری کنید، نه کل پیوند را. متن خارج از ASCII به صورت بایتهای UTF-8 آن رمزگذاری میشود: café ₹ به caf%C3%A9%20%E2%82%B9 تبدیل میشود و هگز همان بایتها را نشان میدهد، é به صورت c3 a9 و ₹ به صورت e2 82 b9. Base64 عبارت user:pass برابر dXNlcjpwYXNz است، همان مقداری که سرآیند HTTP Basic Authorization حمل میکند (RFC 7617)؛ به همین دلیل هر کسی آن سرآیند را ببیند میتواند گذرواژه را بخواند.
بایتها UTF-8 بودهاند اما جایی پیش از رمزگذاری به صورت Latin-1 یا Windows-1252 خوانده شدهاند. رمزگشایی اینجا بایتها را همانطور که هستند نشان میدهد؛ اصلاح باید در سیستمی انجام شود که آنها را تولید کرده است.
تا 200,000 نویسه متن بچسبانید. برای فایلهای باینری مانند تصویر، بایتهای رمزگشاییشده به جای تبدیل به فایل دانلودی به صورت هگز نشان داده میشوند.
خیر. Base64 فقط شیوه نوشتن بایتها را تغییر میدهد تا از سیستمهایی که متن ساده انتظار دارند سالم عبور کنند. هر کسی میتواند آن را رمزگشایی کند؛ هرگز از آن برای پنهان کردن رمز عبور یا راز استفاده نکنید.
Base64URL به جای "+" و "/" از "-" و "_" استفاده میکند و معمولاً padding "=" را حذف میکند تا نتیجه در URL و نام فایل امن باشد. JSON Web Tokenها از آن استفاده میکنند.
خیر. در همان درخواست تبدیل و برگردانده میشود و هرگز در پایگاه داده یا لاگ نوشته نمیشود.
این ابزار نویسههای ! ' ( ) و * را هم escape میکند که encodeURIComponent دستنخورده میگذارد، پس it's (50%) off! به it%27s%20%2850%25%29%20off%21 تبدیل میشود. هر دو شکل به همان متن رمزگشایی میشوند و escape کردن این نویسهها درون مقدار پرسوجو همیشه بیخطر است. فاصله به %20 تبدیل میشود نه +؛ شکل + از رمزگذاری فرمهای HTML میآید و رمزگشای اینجا هر دو را میخواند.
در Linux یا Mac دستور echo -n 'Hello, World' | base64 خروجی SGVsbG8sIFdvcmxk را میدهد و echo 'SGVsbG8sIFdvcmxk' | base64 --decode آن را به متن برمیگرداند. اگر -n را ننویسید، echo یک خط جدید اضافه میکند که آن هم رمزگذاری میشود و نتیجه SGVsbG8sIFdvcmxkCg== میشود؛ رایجترین دلیل اینکه دو ابزار نتیجه متفاوت میدهند. در PowerShell دستور [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Hello, World')) رمزگذاری و [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('SGVsbG8sIFdvcmxk')) رمزگشایی میکند. این صفحه دقیقا همان نویسههایی را که میچسبانید با UTF-8 رمزگذاری میکند و خط جدیدی اضافه نمیکند.
فقط بخش بعد از ویرگول را بچسبانید: در data:image/png;base64,iVBORw0KGgo... این بخش iVBORw0KGgo... است، چون پیشوند data:image/png;base64, خودش Base64 نیست و کل رشته رد میشود. Base64 و Decode را انتخاب کنید. بایتهایی که متن نیستند به جای نمایش به شکل تصویر به صورت hex نشان داده میشوند و همین برای فهمیدن نوع فایل کافی است: PNG با 89 50 4e 47، JPEG با ff d8 ff و یک فایل کامل .docx، .xlsx یا فایل دیگر مبتنی بر ZIP با 50 4b 03 04 شروع میشود. برای دیدن خود تصویر، data URI کامل را در نوار نشانی مرورگر بچسبانید. ورودی حداکثر 200,000 نویسه است، یعنی حدود 150,000 بایت فایل.
Base64 هر 3 بایت را با 4 نویسه مینویسد و گروه آخر را با = تا مضربی از 4 پر میکند (RFC 4648)، پس خروجی 4/3 بایتهای ورودی است، رو به بالا گرد شده. Hello, World برابر 12 بایت است و به 16 نویسه SGVsbG8sIFdvcmxk تبدیل میشود. شمارش بر اساس بایت UTF-8 است نه حرف: café چهار نویسه اما 5 بایت است و Y2Fmw6k= میشود، و ₹100 برابر 6 بایت است و 4oK5MTAw میشود. پیوستهای ایمیل کمی بیشتر بزرگ میشوند، چون MIME متن Base64 را به سطرهایی با حداکثر 76 نویسه میشکند (RFC 2045)؛ این صفحه هنگام رمزگشایی این شکست سطرها را نادیده میگیرد. Base64URL بدون پرکننده فقط علامتهای = را حذف میکند.