פיתוח · 3 דקות קריאה ·

Base64 בהסבר פשוט: למה הוא משמש, ולמה הוא לא הצפנה

Base64 מופיע במיילים, ב-data URI, בכותרות API וב-JWT. איך הוא עובד, למה הוא מגדיל נתונים בשליש, ולמה הוא אף פעם לא מסתיר כלום.

Base64 נמצא בכל מקום בתוכנה: בקבצים מצורפים למייל, בתמונות שמוטמעות ב-CSS, בכותרת Authorization של HTTP Basic auth ובחלקים של JWT. יש לו תפקיד אחד: לכתוב כל מידע, כולל בתים בינאריים, בעזרת תווי טקסט בטוחים בלבד.

איך זה עובד

Base64 לוקח את המידע שלושה בתים (24 ביט) בכל פעם ומחלק אותם לארבע קבוצות של 6 ביט. כל קבוצה היא מספר בין 0 ל-63 שממופה לאחד מ-64 תווים: A-Z, ‏a-z, ‏0-9, ‏+ ו-/. כשהקלט לא מתחלק לשלשות, סימני = משלימים את הסוף.

טקסט    M        a        n
בתים    01001101 01100001 01101110
6 ביט   010011 010110 000101 101110
Base64  T      W      F      u       →  TWFu

למה הוא קיים

הרבה מערכות ישנות, ובראשן המייל, נבנו לטקסט ויכלו לשבש בתים שרירותיים. Base64 הופך כל דבר לתווים רגילים שעוברים בערוצים האלה בלי שינוי. המחיר הוא גודל: כל 3 בתים הופכים ל-4 תווים, ולכן המידע המקודד גדול בכ-33%.

זו לא הצפנה

אין מפתח. כל אחד יכול לפענח Base64 מיד, ולכן הוא לא מסתיר כלום. סיסמה בכותרת Basic auth ‏(⁦dXNlcjpwYXNz⁩ הוא פשוט ⁦user:pass⁩) חשופה בדיוק כמו טקסט רגיל. הגנו על סודות עם HTTPS והצפנה אמיתית, ולעולם אל תתייחסו ל-Base64 כאמצעי אבטחה.

גרסאות שתפגשו

Base64url מחליף את + ו-/ ב-- וב-_ ובדרך כלל משמיט את הריפוד, כך שהתוצאה בטוחה בכתובות URL ובשמות קבצים; JWT משתמש בו. data URI מכניס מידע מקודד ישירות לקוד, כמו ⁦data:image/png;base64,iVBOR…⁩, וזה חוסך בקשה לתמונות זעירות אבל מכביד על גדולות.

הגודל במספרים

האורך המקודד הוא 4 × ceil(n / 3) תווים עבור n בתים, כך שהתוספת היא כ-33%, ועוד מעברי שורה אם המקודד מוסיף אותם.

תמונה של 100KB    →  כ-133KB של Base64
קובץ מצורף של 1MB →  כ-1.33MB (ועוד מעברי שורה במייל)

למה הפענוח נכשל

  • ריפוד חסר: מערכות מסוימות משמיטות את סימני ה-= בסוף, ומפענחים קפדניים דוחים את הקלט. הוסיפו = עד שהאורך מתחלק ב-4.
  • האלפבית הלא נכון: Base64url משתמש ב-- וב-_ במקום ב-+ וב-/. פענחו אותו במפענח Base64url, או החליפו קודם את התווים בחזרה.
  • מעברי שורה ורווחים: מייל (MIME) שובר Base64 כל 76 תווים. רוב המפענחים מתעלמים מהשבירות, אבל לא כולם.
  • טקסט בקידוד הלא נכון: פענוח מחזיר בתים. אם הם היו טקסט UTF-8 אבל נקראים כ-Latin-1, אותיות מוטעמות ועברית הופכות לג׳יבריש.

המלכודת של btoa ב-JavaScript

הפונקציה המובנית btoa() בדפדפן מקבלת רק תווים מ-Latin-1, וזורקת שגיאה על עברית, סינית או אימוג׳י. קודדו קודם את הטקסט לבתים של UTF-8, למשל עם TextEncoder, ורק אז ל-Base64.

מתי להשתמש בו, ומתי לא

Base64 הוא הכלי הנכון כשמידע בינארי צריך לעבור בערוץ שנבנה לטקסט: מטעני JSON ו-XML, מייל, Data URI וכותרות HTTP. הוא הכלי הלא נכון להסתרת מידע, לכיווץ (הוא תמיד מגדיל) ולשמירת קבצים גדולים במסד נתונים, שבו עמודה בינארית או אחסון אובייקטים קטנים ומהירים יותר. אם הצד המקבל מקבל בתים גולמיים, שלחו בתים גולמיים.

נסו בעצמכם

מקודד ה-Base64 של 4Dev ממיר טקסט ל-Base64 תוך כדי הקלדה. הוא משתמש ב-UTF-8, כך שעברית, אותיות עם סימנים, אימוג'י וכל טקסט אחר מקודדים נכון. לכיוון ההפוך יש את מפענח ה-Base64.

למקודד ה-Base64

LinkedInXFacebook