Command Palette

Search for a command to run...

شرح ترميز BASE64: التشفير وفك التشفير مثل Pro

شرح ترميز BASE64: التشفير وفك التشفير مثل Pro

T
Toolz Team
|Jun 18, 2026|15 دقيقة قراءة

جزء من مجموعة ترقيم

الإصدار الأول من محول Base64 الذي قمت بشحنه على Toolz.dev كان به خطأ I&#39؛ وما زلت محرجًا بعض الشيء بشأنه. لقد نجح الأمر بشكل مثالي في كل اختبار كتبته - مشفر، مفكك التشفير، متعثر، تم إنجازه. ثم قام شخص ما بلصق نص يحتوي على رمز تعبيري وحصل على هذا

Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.

I&#39؛d قام ببناء أداة لترميز النص ونسي أن النص يتضمن، كما تعلمون معظم النص. كل نص غير لاتيني، كل حرف مميز، كل رمز تعبيري - مكسور. كانت اختباراتي كلها ASCII لأنني أفكر في ASCII. لقد علمني هذا الخطأ المزيد عن Base64 أكثر مما علمته أي قراءة للمواصفات، وI&#39؛ سأعرض لك الإصلاح لاحقًا لأنه يعرقل كل من يلمس تقريبًا btoa().

يعد Base64 أحد الأشياء التي يستخدمها المطورون يوميًا - داخل كل JWT، وكل مرفق بريد إلكتروني، وكل data: URI - بينما نادرًا ما ينظر تحت غطاء المحرك. Let&#39؛ انظر تحت غطاء المحرك.

ليرة تركية؛DR: يقوم ترميز BASE64 بتحويل البيانات الثنائية إلى 64 حرف ASCII آمن حتى يتمكن من الانتقال عبر القنوات النصية فقط مثل JSON وعناوين URL والبريد الإلكتروني - بتكلفة ~ 33% من الحجم الزائد. إنه كذلك لا تشفير؛ يمكن لأي شخص عكسه على الفور. للتشفير أو فك التشفير الآن، استخدم جانب العميل المجاني محول BASE64 في Toolz.dev - لا تغادر بياناتك المتصفح أبدًا، وهو أمر مهم عندما تقوم أنت &#39؛ بإعادة فك رموز الرموز المميزة.


ما هو ترميز Base64؟

Base64 هو نظام ترميز ثنائي إلى نص: فهو يمثل بايتات عشوائية باستخدام 64 حرفًا فقط تنجو من كل نظام نصي تم إنشاؤه على الإطلاق. المواصفات الرسمية هي RFC 4648 (2006)، على الرغم من أن الترميز يعود إلى RFC 1421 والبريد المحسن للخصوصية في عام 1993 - إلا أن Base64 أقدم من متصفح الويب.

الأبجدية:

  • A–Z → القيم 0 art25
  • a–z → القيم 26 rec51
  • 0–9 → القيم 52 · 61
  • + → 62، / → 63
  • = → الحشو (ليست قيمة، مجرد حشو)

لماذا هذه 64؟ لأنها لا تزال غير مشوهة في ASCII وEBCDIC وكل بوابة بريد إلكتروني تم إنشاؤها على الإطلاق. Base64 هي معاهدة سلام تضم عقودًا من البنية التحتية للنصوص فقط.

تكلفة المعاهدة: كل 3 بايتات إدخال تصبح 4 أحرف إخراج - ضريبة حجم ثابتة بنسبة 33%. احتفظ بهذا الرقم في رأسك؛ فهو يقرر أسئلة الهندسة المعمارية الحقيقية.


كيف تعمل خوارزمية Base64؟

إجابة أقصر منك &#39؛ أتوقع: إعادة تجميع البتات من 8 إلى 6، ثم ابحث عنها في جدول. 26 = 64 - هذا &#39؛s من أين يأتي الاسم.

ترقيم Hi!:

الخطوة 1 - البايتات إلى البتات.

شخصية ASCII ثنائي
ح 72 01001000
أنا 105 01101001
! 33 00100001

متسلسلة: 010010000110100100100001- 24 بت.

الخطوة 2 - أعد التجميع إلى أجزاء ذات 6 بت.

010010 | 000110 | 100100 | 100001
  18   |   6    |   36   |   33

الخطوة 3 - ابحث عن كل قيمة في الأبجدية.

