Base64 คืออะไร ทำไมข้อมูลใหญ่ขึ้น และถอดรหัสอย่างไร
Base64 เขียนข้อมูลไบนารีเป็นข้อความธรรมดาโดยใช้อักขระ 64 ตัว ได้แก่ A ถึง Z, a ถึง z, 0 ถึง 9 และ + กับ / ทุกไบต์สามตัวจะกลายเป็นอักขระสี่ตัว ดังนั้นข้อความจึงยาวกว่าข้อมูลที่บรรจุอยู่ราวหนึ่งในสาม ผู้คนใช้วิธีนี้เมื่อรูปแบบนั้นรับเฉพาะข้อความ เช่น data URL ในหน้าเว็บ ฟิลด์ใน JSON หรือไฟล์แนบอีเมล
ทำไมรูปแบบข้อความถึงต้องใช้วิธีนี้
หลายรูปแบบถูกออกแบบมาสำหรับข้อความเท่านั้น เนื้อหาอีเมล ไฟล์ JSON และไฟล์ CSS เก็บตัวอักษรและสัญลักษณ์ได้อย่างปลอดภัย แต่รูปภาพดิบหรือไฟล์ zip มีค่าไบต์ที่บางระบบอาจเปลี่ยนแปลง ตัดทอน หรืออ่านเป็นรหัสควบคุม Base64 ใช้เฉพาะอักขระที่ทุกระบบข้อความส่งต่อโดยไม่เปลี่ยนแปลง ข้อมูลจึงถึงปลายทางครบถ้วน วิธีนี้กำหนดไว้ใน RFC 4648
Base64 เป็นการเข้ารหัสที่ไม่ได้ทำให้ข้อมูลเป็นความลับ ใครก็ถอดรหัสได้โดยไม่ต้องใช้กุญแจ จึงห้ามใช้เพื่อซ่อนรหัสผ่านหรือข้อมูลส่วนตัวเด็ดขาด
ไบต์สามตัวกลายเป็นอักขระสี่ตัวได้อย่างไร
ยกตัวอย่างคำว่า Man ซึ่งมีสามไบต์ ได้แก่ 77, 97 และ 110 ในฐานสิบ ทั้งสามไบต์รวมกันได้ 24 บิต เมื่อตัดบิตทั้ง 24 ออกเป็นสี่กลุ่มละ 6 บิต แต่ละกลุ่มจะเป็นตัวเลขตั้งแต่ 0 ถึง 63 ซึ่งชี้ไปยังอักขระหนึ่งตัวในตัวอักษร Man จึงกลายเป็น TWFu
หกบิตระบุได้เพียง 64 ค่า อักขระสี่ตัวจึงบรรจุข้อมูลสามไบต์ ผลลัพธ์จึงใหญ่กว่าอินพุตราวหนึ่งในสาม ก่อนที่จะเพิ่มการขึ้นบรรทัดใหม่
เมื่อข้อมูลแบ่งเป็นกลุ่มสามไบต์ไม่ลงตัว ตัวเข้ารหัสจะเติมเครื่องหมาย = ไว้ท้ายข้อความ ตัวอย่างเช่น Ma ซึ่งมีสองไบต์ กลายเป็น TWE= และ M ซึ่งมีหนึ่งไบต์ กลายเป็น TQ== เครื่องหมาย padding บอกตัวถอดรหัสว่ากลุ่มสุดท้ายมีกี่ไบต์
ต้องแปลงข้อความเป็น UTF-8 ก่อน
Base64 ทำงานกับไบต์ ส่วนข้อความประกอบด้วยอักขระ อักขระอย่าง é หรือ ✓ ถูกเก็บเป็นมากกว่าหนึ่งไบต์ในรูปแบบ UTF-8 ซึ่งเป็นการเข้ารหัสที่ใช้กันทั่วเว็บ ฟังก์ชัน btoa() ของเบราว์เซอร์รับสตริงและถือว่าแต่ละอักขระคือหนึ่งไบต์ จึงล้มเหลวกับอักขระที่เกินช่วงอักษรละตินพื้นฐาน เมื่อเรียกกับเครื่องหมายถูก จะเกิด InvalidCharacterError
วิธีแก้คือแปลงข้อความเป็นไบต์ UTF-8 ก่อน แล้วค่อยเข้ารหัสไบต์เหล่านั้น วลี héllo ✓ มี 10 ไบต์ใน UTF-8 และ Base64 ของมันคือ aMOpbGxvIOKckw== เข้ารหัสและถอดรหัส Base64 จะทำขั้นตอนนี้ให้คุณ เมื่อถอดรหัส เครื่องมือจะอ่านไบต์กลับเป็น UTF-8 หากไบต์เหล่านั้นไม่ใช่ข้อความ UTF-8 ที่ถูกต้อง เครื่องมือจะถือว่าเป็นไฟล์และเสนอให้ดาวน์โหลด
Base64 แบบ URL-safe
Base64 มาตรฐานมี + และ / ใน URL เครื่องหมาย + อาจหมายถึงช่องว่าง และ / ใช้แบ่งส่วนของพาธ สตริง Base64 จึงทำให้ลิงก์เสียได้ รูปแบบ URL-safe (RFC 4648 หัวข้อ 5) ใช้ - และ _ แทน และมักตัด padding ด้วย = ใช้รูปแบบนี้เมื่อสตริงต้องใส่ใน URL ชื่อไฟล์ หรือโทเคน ตัวถอดรหัสยอมรับทั้งสองรูปแบบ ไม่ว่าจะมี padding หรือไม่ก็ตาม
หาก Base64 มาจากลิงก์ ให้ถอดรหัส URL ก่อน ค่าที่ถูกเข้ารหัสแบบเปอร์เซ็นต์ในลิงก์ต้องถูกถอดรหัสก่อน Base64 ของมันจึงจะอ่านได้ คู่มือการเข้ารหัสแบบเปอร์เซ็นต์ อธิบายกฎสำหรับลิงก์
กรณีที่พบบ่อยที่สุดคือโทเคนการเข้าสู่ระบบ JSON Web Token ประกอบด้วยสามส่วนแบบ Base64url คั่นด้วยจุด ได้แก่ ส่วนหัว (header) ข้อมูล และลายเซ็น ตัวถอดรหัส JWT จะแยกส่วนเหล่านั้นและแสดงส่วนหัวกับข้อมูลเป็น JSON ที่อ่านได้
Data URL และรูปภาพ
data URL ใส่ไฟล์ไว้ภายในลิงก์เอง รูปแบบคือ data: ตามด้วยประเภทสื่อ แล้วตามด้วย ;base64, จากนั้นเป็นจุลภาคและข้อมูล รูปภาพขนาดเล็กจะกลายเป็น data:image/png;base64 ตามด้วยไบต์ที่เข้ารหัสแล้ว หน้าเว็บและสไตล์ชีตรองรับรูปแบบนี้ ซึ่งช่วยประหยัดคำขอสำหรับไอคอนเล็กๆ
ข้อเสียคือขนาด ข้อมูลใหญ่ขึ้นราวหนึ่งในสาม และถูกส่งไปพร้อมกับหน้าเว็บหรือสไตล์ชีต แทนที่จะเป็นไฟล์แยกที่เบราว์เซอร์แคชได้ ใช้ data URL กับรูปเล็กๆ ไม่ใช่รูปถ่ายขนาดใหญ่ หากรูปมีขนาดใหญ่ ให้บีบอัดรูปภาพก่อนเข้ารหัส
เมื่อถอดรหัส Base64 ในเครื่องมือ เครื่องมือจะตรวจไบต์แรกๆ ของข้อมูล ไฟล์ PNG, JPEG, GIF และ WebP แต่ละไฟล์เริ่มต้นด้วยลายเซ็นที่รู้จัก ดังนั้นเครื่องมือจึงแสดงภาพตัวอย่างและเสนอให้ดาวน์โหลด data URL ที่มีประเภทรูปภาพก็จะแสดงเป็นรูปเช่นกัน
วิธีใช้งานกับ fixmint
- เลือก เข้ารหัส หรือ ถอดรหัส เหนือ ข้อความหรือ Base64 แล้ววางข้อความหรือ Base64 ของคุณ
- ทำเครื่องหมาย ตัวอักษรแบบ URL-safe ไม่มี = padding สำหรับโทเคน ชื่อไฟล์ และลิงก์ ตัวถอดรหัสรับทั้งสองรูปแบบอยู่แล้ว
- หากต้องการสร้าง data URL จากไฟล์ ให้ลากไฟล์ไปวางในพื้นที่วางไฟล์ แล้วทำเครื่องหมาย สำหรับไฟล์: ส่งออกเป็น data: URL
- คัดลอกผลลัพธ์ หากไบต์ที่ถอดรหัสแล้วเป็นไฟล์ ไม่ใช่ข้อความ ให้ใช้ปุ่มดาวน์โหลดที่เครื่องมือเสนอ
ข้อผิดพลาดที่พบบ่อยตอนถอดรหัส
- มีอักขระที่ไม่อนุญาต อินพุตมีอักขระที่อยู่นอกชุด 64 ตัว เช่น เครื่องหมายคำพูดจากประโยคที่คัดลอกมา ตรวจสอบว่าข้อความมาจากที่ใด เว้นวรรคกว้างศูนย์ (zero-width space) ในข้อความที่คัดลอกก็ทำให้เกิดข้อผิดพลาดแบบเดียวกัน ให้ลบอักขระที่มองไม่เห็นแล้วลองอีกครั้ง คู่มือเรื่องอักขระที่มองไม่เห็น อธิบายที่มาของอักขระเหล่านี้
- ความยาวไม่ถูกต้อง ขาดหรือเกินอักขระไปหนึ่งตัว ซึ่งมักหมายความว่าการคัดลอกถูกตัดไปครึ่งทาง
- การขึ้นบรรทัดใหม่และช่องว่าง อีเมล (MIME) ตัด Base64 ทุก 76 อักขระ ตัวถอดรหัสจะลบช่องว่างและการขึ้นบรรทัดใหม่ออก ดังนั้นคุณจึงวางข้อความที่ถูกตัดบรรทัดได้ตามที่เป็น
- ขาด padding บางระบบตัดเครื่องหมาย = ทิ้ง ตัวถอดรหัสจะเติมให้กลับ
กรณีพิเศษ
- ผลลัพธ์ที่ถอดรหัสแล้วดูไร้ความหมาย อาจเป็นไฟล์ ไม่ใช่ข้อความ ไฟล์ zip, PDF หรือโปรแกรมจะถอดรหัสเป็นไบต์ที่ไม่อ่านเป็นข้อความ เครื่องมือจะเสนอให้ดาวน์โหลดไฟล์เหล่านั้น
- อินพุตขนาดใหญ่มาก ทั้งไฟล์จะถูกเก็บไว้ในเบราว์เซอร์ระหว่างการเข้ารหัสหรือถอดรหัส ไฟล์ที่ใหญ่มากจึงอาจทำงานช้า และบนโทรศัพท์อาจล้มเหลวได้
คำตอบสั้นๆ
Base64 เหมือนการเข้ารหัสลับหรือไม่?
ไม่ใช่ เป็นการเข้ารหัสที่ย้อนกลับได้โดยไม่ต้องใช้กุญแจ ใครก็ถอดรหัสได้
ทำไม Base64 ที่ได้จึงยาวกว่าไฟล์?
ไบต์ทุกชุดสามไบต์จะกลายเป็นอักขระสี่ตัว ข้อความจึงใหญ่กว่าราวหนึ่งในสาม
ทำไมสตริง Base64 ที่คัดลอกมาถอดรหัสไม่สำเร็จ?
มักเป็นเพราะอักขระหายหรือถูกเพิ่มระหว่างการคัดลอก เช่น การขึ้นบรรทัดใหม่ผิดตำแหน่ง หรืออักขระตัวสุดท้ายหายไป ให้คัดลอกใหม่จากต้นทาง
แปลจาก ฉบับภาษาอังกฤษ ด้วยความช่วยเหลือของ AI
ความคิดเห็น
ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย


