Base64 คือวิธีการแสดงข้อมูลไบนารีใด ๆ ให้เป็นข้อความที่ประกอบด้วยตัวอักษร ตัวเลข และสัญลักษณ์ +, /, = เท่านั้น มันไม่ได้บีบอัดหรือเข้ารหัสลับข้อมูล — ผลลัพธ์จะมีขนาดใหญ่ขึ้นประมาณหนึ่งในสาม และใครก็ตามที่รู้อัลกอริทึมสามารถอ่านเนื้อหาต้นฉบับได้
การเข้ารหัสทำงานอย่างไร
ไบต์ที่ป้อนเข้ามาจะถูกจัดกลุ่มทีละสามไบต์ (24 บิต) และแบ่งเป็นสี่บล็อกบล็อกละหกบิต แต่ละบล็อกจะสอดคล้องกับตัวอักษรหนึ่งตัวจากชุดตัวอักษร Base64 (A–Z, a–z, 0–9, +, /) หากความยาวของข้อมูลที่ป้อนเข้ามาไม่ใช่จำนวนเท่าของสามไบต์ จะมีการเติมอักขระ = ไว้ท้ายสุด
เหตุใดจึงจำเป็น
โปรโตคอลและรูปแบบจำนวนมาก — อีเมล (MIME), URL, JSON, XML — ถูกออกแบบมาสำหรับข้อความและไม่สามารถจัดการไบต์ "ดิบ" ได้อย่างน่าเชื่อถือ เช่น ไบต์ศูนย์ อักขระควบคุม หรือลำดับที่ขัดแย้งกับไวยากรณ์ของรูปแบบเอง Base64 หลีกเลี่ยงข้อจำกัดนี้โดยเปลี่ยนข้อมูลไบนารีใด ๆ ให้เป็นข้อความที่ปลอดภัย
กรณีการใช้งานทั่วไป
- ไฟล์แนบอีเมลผ่าน MIME
- ส่งรูปภาพหรือไฟล์ขนาดเล็กใน JSON API
- เก็บข้อมูลไบนารีในฟิลด์ข้อความของฐานข้อมูลหรือไฟล์คอนฟิก
- เข้ารหัสส่วน header และ payload ของ JWT
สิ่งที่ Base64 ไม่ใช่
มันไม่ใช่การเข้ารหัสลับหรือการแฮช ใครก็ตามสามารถถอดรหัสสตริง Base64 กลับเป็นข้อมูลต้นฉบับได้โดยไม่ต้องใช้คีย์หรือรหัสผ่าน — มันเป็นเพียงรูปแบบการแสดงผล ไม่ใช่มาตรการด้านความปลอดภัย
ชุดอักขระมาตรฐานกับ URL-safe
ชุดอักขระ Base64 แบบคลาสสิกใช้สัญลักษณ์ + และ / ซึ่งมีความหมายพิเศษใน URL และชื่อไฟล์ สำหรับกรณีเหล่านี้จึงมีตัวแปร Base64URL ที่แทน + ด้วย - และแทน / ด้วย _ หากนำผลลัพธ์จากการเข้ารหัสแบบมาตรฐานไปใส่ใน URL โดยไม่ทำ percent-encoding เพิ่มเติม สัญลักษณ์ + และ / อาจทำให้ที่อยู่ผิดเพี้ยนหรือขัดแย้งกับตัวคั่นของเส้นทาง
ข้อผิดพลาดที่พบบ่อย: padding ถูกตัดหรือ "เสีย"
อักขระ = ที่ท้ายสตริงไม่ใช่ขยะ แต่เป็นส่วนหนึ่งของการเข้ารหัสที่บอกว่าบล็อกสุดท้ายขาดไบต์ไปกี่ไบต์ หากคัดลอกสตริง Base64 มาไม่ครบหรือลบ padding ออกเองด้วยมือ ตัวถอดรหัสจะแจ้งข้อผิดพลาดหรือคืนผลลัพธ์ที่ไม่สมบูรณ์ ระบบบางระบบ (เช่น JWT) ตั้งใจตัด = ทิ้ง ซึ่งในกรณีนั้นต้องคืนความยาวให้ถูกต้องก่อนถอดรหัส