ToolDeck

Base64 ایمن برای URL

رمزگذاری و رمزگشایی Base64 ایمن برای URL (Base64url)

متن ساده

Base64

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
خروجی Base64...

رمزگذاری Base64url چیست؟

Base64url نوعی از رمزگذاری Base64 است که به‌طور خاص برای استفاده در URL‌ها، نام فایل‌ها، و سایر زمینه‌هایی طراحی شده که کاراکترهای استاندارد Base64 یعنی + و / مشکل‌ساز می‌شوند. Base64url که در RFC 4648 بخش ۵ تعریف شده، + را با - (خط تیره) و / را با _ (زیرخط) جایگزین می‌کند، و کاراکترهای padding یعنی = انتهایی را حذف می‌کند. نتیجه رشته‌ای است که می‌توان آن را مستقیماً در پارامتر query یک URL، نام فایل، یا سربرگ HTTP بدون نیاز به رمزگذاری درصدی اضافه جاسازی کرد.

Base64 استاندارد (RFC 4648 بخش ۴) از ۶۴ کاراکتر استفاده می‌کند: A-Z، a-z، 0-9، + و /. کاراکترهای + و / در URL‌ها رزروشده هستند: + در query string‌ها به‌عنوان فاصله تفسیر می‌شود (application/x-www-form-urlencoded)، و / یک جداکننده مسیر است. بنابراین استفاده از Base64 استاندارد درون یک URL نیازمند رمزگذاری درصدی این کاراکترها (%2B، %2F) است که طول رشته را افزایش می‌دهد و خوانایی آن را کاهش می‌دهد. Base64url این مشکل را با استفاده از کاراکترهای ایمن برای URL از همان ابتدا به‌طور کامل حل می‌کند.

برجسته‌ترین کاربرد Base64url در JSON Web Tokens یا JWT است. هر سه بخش یک JWT — سربرگ، payload، و امضا — با Base64url رمزگذاری شده‌اند. کدهای PKCE در OAuth 2.0، مقادیر challenge در WebAuthn، و بسیاری از طرح‌های توکن API نیز بر Base64url تکیه دارند. درک این رمزگذاری برای هر توسعه‌دهنده‌ای که با احراز هویت، مجوزدهی، یا تبادل داده رمزنگاری‌شده کار می‌کند ضروری است.

چرا از این ابزار Base64url استفاده کنیم؟

مستقیماً در مرورگر بین Base64url و متن یا داده باینری تبدیل کنید. هم رمزگذاری و هم رمزگشایی پشتیبانی می‌شوند، با مدیریت خودکار padding و جایگزینی کاراکترها. چه در حال دیباگ کردن یک توکن JWT باشید، کد PKCE challenge تولید کنید، یا شناسه‌های ایمن برای URL برای لینک‌های بازنشانی رمز عبور بسازید، این ابزار همه چیز را به‌صورت محلی در مرورگر شما با تأخیر صفر و بدون هیچ درخواستی به سرور پردازش می‌کند.

تبدیل فوری
خروجی همزمان با تایپ شما به‌روز می‌شود. متن را به Base64url رمزگذاری کنید یا Base64url را به متن برگردانید — بدون تأخیر، بدون ارسال فرم یا بارگذاری مجدد صفحه.
🔗
خروجی ایمن برای URL
خروجی تنها از کاراکترهایی استفاده می‌کند که در URL‌ها، نام فایل‌ها، و سربرگ‌های HTTP ایمن هستند: A-Z، a-z، 0-9، خط تیره، و زیرخط. نیازی به رمزگذاری درصدی نیست.
🔒
پردازش حریم‌خصوصی‌محور
تمام رمزگذاری و رمزگشایی به‌صورت محلی در مرورگر شما اجرا می‌شود. توکن‌های JWT، اسرار OAuth، و کلیدهای API که اینجا جای‌گذاری می‌کنید هرگز به هیچ سروری ارسال نمی‌شوند.
🏛️
سازگار با استانداردها
RFC 4648 بخش ۵ را به‌طور دقیق پیاده‌سازی می‌کند: - و _ به‌جای + و /، padding حذف می‌شود. سازگار با کتابخانه‌های JWT، OAuth 2.0 PKCE، و پیاده‌سازی‌های WebAuthn.

موارد استفاده Base64url