18 → S، 6 → G، 36 → k، 33 → h. لذا Hi! يشفر ل SGkh.

هذا &#39؛s الخوارزمية بأكملها. لا توجد رياضيات تتجاوز جدول البحث.

الحشو يتعامل مع المدخلات التي تمثل &#39؛t مضاعفات 3 بايت. تشفير فقط Hi (2 بايت = 16 بت) ويمكنك فقط ملء مجموعات 6 بت ثنائية وبت؛ يقوم المشفر بتلفيق البتات وإلحاقها = للإشارة إلى مقدار الحشو:

Hi  → SGk=    (2 bytes remaining → one '=')
H   → SA==    (1 byte remaining  → two '==')
Hi! → SGkh    (multiple of 3     → no padding)

عندما قمت بتنفيذ هذا لمحول Toolz.dev، كانت الحشو هي المكان الذي تعيش فيه جميع الأخطاء غير المتقطعة. إذا قمت بلف Base64 يدويًا - لإجراء مقابلة ترميز، على سبيل المثال - فاكتب اختبارات الحشو أولاً.

فك التشفير هو صورة معكوسة: تعود الأحرف إلى قيم 6 بت، وتعيد تجميعها في بايتات 8 بت، وتسقط الحشو.

Base64 encoding process diagram showing binary conversion, 6-bit grouping, and character mapping


أين يمكنك بالفعل الركض إلى Base64؟

JWTs - الكبير

كل رمز ويب JSON عبارة عن ثلاثة أجزاء مشفرة بـ Base64URL متصلة بنقاط: الرأس والحمولة والتوقيع. مصادقة تصحيح الأخطاء هي 50% فك تشفير هذه.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

فك تشفير الجزء الأول وتحصل عليه {"alg":"HS256","typ":"JWT"}. والثاني يعطيك المطالبات. سير العمل الخاص بي عندما يسيء الرمز المميز التصرف: قم بتقسيم النقاط، وفك تشفير كل جزء في محول BASE64، ثم لصق JSON في تنسيق JSON لقراءتها بشكل صحيح. معجونان، وأنت تعرف ما إذا كان exp المطالبة هي مشكلتك.

يستحق أن أقول بوضوح: حمولات JWT هي يمكن قراءتها من قبل أي شخص يحمل الرمز المميز. يتوقف التوقيع عن العبث، وليس القراءة. أنا &#39؛ لقد قمت بمراجعة قواعد التعليمات البرمجية التي حشوت البيانات الحساسة في المطالبات لأن المظهر الثرثار يعني الخصوصية. لا &#39؛ر.

JWT being decoded with Base64 converter showing header, payload, and signature parts

عناوين URI للبيانات

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

يؤدي تضمين الأصول الصغيرة في السطر إلى حفظ طلب HTTP. قاعدتي الأساسية من إنشاء واجهات مستخدم WordPress لإدارة WordPress ذات الصور الثقيلة: تستحق العناء أقل من ~5 كيلو بايت، بعد 10 كيلو بايت &#39؛ قم بتضخيم المستند بنسبة 33% لحفظ طلب تعدد إرسال HTTP/2 على أي حال.

أسرار Kubernetes - وصخب

apiVersion: v1
kind: Secret
data:
  password: cGFzc3dvcmQ=   # decodes to "password"

أسرار Kubernetes مشفرة بـ Base64، والأمان الخاطئ الذي ينطوي عليه ذلك مثير للقلق. يتم فك تشفير هذه القيمة في عجينة واحدة. يوجد Base64 هنا بحيث تبقى القيم الثنائية على قيد الحياة YAML - a التنسيق القرار، وليس الأمن. إذا انتهت قصة أسرارك عند &quot؛they&#39؛re Base64 in etcd،&quot؛ لقد بدأ &#39؛t.

بقية القائمة

رؤوس المصادقة الأساسية HTTP (Authorization: Basic dXNlcjpwYXNz فك التشفير إلى عادي user:pass- ومن ثم HTTPS فقط). مرفقات البريد الإلكتروني عبر MIME. النقط الثنائية داخل حمولات JSON، لأن JSON ليس له نوع ثنائي.


هل التشفير Base64؟ (لا، من فضلك، لا)

يستحق قسمه الخاص لأن المفهوم الخاطئ يرفض الموت.

