Base64 แบบมาตรฐาน
Base64 แบบมาตรฐานตาม RFC 4648 ใช้อักขระ 64 ตัวประกอบด้วยตัวอักษร A-Z, a-z, ตัวเลข 0-9 และเครื่องหมาย + กับ / พร้อมเครื่องหมาย = สำหรับ padding เป็นฟอร์แมตดั้งเดิมที่ใช้กันแพร่หลายที่สุด ทั้งในไฟล์แนบอีเมลและระบบเกือบทั้งหมด
จุดเด่นคือเครื่องมือทุกตัวรองรับโดยไม่มีข้อยกเว้น แต่ข้อจำกัดคืออักขระ + และ / มีความหมายพิเศษใน URL ถ้านำรหัสมาตรฐานไปใส่ใน URL ตรงๆ อาจถูกตีความผิด จึงเกิดฟอร์แมต URL-safe ขึ้นมาเพื่อแก้ปัญหานี้โดยเฉพาะ
Base64 แบบ URL-safe
Base64 แบบ URL-safe เปลี่ยนอักขระ + เป็นขีด - และ / เป็นขีดล่าง _ เพื่อให้รหัสอยู่ใน URL หรือชื่อไฟล์ได้อย่างปลอดภัยโดยไม่ต้องเข้ารหัสเพิ่ม นิยมใช้ใน JWT token และพารามิเตอร์ของ API สมัยใหม่
ข้อสังเกตคือ URL-safe มักตัดเครื่องหมาย = ท้ายรหัสออกด้วยเพราะไม่จำเป็นต่อการถอดรหัสในหลายกรณี ถ้าเจอรหัสที่ไม่มี = แต่มี - กับ _ ปนอยู่ ให้สันนิษฐานไว้ก่อนว่าเป็นแบบ URL-safe แล้วใช้เครื่องมือที่รองรับ
padding บอกอะไรเราได้บ้าง
padding หรือเครื่องหมาย = ท้ายรหัสมีหน้าที่เติมให้รหัสมีความยาวครบตามมาตรฐาน อาจมีหนึ่งหรือสองตัวหรือไม่มีเลยก็ได้ขึ้นอยู่กับขนาดข้อมูลต้นฉบับ ถือเป็นส่วนหนึ่งของรหัสที่ถูกต้อง ไม่ใช่สัญลักษณ์ตกค้าง
วิธีตรวจสอบรหัสง่ายๆ คือดูว่าความยาวทั้งหมดหารด้วย 4 ลงตัวหรือไม่ ถ้าลงตัวแสดงว่าโครงสร้างถูกต้อง ถ้าเจอรหัสที่ความยาวไม่ลงตัว ให้สงสัยไว้ก่อนว่าอาจคัดลอกมาไม่ครบ
การขึ้นบรรทัดใหม่แบบ MIME
ตามมาตรฐานอีเมล MIME รหัส Base64 จะถูกตัดขึ้นบรรทัดใหม่ทุกๆ 76 ตัวอักษร เพื่อให้สอดคล้องกับข้อจำกัดความยาวบรรทัดของระบบอีเมลยุคเก่า รหัสที่ได้จากไฟล์แนบอีเมลจึงมักมีหลายบรรทัด ไม่ใช่บรรทัดเดียวยาวๆ
เครื่องมือถอดรหัสส่วนใหญ่จัดการกับการขึ้นบรรทัดได้โดยอัตโนมัติ แต่ถ้าต้องนำรหัสไปใช้ในช่องที่รับบรรทัดเดียว เช่น ฟิลด์ในฐานข้อมูลหรือพารามิเตอร์บางชนิด ควรลบการขึ้นบรรทัดออกให้เหลือบรรทัดเดียวก่อน
สรุปวิธีเลือกฟอร์แมตให้ถูก
จำง่ายๆ ว่างานทั่วไปใช้แบบมาตรฐาน งานที่เกี่ยวกับ URL หรือ JWT ใช้แบบ URL-safe ถ้าเจอรหัสที่มี - กับ _ ให้รู้ทันทีว่าเป็น URL-safe และถ้ารหัสลงท้ายด้วย = แสดงว่าเป็นมาตรฐาน
เมื่อต้องแปลงระหว่างสองแบบด้วยตัวเอง จำสูตรว่า + กลายเป็น - และ / กลายเป็น _ พร้อมตัด = ท้ายออก สูตรนี้ใช้ได้ทุกครั้งไม่ต้องเปิดตารางเทียบ
คำถามที่พบบ่อย
จะรู้ได้อย่างไรว่ารหัสที่ใช้เป็นแบบมาตรฐานหรือ URL-safe
ดูจากอักขระในรหัส ถ้ามี + / หรือ = แสดงว่าเป็นแบบมาตรฐาน ถ้ามี - หรือ _ แทนและไม่มี = ท้าย แสดงว่าเป็นแบบ URL-safe
แปลง Base64 มาตรฐานให้เป็น URL-safe เองได้หรือไม่
ได้โดยแทนที่ + ด้วย - และ / ด้วย _ แล้วลบ = ท้ายออก แต่ต้องแน่ใจว่าปลายทางรองรับ URL-safe ไม่เช่นนั้นอาจถอดรหัสไม่ได้
ทำไม JWT token ถึงไม่มีเครื่องหมาย =
เพราะ JWT ใช้ Base64 แบบ URL-safe ที่ตัด padding ออกโดยตั้งใจ เป็นไปตามมาตรฐานของ JWT โดยเฉพาะ ไม่ใช่รหัสที่ผิดปกติ
รหัสที่มีการขึ้นบรรทัดหลายบรรทัดถอดรหัสได้ปกติหรือไม่
ได้ปกติ เครื่องมือถอดรหัสทั่วไปจะข้ามการขึ้นบรรทัดไปเอง แต่ถ้านำไปใช้ในระบบที่รับบรรทัดเดียวควรลบออกก่อน