بررسی توکن JWT
بخش‌های منفرد JWT (سربرگ، payload) را رمزگشایی کنید تا claim‌ها، زمان انقضا، و الگوریتم‌های امضا را بررسی کنید — بدون نیاز به وارد کردن کتابخانه JWT یا تأیید امضا.
جریان PKCE در OAuth 2.0
مقادیر code_verifier و code_challenge در PKCE را تولید و تأیید کنید. متد code_challenge_method S256 نیازمند یک هش SHA-256 رمزگذاری‌شده با Base64url از code_verifier است.
یکپارچه‌سازی WebAuthn / FIDO2
داده‌های challenge، credential ID، و attestation در WebAuthn به‌صورت رشته‌های Base64url بین مرورگر و سرور طرف اتکا منتقل می‌شوند. آن‌ها را رمزگشایی کنید تا جریان‌های ثبت‌نام و احراز هویت را دیباگ کنید.
تولید توکن API
از بایت‌های تصادفی توکن‌های ایمن برای URL بسازید تا در لینک‌های بازنشانی رمز عبور، تأیید ایمیل، و شناسه‌های نشست استفاده کنید. Base64url رشته‌های فشرده‌ای تولید می‌کند که در URL‌ها بدون نیاز به escape کار می‌کنند.
Pipeline‌های DevOps و CI/CD
مقادیر پیکربندی باینری (گواهی‌نامه‌ها، کلیدها) را به‌صورت رشته‌های Base64url در متغیرهای محیطی یا فایل‌های YAML ذخیره کنید. برخلاف Base64 استاندارد، خروجی حاوی کاراکترهایی نیست که با توسعه shell یا نحو YAML تداخل داشته باشند.
مهندسی داده
شناسه‌های باینری، هش‌ها، یا checksum‌ها را با Base64url رمزگذاری کنید تا در نام فایل‌ها، کلیدهای پایگاه داده، یا ستون‌های CSV استفاده شوند — جایی که کاراکترهای + و / پارس‌کردن را خراب یا نیازمند escape می‌کنند.

Base64 استاندارد در برابر Base64url

Base64url دقیقاً در سه چیز با Base64 استاندارد تفاوت دارد. الگوریتم رمزگذاری یکسان است — تنها الفبا و رفتار padding تغییر می‌کنند:

ویژگیاستاندارد (RFC 4648 §4)Base64url (RFC 4648 §5)
Index 62+-
Index 63/_
Padding= (required)Omitted

این سه تفاوت به این معناست که تبدیل بین Base64 استاندارد و Base64url ساده است: + را با - و / را با _ جایگزین کنید، و کاراکترهای = انتهایی را حذف کنید. برعکس، - را با +، _ را با / جایگزین کنید، و padding را اضافه کنید تا طول مضربی از ۴ شود. اکثر زبان‌ها پشتیبانی بومی از Base64url دارند و تبدیل دستی را غیرضروری می‌کنند.

جدول مقایسه رمزگذاری

جدول زیر ورودی‌های یکسان را رمزگذاری‌شده با Base64 استاندارد و Base64url نشان می‌دهد. توجه کنید که کاراکترهای padding (=) حذف شده و + / / با - / _ در نوع ایمن برای URL جایگزین شده‌اند:

ورودیBase64 استانداردBase64url (بدون padding)
HelloSGVsbG8=SGVsbG8
AQQ==QQ
1+1=2MSsxPTI=MSsxPTI
subject?ref=1c3ViamVjdD9yZWY9MQ==c3ViamVjdD9yZWY9MQ
👍 (thumbs up)8J+RjQ==8J-RjQ

نمونه کد

نحوه رمزگذاری و رمزگشایی رشته‌های Base64url در زبان‌های محبوب. هر مثال خروجی‌ای تولید می‌کند که برای استفاده در URL‌ها، نام فایل‌ها، و سربرگ‌های HTTP ایمن است:

JavaScript (browser)
// Encode to Base64url
function toBase64url(str) {
  return btoa(unescape(encodeURIComponent(str)))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '')
}
toBase64url('Hello!') // → "SGVsbG8h"

// Decode from Base64url
function fromBase64url(b64url) {
  const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')
  const pad = (4 - b64.length % 4) % 4
  return decodeURIComponent(escape(atob(b64 + '='.repeat(pad))))
}
fromBase64url('SGVsbG8h') // → "Hello!"
Node.js
// Native base64url support since Node 15.7
const encoded = Buffer.from('Hello!').toString('base64url')
// → "SGVsbG8h"

const decoded = Buffer.from('SGVsbG8h', 'base64url').toString()
// → "Hello!"

// Decode a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0...'
const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString())
// → { sub: "1234567890" }
Python
import base64

# Encode to Base64url (no padding)
encoded = base64.urlsafe_b64encode(b'Hello!').rstrip(b'=').decode()
# → "SGVsbG8h"

# Decode from Base64url (re-add padding)
def b64url_decode(s: str) -> bytes:
    s += '=' * (4 - len(s) % 4)  # restore padding
    return base64.urlsafe_b64decode(s)

