Base64 آمن للـ URL

تشفير وفك تشفير Base64 الآمن للـ URL (Base64url)

نص عادي

Base64

يعمل محليًا · آمن للصق الأسرار
إخراج 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 أو فكّ ترميز Base64url إلى نص دون أي تأخير — بدون إرسال نماذج أو إعادة تحميل للصفحة.
🔗
مخرجات آمنة للـ URL
تستخدم النتيجة فقط الأحرف الآمنة في عناوين URL وأسماء الملفات ورؤوس HTTP: A-Z وa-z و0-9 والشرطة والشرطة السفلية. لا حاجة إلى ترميز نسبي.
🔒
معالجة تُقدِّم الخصوصية أولًا
يعمل الترميز وفك الترميز بالكامل محليًا في متصفحك. توكنات JWT والأسرار OAuth ومفاتيح API التي تلصقها هنا لا تُرسَل إلى أي خادم قط.
🏛️
متوافق مع المعايير
يُطبِّق RFC 4648 القسم 5 بدقة: - و_ يحلاّن محل + و/، ويُحذف الحشو. متوافق مع مكتبات JWT وOAuth 2.0 PKCE وتطبيقات WebAuthn.

حالات استخدام Base64url

فحص توكنات JWT
فكّ ترميز أقسام JWT الفردية (header وpayload) لفحص المطالبات وأوقات الانتهاء وخوارزميات التوقيع دون استيراد مكتبة JWT أو التحقق من التوقيع.
تدفق OAuth 2.0 PKCE
أنشئ قيم code_verifier وcode_challenge في PKCE وتحقق منها. تستلزم code_challenge_method S256 تجزئة SHA-256 لـ code_verifier مُرمَّزةً بـ Base64url.
تكامل WebAuthn / FIDO2
تُنقَل قيم challenge ومعرّف بيانات الاعتماد وبيانات attestation في WebAuthn بين المتصفح وخادم الطرف المعتمِد كسلاسل Base64url. فكّ ترميزها لتتبع تدفقات التسجيل والمصادقة.
توليد توكنات API
أنشئ توكنات آمنة للـ URL من بايتات عشوائية لروابط إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني ومعرّفات الجلسات. يُنتِج Base64url سلاسل مدمجة تعمل في عناوين URL دون هروب.
DevOps وخطوط CI/CD
احفظ قيم الإعدادات الثنائية (الشهادات والمفاتيح) كسلاسل Base64url في متغيرات البيئة أو ملفات YAML. على عكس Base64 القياسي، لا تحتوي النتيجة على أحرف تتعارض مع توسيع shell أو صياغة YAML.
هندسة البيانات
رمِّز المعرّفات الثنائية أو التجزئات أو checksums بـ Base64url للاستخدام في أسماء الملفات أو مفاتيح قاعدة البيانات أو أعمدة CSV حيث ستُعطِّل أحرف + و/ التحليل أو تستلزم الهروب.

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 (بدون حشو)
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 القياسية، ويحذف أحرف الحشو = اللاحقة. هذا يجعل النتيجة آمنةً للاستخدام في عناوين URL ومعاملات الاستعلام وأسماء الملفات ورؤوس HTTP دون ترميز إضافي. الخوارزمية الأساسية (تقسيم البايتات إلى مجموعات من 6 بتات مُعيَّنة إلى أحرف ASCII) متطابقة.
لماذا تستخدم توكنات JWT ترميز Base64url بدلًا من Base64 القياسي؟
تُنقَل رموز JWT كثيرًا في معاملات استعلام URL ورؤوس HTTP Authorization. أحرف Base64 القياسي + و/ ستحتاج إلى ترميز نسبي في عناوين URL، مما يزيد الطول ويُعطِّل مقارنات السلاسل البسيطة. تُلزِم مواصفة JWT (RFC 7519) بـ Base64url بدون حشو لضمان كون التوكنات مدمجةً وآمنةً للـ URL افتراضيًا.
كيف أحوِّل Base64 القياسي إلى Base64url؟
استبدل كل + بـ - وكل / بـ _ واحذف جميع أحرف = اللاحقة. في JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). في Python: base64.urlsafe_b64encode(data).rstrip(b'='). توفر معظم اللغات الحديثة أيضًا دالة ترميز Base64url مخصصة. هذا التحويل ضروري بشكل خاص عند دمج المكتبات القديمة التي تنتج Base64 القياسي مع الأنظمة التي تتوقع Base64url.
هل ترميز Base64url قابل للعكس؟
نعم، Base64url قابل للعكس تمامًا. لفك الترميز، استبدل - بـ + و_ بـ / وأعِد إضافة أحرف الحشو = لجعل الطول مضاعفًا للعدد 4، ثم فكّ الترميز كـ Base64 قياسي. النتيجة المفككة مطابقة للمدخل الأصلي بايت بايت.
هل يمكنني استخدام Base64url لتشفير البيانات؟
لا. Base64url ترميز وليس تشفيرًا. يحوِّل البيانات الثنائية إلى تنسيق نصي آمن دون أي سرية — يمكن لأي شخص فك ترميزه. إذا أردت حماية البيانات، شفِّرها أولًا بخوارزمية مناسبة (AES أو ChaCha20)، ثم رمِّز النص المشفَّر بـ Base64url للنقل.
لماذا يُحذَف الحشو في Base64url؟
لا تؤدي أحرف الحشو (=) أي غرض عندما يستطيع فاك الترميز حساب عدد البايتات الناقصة من طول السلسلة: (4 - length % 4) % 4 يعطي الحشو المطلوب. حذف الحشو يجعل السلسلة أقصر ويتجنب أحرف = التي ستحتاج إلى ترميز نسبي في عناوين URL. يُجيز RFC 4648 القسم 5 صراحةً حذف الحشو في Base64url.
كيف أتعامل مع سلاسل Base64url التي تحتوي على حشو في كودي؟
بعض الأنظمة تُنتِج سلاسل Base64url تحتفظ بحشو =. تتعامل معظم فاكّات الترميز مع هذا بشكل صحيح. إذا لم يفعل الخاص بك، احذف = اللاحقة قبل فك الترميز. وعكسيًا، إذا كانت المكتبة تستلزم الحشو، احسبه وأضفه: const padded = str + '='.repeat((4 - str.length % 4) % 4). يعمل هذا لأن عدد الحشو يمكن تحديده من طول السلسلة.