คำถามที่พบบ่อย ตัวเข้ารหัส / ถอดรหัส Base64
Q: Base64 คืออะไรและใช้ทำอะไร?
A: Base64 เป็นรูปแบบการเข้ารหัสจากไบนารีเป็นข้อความ (binary-to-text) ที่แปลงข้อมูลไบนารีให้เป็นสตริง ASCII โดยใช้ชุดอักขระ 64 ตัว (A-Z, a-z, 0-9, +, /) โดยหลักแล้วใช้เพื่อส่งข้อมูลไบนารีผ่านโปรโตคอลที่ใช้ข้อความเป็นหลัก เช่น HTTP, SMTP หรือใน payload ของ JSON การใช้งานทั่วไปได้แก่ ไฟล์แนบอีเมลผ่าน MIME, การฝังรูปภาพใน HTML และ CSS เป็น data URL, การเข้ารหัส payload ใน JSON Web Tokens (JWT) และการจัดเก็บข้อมูลไบนารีในคอลัมน์ฐานข้อมูลที่ใช้ข้อความ
Q: Base64 เป็นการเข้ารหัสลับ (encryption) หรือไม่? ปลอดภัยหรือไม่?
A: ไม่ใช่ Base64 เป็นรูปแบบการเข้ารหัส (encoding) ไม่ใช่การเข้ารหัสลับ (encryption) ใครก็ตามที่มีสตริงที่เข้ารหัสแบบ Base64 สามารถถอดรหัสกลับเป็นข้อมูลต้นฉบับได้ทันทีโดยไม่ต้องใช้กุญแจ รหัสผ่าน หรือความลับใดๆ มันไม่มีการรักษาความลับ ความสมบูรณ์ หรือการยืนยันตัวตนใดๆ ลองคิดว่ามันเป็นวิธีการแสดงข้อมูลเดียวกันในรูปแบบที่แตกต่าง — เหมือนกับการแปลภาษาอังกฤษเป็นรหัสมอร์ส หากคุณต้องการปกป้องข้อมูลที่ละเอียดอ่อน ให้ใช้อัลกอริทึมการเข้ารหัสลับที่เหมาะสม (เช่น AES) ก่อน แล้วจึงเข้ารหัสไบต์ที่เข้ารหัสแล้วด้วย Base64 เพื่อการส่งผ่านข้อมูล (เป็นทางเลือก)
Q: ทำไมบางครั้ง Base64 ลงท้ายด้วยเครื่องหมาย = หรือ == ?
A: อักขระ = คือการเติม padding (padding) Base64 ประมวลผลข้อมูลอินพุตเป็นกลุ่มละ 3 ไบต์ (24 บิต) สร้างอักขระ Base64 จำนวน 4 ตัวต่อกลุ่ม เมื่อความยาวของอินพุตไม่ใช่จำนวนเท่าของ 3 ไบต์ การเข้ารหัสจะเพิ่มอักขระ padding = เพื่อให้ผลลัพธ์เป็นจำนวนเท่าของ 4 อักขระ เพิ่ม = หนึ่งตัวเมื่อเหลือ 2 ไบต์ และเพิ่ม = สองตัวเมื่อเหลือเพียง 1 ไบต์ ตัวอย่างเช่น "Man" (3 ไบต์) เข้ารหัสเป็น "TWFu" โดยไม่มี padding แต่ "Ma" (2 ไบต์) เข้ารหัสเป็น "TWE=" และ "M" (1 ไบต์) เข้ารหัสเป็น "TQ=="
Q: Base64 ทำให้ข้อมูลใหญ่ขึ้นหรือไม่? เพิ่มขนาดข้อมูลเท่าไหร่?
A: ใช่ การเข้ารหัส Base64 เพิ่มขนาดข้อมูลประมาณ 33% สำหรับทุกๆ 3 ไบต์ของอินพุตไบนารี ผลลัพธ์คือ 4 ไบต์ รวมถึง padding ที่เป็นทางเลือก ดังนั้นไฟล์ไบนารีขนาด 3 MB จะกลายเป็นประมาณ 4 MB เมื่อเข้ารหัสด้วย Base64 นี่คือข้อแลกเปลี่ยนสำหรับความสามารถในการส่งข้อมูลไบนารีผ่านช่องทางที่ใช้ข้อความเท่านั้น เมื่อเทียบกับการเข้ารหัสไบนารีเป็นข้อความแบบอื่น Base64 ค่อนข้างมีประสิทธิภาพ — ตัวอย่างเช่น การเข้ารหัสเลขฐานสิบหก (hexadecimal) เพิ่มขนาดข้อมูล 100%
Q: ความแตกต่างระหว่าง Base64 มาตรฐานกับ Base64url คืออะไร?
A: Base64 มาตรฐานใช้ + และ / ในชุดอักขระ และใช้ = สำหรับ padding Base64url (Base64 ที่ปลอดภัยสำหรับ URL) แทนที่ + ด้วย - และ / ด้วย _ และมักจะละ padding ไว้ วิธีนี้ทำให้ Base64url ปลอดภัยสำหรับใช้ใน URL, พารามิเตอร์ query และชื่อไฟล์ โดยไม่ต้องเข้ารหัสเปอร์เซ็นต์เพิ่มเติม Base64url ถูกกำหนดใน RFC 4648 และใช้กันอย่างแพร่หลายใน JSON Web Tokens (JWT), โทเค็น OAuth และ Web API ตัวอย่างเช่น สตริง Base64 มาตรฐานอย่าง Pj4+Pz8/Pw== จะกลายเป็น Pj4-Pz8_Pw ใน Base64url
Q: Base64 data URL คืออะไรและใช้ใน HTML และ CSS อย่างไร?
A: Data URL เป็นรูปแบบ URI ที่ฝังข้อมูลโดยตรงในเอกสารเว็บ สำหรับรูปภาพ รูปแบบคือ data:image/png;base64,iVBORw0KGgo... สามารถใช้แทน URL ไฟล์ในแท็ก <img> ของ HTML และพร็อพเพอร์ตี้ background-image ของ CSS Data URL ขจัดความจำเป็นในการร้องขอ HTTP แยกต่างหากเพื่อโหลดรูปภาพ ซึ่งสามารถปรับปรุงประสิทธิภาพสำหรับ assets ขนาดเล็ก (โดยทั่วไปต่ำกว่า 10 KB) อย่างไรก็ตาม มันเพิ่มขนาดไฟล์ HTML/CSS ประมาณ 33% และป้องกันไม่ให้เบราว์เซอร์แคชรูปภาพแยกต่างหาก
Q: สามารถแปลงไฟล์ใดๆ เป็น Base64 ได้หรือไม่?
A: ได้ — ข้อมูลไบนารีใดๆ ไม่ว่าจะเป็นข้อความ รูปภาพ เสียง วิดีโอ PDF หรือไฟล์บีบอัด สามารถเข้ารหัสเป็น Base64 ได้ กระบวนการเหมือนกัน: อ่านไบต์ดิบของไฟล์และใช้อัลกอริทึมการเข้ารหัส Base64 เมื่อคุณถอดรหัสสตริง Base64 คุณจะได้ไบต์ต้นฉบับที่ตรงกันทุกประการ นี่คือวิธีการทำงานของไฟล์แนบอีเมล — ไฟล์ไบนารีถูกเข้ารหัสด้วย Base64 ก่อนส่งผ่าน SMTP และถอดรหัสกลับเป็นไฟล์ต้นฉบับที่ปลายทางผู้รับ
Q: จะจัดการกับอักขระ Unicode (เช่น อีโมจิหรือข้อความภาษาจีน) เมื่อเข้ารหัส Base64 ใน JavaScript ได้อย่างไร?
A: ฟังก์ชัน btoa() ในตัวทำงานได้เฉพาะกับอักขระ Latin-1 (อักขระไบต์เดียว) เท่านั้น สำหรับสตริง Unicode ที่มีอีโมจิ อักขระภาษาจีน หรืออักขระหลายไบต์อื่นๆ คุณต้องแปลงเป็นไบต์ก่อนโดยใช้ TextEncoder API:
function unicodeToBase64(str) {
const bytes = new TextEncoder().encode(str);
const binaryString = String.fromCharCode(...bytes);
return btoa(binaryString);
}
function base64ToUnicode(base64) {
const binaryString = atob(base64);
const bytes = Uint8Array.from(binaryString, c => c.charCodeAt(0));
return new TextDecoder().decode(bytes);
}
ใน Node.js คลาส Buffer จัดการ Unicode โดยตรง: Buffer.from('Hello 你好 🚀').toString('base64') ทำงานได้โดยไม่ต้องจัดการพิเศษใดๆ