Base64 آمن للـ URL
تشفير وفك تشفير Base64 الآمن للـ URL (Base64url)
نص عادي
Base64
ما هو ترميز Base64url؟
Base64url هو نوع مختلف من ترميز Base64 مُصمَّم تحديدًا للاستخدام في عناوين URL وأسماء الملفات والسياقات الأخرى التي تُسبِّب فيها أحرف Base64 القياسية + و/ مشكلات. محدَّد في RFC 4648 القسم 5، يستبدل Base64url الحرف + بـ - (شرطة) و/ بـ _ (شرطة سفلية)، ويحذف أحرف الحشو = اللاحقة. والنتيجة سلسلة نصية يمكن تضمينها مباشرةً في معامل استعلام URL أو اسم ملف أو رأس HTTP دون الحاجة إلى ترميز نسبي إضافي.
يستخدم Base64 القياسي (RFC 4648 القسم 4) 64 حرفًا: A-Z وa-z و0-9 و+ و/. أحرف + و/ محجوزة في عناوين URL: يُفسَّر + كمسافة في سلاسل الاستعلام (application/x-www-form-urlencoded)، بينما / هو فاصل المسار. لذا يستلزم استخدام Base64 القياسي داخل URL ترميز هذين الحرفين نسبيًا (%2B و%2F)، مما يزيد طول السلسلة ويُصعِّب قراءتها. يُلغي Base64url هذه المشكلة كليًا باستخدام أحرف آمنة للـ URL منذ البداية.
أبرز استخدامات Base64url هو في JSON Web Tokens (JWT). جميع الأقسام الثلاثة في JWT — header وpayload وsignature — مُرمَّزة بـ Base64url. كذلك تعتمد code verifiers في OAuth 2.0 PKCE وقيم challenge في WebAuthn وكثير من مخططات توكنات API على Base64url. فهم هذا الترميز أمر لا غنى عنه لأي مطوِّر يعمل مع المصادقة والتفويض أو تبادل البيانات التشفيرية.
لماذا تستخدم أداة Base64url هذه؟
حوِّل بين Base64url والنص أو البيانات الثنائية مباشرةً في متصفحك. يُدعَم الترميز وفك الترميز كليهما مع معالجة تلقائية للحشو واستبدال الأحرف. سواء كنت تقوم بتشخيح رمز JWT، أو إنشاء تحدي PKCE، أو توليد معرفات آمنة لعناوين URL، فإن هذه الأداة توفر نتائج دقيقة مباشرةً في متصفحك دون الحاجة إلى أي مكتبات خارجية.
حالات استخدام Base64url
Base64 القياسي مقابل Base64url
يختلف Base64url عن Base64 القياسي في ثلاثة جوانب فقط. خوارزمية الترميز متطابقة — يتغيّر فقط الأبجدية وسلوك الحشو:
| الخاصية | القياسي (RFC 4648 §4) | Base64url (RFC 4648 §5) |
|---|---|---|
| Index 62 | + | - |
| Index 63 | / | _ |
| Padding | = (required) | Omitted |
تعني هذه الاختلافات الثلاثة أن التحويل بين Base64 القياسي وBase64url أمر بسيط: استبدل + بـ - و/ بـ _ واحذف أحرف = اللاحقة. وعكسيًا، استبدل - بـ + و_ بـ / وأعِد إضافة الحشو لجعل الطول مضاعفًا للعدد 4. توفر معظم اللغات دعمًا أصليًا لـ Base64url مما يجعل التحويل اليدوي غير ضروري.
جدول مقارنة الترميز
يعرض الجدول أدناه نفس المدخلات مُرمَّزةً بـ Base64 القياسي وBase64url. لاحظ كيف تُحذف أحرف الحشو (=) وتُستبدل + / / بـ - / _ في النوع الآمن للـ URL:
| المدخل | Base64 القياسي | Base64url (بدون حشو) |
|---|---|---|
| Hello | SGVsbG8= | SGVsbG8 |
| A | QQ== | |
| 1+1=2 | MSsxPTI= | MSsxPTI |
| subject?ref=1 | c3ViamVjdD9yZWY9MQ== | c3ViamVjdD9yZWY9MQ |
| ð (thumbs up) | 8J+RjQ== | 8J-RjQ |
أمثلة برمجية
كيفية ترميز وفك ترميز سلاسل Base64url في اللغات الشائعة. كل مثال يُنتِج نتيجةً آمنةً للاستخدام في عناوين URL وأسماء الملفات ورؤوس HTTP:
// 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!"// 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" }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!'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!"
}