Base64 คืออะไร? อธิบาย Encoding แบบเข้าใจง่าย
Base64 เป็นวิธี encoding ที่ใช้แพร่หลายมากบนเว็บ หากคุณเคยเห็นข้อความยาว ๆ ที่มีตัวอักษรและตัวเลขใน URL, อีเมล หรือไฟล์ CSS มีโอกาสสูงว่านั่นคือ Base64 บทความนี้อธิบายว่ามันทำงานอย่างไรและสำคัญอย่างไร
สารบัญ
Base64 คืออะไร?
Base64 คือวิธีเข้ารหัสแบบ binary-to-text ที่แทนข้อมูล binary ด้วย ตัวอักษร ASCII ที่พิมพ์ได้ 64 ตัว มันแปลงรูปภาพ ไฟล์ หรือ raw bytes ให้เป็นข้อความที่ส่งผ่านระบบ text-based ได้อย่างปลอดภัย
ชื่อ Base64 มาจากการใช้ ตัวอักษร 64 ตัว เพื่อแทนข้อมูล โดยแต่ละตัวอักษรแทนข้อมูล 6 bits เพราะ 2^6 = 64
Base64 ถูกนิยามใน RFC 4648 และพบได้ในอีเมล, data URIs, APIs, JWT tokens, certificates และรูปแบบข้อมูลบนเว็บอีกมากมาย
ทำไมต้องมี Base64?
หลายระบบถูกออกแบบมาให้รองรับ ข้อความเท่านั้น ไม่ใช่ข้อมูล binary ตรง ๆ เช่น:
- Email (SMTP) - เดิมรองรับข้อความ ASCII 7-bit จึงต้อง encode ไฟล์แนบ binary ก่อน
- JSON - ไม่มีชนิดข้อมูล binary โดยตรง จึงมักเก็บ bytes เป็น string
- URLs - รองรับเฉพาะบางตัวอักษรที่ปลอดภัยต่อโครงสร้าง URL
- HTML/CSS - เป็นรูปแบบข้อความ หากฝัง asset ต้องแทนเป็นข้อความ
Base64 แก้ปัญหานี้ด้วยการแปลงข้อมูล binary เป็น ข้อความที่ปลอดภัยต่อการส่งผ่าน โดยไม่เสียหายหรือตีความผิด
Base64 Encoding ทำงานอย่างไร
กระบวนการ encoding ทำงานเป็นขั้นตอนดังนี้:
- อ่านข้อมูล input เป็น stream of bytes byte ละ 8 bits
- จัดกลุ่ม bits เป็นชุดละ 6 bits
- นำแต่ละกลุ่ม 6 bits ไป map กับตัวอักษรใน Base64 alphabet
- เพิ่ม padding ด้วย
=หากความยาว input หารด้วย 3 ไม่ลงตัว
แนวคิดสำคัญคือ input 3 bytes จะกลายเป็น Base64 4 ตัวอักษร นี่คือเหตุผลที่ Base64 ทำให้ขนาดข้อมูลเพิ่มขึ้นประมาณ 33%
ชุดตัวอักษรของ Base64
Base64 มาตรฐานประกอบด้วยตัวอักษร 64 ตัว:
| ช่วง | ตัวอักษร | ค่า |
|---|---|---|
| ตัวพิมพ์ใหญ่ | A-Z | 0-25 |
| ตัวพิมพ์เล็ก | a-z | 26-51 |
| ตัวเลข | 0-9 | 52-61 |
| พิเศษ | + และ / | 62-63 |
| Padding | = | ใช้จัด alignment |
ยังมีรูปแบบ URL-safe ที่แทน + ด้วย - และแทน / ด้วย _
ตัวอย่างการ Encode ทีละขั้นตอน
ลอง encode string Hi! เป็น Base64:
Step 1: Convert to ASCII values
H = 72, i = 105, ! = 33
Step 2: Convert to binary (8 bits each)
01001000 01101001 00100001
Step 3: Regroup into 6-bit chunks
010010 000110 100100 100001
Step 4: Convert to decimal
18 6 36 33
Step 5: Map to Base64 alphabet
S G k h
Result: "Hi!" -> "SGkh"เพราะ Hi! มีขนาดพอดี 3 bytes จึงแปลงเป็น Base64 4 ตัวอักษรได้โดยไม่ต้องเติม padding
ทำความเข้าใจ Padding (=)
Base64 ทำงานเป็นกลุ่ม 3 bytes ไปเป็น 4 ตัวอักษร หาก input หารด้วย 3 ไม่ลงตัว จะต้องเติม padding:
| จำนวน input bytes | เศษ | Padding | ตัวอย่าง |
|---|---|---|---|
| หารด้วย 3 ลงตัว | 0 | ไม่มี | "Hi!" -> "SGkh" |
| เหลือ 1 byte | 1 | == | "H" -> "SA==" |
| เหลือ 2 bytes | 2 | = | "Hi" -> "SGk=" |
padding = ทำให้ output มีความยาวเป็นจำนวนเท่าของ 4 ตัวอักษร จึง decode ได้ง่ายและแน่นอน
การใช้งาน Base64 ที่พบบ่อย
Base64 ถูกใช้บ่อยมากในการพัฒนาซอฟต์แวร์สมัยใหม่:
- Data URIs - ฝังรูปภาพขนาดเล็กใน HTML หรือ CSS โดยตรง
- Email attachments (MIME) - encode ไฟล์ binary ก่อนแนบไปกับอีเมล
- JWT tokens - ใช้ Base64URL encoding สำหรับ header และ payload
- API authentication - HTTP Basic auth ส่ง credentials ในรูป Base64 text
- เก็บ binary ใน JSON/XML - certificates, keys และ binary blobs สามารถแทนเป็นข้อความได้
- Source maps - JavaScript source maps ใช้การ mapping แบบ Base64-style VLQ
Base64 ในโค้ด
ภาษาโปรแกรมส่วนใหญ่รองรับ Base64 ในตัว ตัวอย่างเช่น:
JavaScript
// Encode
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="
// Decode
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"Python
import base64
# Encode
encoded = base64.b64encode(b"Hello, World!")
print(encoded) # b'SGVsbG8sIFdvcmxkIQ=='
# Decode
decoded = base64.b64decode(encoded)
print(decoded) # b'Hello, World!'Command Line
# Encode (Linux/macOS)
echo -n "Hello, World!" | base64
# SGVsbG8sIFdvcmxkIQ==
# Decode
echo "SGVsbG8sIFdvcmxkIQ==" | base64 --decode
# Hello, World!ความเข้าใจผิดที่พบบ่อย
มีหลายเรื่องเกี่ยวกับ Base64 ที่คนมักเข้าใจผิด:
✕ "Base64 คือ encryption"
Base64 ไม่ใช่ encryption ใคร ๆ ก็ decode ได้ทันที ห้ามใช้เพื่อซ่อนข้อมูลสำคัญ
✕ "Base64 บีบอัดข้อมูล"
Base64 ทำให้ข้อมูล ใหญ่ขึ้น ประมาณ 33% เป็น encoding ไม่ใช่ compression
✕ "Base64 ใช้เฉพาะรูปภาพ"
data URI สำหรับรูปภาพพบได้บ่อย แต่ Base64 ใช้แทน binary data ได้ทุกชนิด เช่น ไฟล์ certificates และ tokens
เมื่อไรไม่ควรใช้ Base64
Base64 มีประโยชน์ แต่ไม่ใช่ตัวเลือกที่เหมาะเสมอไป:
- ไฟล์ขนาดใหญ่ - ขนาดที่เพิ่มขึ้น 33% สะสมเป็นภาระได้เร็ว
- ความปลอดภัย - ใช้ encryption จริงสำหรับข้อมูลสำคัญ ไม่ใช่ Base64
- ระบบที่ต้องการ performance สูง - encode/decode มีต้นทุน CPU
- รูปภาพขนาดใหญ่บนเว็บ - แยกเป็นไฟล์รูปภาพมักดีกว่า เพราะ browser cache ได้อิสระ
หลักง่าย ๆ คือ ใช้ Base64 เมื่อคุณ จำเป็น ต้องส่ง binary ผ่านช่องทางที่รองรับเฉพาะข้อความ หากส่ง binary ตรง ๆ ได้ ให้เลือกส่ง binary โดยตรง
Encode และ Decode Base64 ได้ทันที
ใช้เครื่องมือ Base64 Encoder/Decoder ฟรีของเราเพื่อ encode ข้อความเป็น Base64 หรือ decode Base64 strings ได้ในเบราว์เซอร์
ลองใช้ Base64 Encoder/Decoderแหล่งอ้างอิง
- Josefsson, S. (2006). The Base16, Base32, and Base64 Data Encodings. RFC 4648, IETF. https://datatracker.ietf.org/doc/html/rfc4648
- Freed, N. & Borenstein, N. (1996). Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. RFC 2045, IETF. https://datatracker.ietf.org/doc/html/rfc2045
- Mozilla Developer Network. btoa() global function. https://developer.mozilla.org/en-US/docs/Web/API/btoa
- Mozilla Developer Network. Data URLs. https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
- Python Software Foundation. base64 - Base16, Base32, Base64, Base85 Data Encodings. https://docs.python.org/3/library/base64.html