Base64 هو أ التمثيل، مثل كتابة رقم بالنظام الست عشري. لا يوجد مفتاح. لا سر. لا يتطلب فك التشفير سوى جدول الأبجدية المطبوع علنًا في RFC 4648. أي شيء Base64-&quot؛ محمي وحاصل؛ محمي بالطريقة التي تتم بها حماية الحرف من خلال كتابته بخط متصل.

إذا كانت البيانات تحتاج إلى السرية: قم بالتشفير بشكل صحيح (AES-GCM، أو libsodium)، ثم يقوم Base64 بتشفير النص المشفر إذا كانت القناة بحاجة إلى نص. التشفير والتشفير يشكلان بشكل جيد - إنهما مجرد بدائل &#39؛t. وإذا كنت بحاجة إلى النزاهة بدلاً من السرية، فهذه &#39؛s هي وظيفة التجزئة #39؛s - مولد هاش يغطي SHA-256 والأصدقاء.


كيف يمكن مقارنة Base64 بـ Hex وترميز URL وBase85؟

قاعدة64 عرافة (قاعدة 16) ترميز URL/النسبة المئوية ASCII85
الحجم العلوي +33% +100% 0 بنسبة 200%، يعتمد على المحتوى +25%
الأبجدية 64 حرف 16 حرف أسكي + %XX يهرب 85 حرف
مخرجات يمكن قراءتها بواسطة الإنسان لا نوع - حدود البايت مرئية في الغالب، لإدخال ASCII لا
URL آمن بشكل افتراضي لا (+، /، =) نعم نعم بحكم التعريف لا
أنت &#39؛ سوف نلتقي به في JWTs، MIME، عناوين URI للبيانات التجزئة وعناوين MAC ورموز الألوان سلاسل الاستعلام PDF الداخلية

كيف أختار: عرافة عندما يقرأ البشر أو يقارنون المخرجات - المجاميع الاختبارية، والهضم، وأي شيء تم تصحيحه بواسطة مقلة العين. ترميز النسبة المئوية بالنسبة لنص URL، لا يكون ثنائيًا أبدًا. قاعدة64 للعبور الثنائي لقناة نصية - معظم الحالات الحقيقية. ASCII85 أبدا طوعا؛ التوفير بنسبة 8% لم يبرر بعد أسئلة التوافق.


ما هو URL-Safe Base64 ولماذا يوجد؟

المعيار Base64 لديه مشكلة: + يعني &quot؛space&quot؛ في سلاسل الاستعلام، / هو فاصل المسار، = يحدد المعلمات. ضع رمزًا مميزًا قياسيًا-Base64 في عنوان URL وبعض البرامج الوسيطة، في مكان ما، سوف تشوهه - بشكل متقطع، وفي الإنتاج فقط. اسألني كيف أعرف.

يحدد القسم 5 من RFC 4648 الإصلاح، والذي يسمى عادةً Base64URL:

معيار URL آمن
+ -
/ _
= حشوة عادة ما يتم حذفها فقط

نفس الخوارزمية، تم تبديل حرفين، وإسقاط الحشو. تستخدم JWTs Base64URL حصريًا - وهذا هو بالضبط سبب فشل لصق مقطع JWT في وحدة فك ترميز قياسية صارمة-Base64 أحيانًا في حالة الضالة - أو _. ال محول Toolz.dev يتعامل مع كلا الخيارين، لأن وحدة فك التشفير التي ترفض نصف وحدة Base64 الواقعية هي &#39؛ الكثير من وحدة فك التشفير.

القاعدة الأساسية: إذا كانت السلسلة المشفرة ستلمس عنوان URL أو اسم ملف أو رأس HTTP، فاستخدم المتغير الآمن لعنوان URL منذ البداية. التعديل التحديثي هو البحث والاستبدال بالإضافة إلى الصلاة.


كيف يمكنك التشفير وفك التشفير في الكود؟

جافا سكريبت - الفخ الذي وقعت فيه

هنا &#39؛s النسخة الساذجة، التي قمت بشحنها:

btoa('Hello')      // "SGVsbG8=" — great!
btoa('café ☕')    // InvalidCharacterError — the bug from my intro

btoa يسبق معالجة Unicode الحديثة ويقبل Latin-1 فقط. يمر النهج الحديث الصحيح عبر بايتات UTF-8 بشكل صريح

// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes));   // "Y2Fmw6kg4piV"

// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
  Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"

(في Node.js، تخطي الحفل: Buffer.from(str, 'utf8').toString('base64').)

بايثون

import base64

encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')

# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')

بايثون توضح الشيء الصحيح: أنت يجب قم بتمرير البايتات، بحيث يمكن لخطوة التشفير إلى UTF-8 &#39؛ نسيانها. أتمنى btoa وقد تم تصميمها بنفس العمود الفقري.

PHP

$encoded = base64_encode('café ☕');   // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);

// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');

الذي - التي strtr/rtrim لقد ظهر السطر في كل قاعدة بيانات PHP I&#39؛ لقد عملت على الإطلاق، بما في ذلك WP Adminify. لم تحصل PHP مطلقًا على متغير آمن لعنوان URL، لذلك نستمر جميعًا في كتابة نفس السطرين.


الأسئلة الشائعة

ما هو ترميز Base64 المستخدم؟

يقوم بتحويل البيانات الثنائية إلى نص ASCII حتى يتمكن من المرور عبر الأنظمة التي تتعامل فقط مع النص: حمولات JSON، وعناوين URL، والبريد الإلكتروني (MIME)، ورؤوس HTTP. تقابله في أغلب الأحيان برموز JWT، data: عناوين URI للصور المضمنة وأسرار Kubernetes وحمولات واجهة برمجة التطبيقات التي تحمل الملفات. It&#39؛s تنسيق نقل، وليس تنسيق تخزين أو أمان.

هل Base64 هو نفس التشفير؟

لا، والخلط بين الاثنين يسبب حوادث أمنية حقيقية. لا يحتوي Base64 على مفتاح - فك التشفير يتطلب فقط جدول الأبجدية العامة، ويأخذ معجونًا واحدًا في أي منها فك التشفير. التشفير أولاً باستخدام خوارزمية حقيقية (AES-GCM)، ثم تشفير النص المشفر إذا كانت القناة بحاجة إلى نص.

لماذا يجعل Base64 البيانات أكبر بنسبة 33%؟

يحمل كل حرف Base64 6 بتات من المعلومات ولكنه يشغل بايت 8 بتات كاملة، لذا فإن 3 بايتات من الإدخال تصبح دائمًا 4 أحرف من الإخراج - 4/3 ~ 1.33. It&#39؛s تكلفة ثابتة للتنسيق، لا يمكن تجنبها حسب التصميم. إذا كان الحجم مهمًا، قم بالضغط قبل التشفير، وليس بعده أبدًا - يبدو الإخراج المشفر عشوائيًا ويضغط بشكل رهيب.

ماذا &#39؛s الفرق بين Base64 وBase64URL؟

مقايضات Base64URL + ل - و / ل _، وعادة ما يسقط = الحشو، بحيث يبقى الإخراج على عناوين URL وأسماء الملفات والرؤوس دون الهروب. نفس الخوارزمية بخلاف ذلك، المحددة في RFC 4648 القسم 5. تستخدم JWTs Base64URL حصريًا - ولهذا السبب تختنق أجهزة فك التشفير القياسية الصارمة Base64 بها أحيانًا.

لماذا يقوم btoa() برمي خطأ InvalidCharacterError؟

تحتوي سلسلتك على أحرف خارج اللاتينية-1 - رمز تعبيري، وحرف مميز، وأي نص غير غربي. btoa هي واجهة برمجة تطبيقات تعود إلى التسعينيات وتسبق معالجة Unicode المعقولة. قم بالتشفير إلى UTF-8 بايت أولاً باستخدام TextEncoderثم Base64 البايتات؛ لقد قمت بشحن هذا الخطأ بالضبط في أداة الإنتاج، لذلك لا يوجد حكم.

كيف يمكنني معرفة ما إذا كانت السلسلة هي Base64؟

يستخدم Base64 الصالح فقط A–Z، a–z، 0–9، +، / (أو -، _ بالنسبة لـ URL-safe)، زائدة اختيارية =، بطول &#39؛s مضاعف 4 عند الحشو. لكن الكثير من الكلمات العادية تتطابق مع هذا النمط أيضًا - cafe صالح Base64 الذي يقوم بفك التشفير إلى بايتات البيانات المهملة. الاختبار الحقيقي هو فك تشفيره والتحقق مما إذا كان الإخراج ذا معنى.

