·อ่าน 7 นาที

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 ทำงานเป็นขั้นตอนดังนี้:

  1. อ่านข้อมูล input เป็น stream of bytes byte ละ 8 bits
  2. จัดกลุ่ม bits เป็นชุดละ 6 bits
  3. นำแต่ละกลุ่ม 6 bits ไป map กับตัวอักษรใน Base64 alphabet
  4. เพิ่ม padding ด้วย = หากความยาว input หารด้วย 3 ไม่ลงตัว

แนวคิดสำคัญคือ input 3 bytes จะกลายเป็น Base64 4 ตัวอักษร นี่คือเหตุผลที่ Base64 ทำให้ขนาดข้อมูลเพิ่มขึ้นประมาณ 33%

ชุดตัวอักษรของ Base64

Base64 มาตรฐานประกอบด้วยตัวอักษร 64 ตัว:

ช่วงตัวอักษรค่า
ตัวพิมพ์ใหญ่A-Z0-25
ตัวพิมพ์เล็กa-z26-51
ตัวเลข0-952-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 byte1=="H" -> "SA=="
เหลือ 2 bytes2="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

แหล่งอ้างอิง

  1. Josefsson, S. (2006). The Base16, Base32, and Base64 Data Encodings. RFC 4648, IETF. https://datatracker.ietf.org/doc/html/rfc4648
  2. 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
  3. Mozilla Developer Network. btoa() global function. https://developer.mozilla.org/en-US/docs/Web/API/btoa
  4. Mozilla Developer Network. Data URLs. https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
  5. Python Software Foundation. base64 - Base16, Base32, Base64, Base85 Data Encodings. https://docs.python.org/3/library/base64.html
USTHJP