b64url_decode('SGVsbG8h')  # → b'Hello!'
Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    // Encode to Base64url (no padding)
    encoded := base64.RawURLEncoding.EncodeToString([]byte("Hello!"))
    fmt.Println(encoded) // → "SGVsbG8h"

    // Decode from Base64url
    decoded, _ := base64.RawURLEncoding.DecodeString("SGVsbG8h")
    fmt.Println(string(decoded)) // → "Hello!"
}

سوالات متداول

تفاوت Base64 و Base64url چیست؟
Base64url در الفبای Base64 استاندارد، + را با - و / را با _ جایگزین می‌کند، و کاراکترهای padding = انتهایی را حذف می‌کند. این خروجی را برای استفاده در URL‌ها، پارامترهای query، نام فایل‌ها، و سربرگ‌های HTTP بدون رمزگذاری اضافه ایمن می‌کند. الگوریتم زیرین (تقسیم بایت‌ها به گروه‌های ۶ بیتی نگاشته‌شده به کاراکترهای ASCII) یکسان است. در عمل، رشته‌های Base64url می‌توانند مستقیماً در URL‌ها و سربرگ‌های HTTP بدون هیچ تغییری استفاده شوند، در حالی که رشته‌های Base64 استاندارد در این زمینه‌ها نیاز به رمزگذاری درصدی دارند.
چرا توکن‌های JWT از Base64url به‌جای Base64 استاندارد استفاده می‌کنند؟
JWT‌ها اغلب در پارامترهای query URL و سربرگ‌های Authorization HTTP منتقل می‌شوند. کاراکترهای + و / در Base64 استاندارد باید در URL‌ها درصدی رمزگذاری شوند که طول را افزایش داده و مقایسه‌های رشته‌ای ساده را خراب می‌کند. مشخصات JWT یا RFC 7519 استفاده از Base64url بدون padding را الزامی می‌کند تا توکن‌ها به‌طور پیش‌فرض فشرده و ایمن برای URL باشند.
چطور Base64 استاندارد را به Base64url تبدیل کنم؟
هر + را با - و هر / را با _ جایگزین کنید و تمام کاراکترهای = انتهایی را حذف کنید. در JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). در Python: base64.urlsafe_b64encode(data).rstrip(b'='). اکثر زبان‌های مدرن همچنین یک تابع رمزگذاری Base64url اختصاصی ارائه می‌دهند. این تبدیل معمولاً هنگام یکپارچه‌سازی کتابخانه‌های قدیمی‌تری که خروجی Base64 استاندارد تولید می‌کنند با سیستم‌های مدرنی که انتظار Base64url دارند مورد نیاز است.
آیا رمزگذاری Base64url برگشت‌پذیر است؟
بله، Base64url کاملاً برگشت‌پذیر است. برای رمزگشایی، - را با + و _ را با / جایگزین کنید، کاراکترهای = مورد نیاز را اضافه کنید تا طول مضربی از ۴ شود، سپس به‌عنوان Base64 استاندارد رمزگشایی کنید. خروجی رمزگشایی‌شده بایت‌به‌بایت با ورودی اصلی یکسان است.
آیا می‌توانم از Base64url برای رمزنگاری داده استفاده کنم؟
خیر. Base64url یک رمزگذاری است، نه رمزنگاری. داده باینری را بدون هیچ محرمانگی‌ای به فرمت متنی ایمن تبدیل می‌کند — هر کسی می‌تواند آن را رمزگشایی کند. اگر نیاز به محافظت از داده دارید، ابتدا آن را با یک الگوریتم مناسب (AES، ChaCha20) رمزنگاری کنید، سپس متن رمزنگاری‌شده را برای انتقال با Base64url رمزگذاری کنید.
چرا padding در Base64url حذف می‌شود؟
کاراکترهای padding (=) هیچ هدفی ندارند وقتی رمزگشا می‌تواند تعداد بایت‌های گمشده را از طول رشته محاسبه کند: (4 - length % 4) % 4 padding مورد نیاز را می‌دهد. حذف padding رشته را کوتاه‌تر می‌کند و از کاراکترهای = که باید در URL‌ها درصدی رمزگذاری شوند جلوگیری می‌کند. RFC 4648 بخش ۵ صریحاً حذف padding در Base64url را مجاز می‌داند.
چطور در کدم با رشته‌های Base64url که padding دارند کار کنم؟
برخی سیستم‌ها رشته‌های Base64url با padding = تولید می‌کنند. اکثر رمزگشاها این را به‌درستی مدیریت می‌کنند. اگر رمزگشای شما این‌طور نیست، قبل از رمزگشایی = انتهایی را حذف کنید. برعکس، اگر کتابخانه‌ای به padding نیاز دارد، آن را محاسبه و اضافه کنید: const padded = str + '='.repeat((4 - str.length % 4) % 4). این کار می‌کند چون تعداد padding از طول رشته قابل تعیین است.