لماذا تحتوي سلسلة Base64 الخاصة بي على سطر جديد طائش في النهاية؟

لأن echo يضيف واحدة من قبل base64 من أي وقت مضى يرى ذلك، لذلك echo "hunter2" | base64 يشفر ثمانية بايت، وليس سبعة. يستخدم printf أو echo -n بدلاً من ذلك. هذا هو السبب الأول لأسرار Kubernetes التي تبدو صحيحة في البيان وتفشل في وقت التشغيل: كلمة المرور التي تم فك تشفيرها تحمل مقطعًا غير مرئي \n. ال base64 يقوم الأمر أيضًا بتغليف الإخراج عند 76 عمودًا في بعض الأنظمة - تمرير -w 0 على GNU coreutils لقمعه.

كيف يمكنني فك تشفير رمز JWT يدويًا؟

قم بتقسيم الرمز المميز عند نقطتيه، وخذ الجزء الأول (الرأس) والثاني (الحمولة)، وقم بتشغيل كل منهما من خلال أ فك التشفير BASE64- هم &#39؛re Base64URL، لذا استخدم أداة تقبل - و _. ثم قم بتنسيق JSON الناتج في ملف منسق JSON لقراءة المطالبات. لا تقم أبدًا بلصق رموز الإنتاج في أدوات من جانب الخادم؛ جانب العميل فقط.

كيف أقوم بتشفير صورة أو ملف إلى Base64؟

اقرأ الملف كبايت، ثم Base64 تلك البايتات وقم بإضافة رأس معرف URI للبيانات مسبقًا مثل data:image/png;base64, لذلك يمكن للمتصفح أن يجعله مضمنًا. في جافا سكريبت، FileReader.readAsDataURL() يقوم بكلتا الخطوتين من أجلك؛ على سطر الأوامر، base64 logo.png طباعة الترميز الأولي. احتفظ بها للأصول الصغيرة - ضريبة الحجم البالغة 33% تجعل Base64 غير مناسب لأي شيء كبير، كما أن معرفات URI للبيانات الضخمة تعمل على تضخيم HTML أو CSS.

كيف يمكنني فك تشفير Base64 في JavaScript أو Python أو الجهاز الطرفي؟

في JavaScript الحديثة، قم بفك تشفير Unicode بأمان باستخدام new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) بدلا من عارية atob. في بايثون، base64.b64decode(str) إرجاع البايتات - استدعاء .decode('utf-8') للنص. في المحطة، echo "aGk=" | base64 -d (أو --decode). يتوقع الثلاثة معيار Base64، لذا ترجم -/_ العودة إلى +// أولاً إذا كنت &#39؛ تتعامل مع سلسلة Base64URL.


الوجبات الجاهزة

Base64 هي خدعة خلط البت عمرها 30 عامًا والتي تحمل بهدوء نصف الويب الحديث - رموز المصادقة والمرفقات والأصول المضمنة والأسرار التي aren&#39؛t-secret. فهم إعادة تجميع 6 بت، واحترم ضريبة 33%، ولا تخطئ أبدًا في التشفير، وتوصل إلى المتغير الآمن لعنوان URL في أي مكان يتضمن عنوان URL. That&#39؛s 95% من إتقان Base64 العملي.

بالنسبة للجزء العملي، فإن محول Base64 على Toolz.dev يقوم بالتشفير القياسي والآمن لعنوان URL بالكامل في متصفحك - تم إنشاؤه بواسطة شخص تعلم درس Unicode بالطريقة الصعبة، لذلك لا تحتاج إلى &#39؛t.

المزيد في هذه السلسلة: كامل دليل أدوات الترميز يغطي بقية المرافق للسائق اليومي، و دليل منشئ Regex يعالج المهارات الأخرى التي يتظاهر مطورو المهارات بامتلاكها، وبما أن نصف تصحيح أخطاء Base64 ينتهي بـ JSON، فإن دليل أدوات JSON النهائي هي القراءة التالية الطبيعية.


مقالات ذات صلة:

Frequently Asked Questions

It converts binary data into ASCII text so it can pass through systems that only handle text: JSON payloads, URLs, email (MIME), HTTP headers. You meet it most often in JWT tokens, data: URIs for inline images, Kubernetes Secrets, and API payloads carrying files. It's a transport format, not a storage or security format.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!