เข้ารหัสและถอดรหัส Base64
แปลงข้อความเป็น Base64 และแปลงกลับได้ทันทีขณะพิมพ์ รองรับภาษาไทย อิโมจิ และอักขระ Unicode อื่นอย่างถูกต้อง
ทุกอย่างทำงานในเบราว์เซอร์ของคุณ ข้อมูลไม่ถูกอัปโหลด และ Base64 ไม่ใช่การเข้ารหัสลับ ใครก็ถอดกลับได้
Base64 ไม่ใช่การเข้ารหัสลับ
นี่คือความเข้าใจผิดที่พบบ่อยที่สุดเกี่ยวกับ Base64 และเป็นเรื่องสำคัญ การเข้ารหัสแบบนี้ไม่ได้ปกปิดหรือป้องกันอะไรเลย ใครก็ตามที่เห็นผลลัพธ์สามารถวางลงในหน้านี้แล้วอ่านข้อความของคุณได้ในไม่กี่วินาที ไม่มีกุญแจ ไม่มีความลับ หากคุณต้องการให้ข้อมูลเป็นความลับจริง ต้องใช้การเข้ารหัสลับ (encryption) ส่วน Base64 เพียงเปลี่ยนชุดอักขระที่ใช้เขียนข้อมูลเท่านั้น
Base64 มีไว้ทำอะไรจริง ๆ
ระบบจำนวนมากถูกออกแบบมาให้รับส่งได้เฉพาะข้อความเท่านั้น ทั้งเนื้อหาอีเมล ค่าสตริงใน JSON แอตทริบิวต์ใน XML ไฟล์ CSS และ HTTP header ล้วนเก็บข้อมูลไบนารีดิบ ๆ ไม่ได้อย่างปลอดภัย เพราะไบต์บางตัวอาจเป็นค่า null ขึ้นบรรทัดใหม่ หรืออัญประกาศที่ทำให้ข้อมูลจบก่อนกำหนดและพังทั้งก้อน
Base64 แก้ปัญหานี้ด้วยการเขียนไบต์ทุกแบบใหม่โดยใช้อักขระเพียง 64 ตัวที่ผ่านช่องทางข้อความได้ทุกชนิด คือ A–Z, a–z, 0–9 และสัญลักษณ์อีกสองตัว ทุกสามไบต์จะกลายเป็นอักขระสี่ตัว ข้อมูลจึงเดินทางได้อย่างปลอดภัย และปลายทางแปลงกลับเป็นไบต์เดิมได้
นี่คือเหตุผลที่คุณเห็น Base64 ในไฟล์แนบอีเมล ใน `data:` URI ที่ฝังรูปเล็ก ๆ ลงใน HTML หรือ CSS โดยตรง ใน JSON Web Token และใน API ที่ต้องส่งไฟล์กลับมาในรูปข้อความ
ข้อมูลจะใหญ่ขึ้นราวหนึ่งในสาม
ทุกสามไบต์กลายเป็นอักขระสี่ตัว ผลลัพธ์จึงใหญ่กว่าต้นฉบับประมาณ 33% นี่คือต้นทุนที่ต้องจ่ายเพื่อความปลอดภัยในการส่ง และหลีกเลี่ยงไม่ได้
สำหรับข้อความที่ไม่ใช่อักษรละติน ผลกระทบจะทบเข้าไปอีก ซึ่งหลายคนคาดไม่ถึง ตัวอักษรภาษาอังกฤษหนึ่งตัวเท่ากับหนึ่งไบต์ใน UTF-8 จึงได้ Base64 ราว 1.3 ตัว ส่วนตัวอักษรไทยหนึ่งตัวเท่ากับสามไบต์ จึงได้ราวสี่ตัว ข้อความไทยที่มีจำนวนตัวอักษรเท่ากับภาษาอังกฤษจะให้ Base64 ยาวกว่าประมาณสามเท่า ตัวเลขนับไบต์เหนือช่องกรอกข้อความบอกได้ว่าสิ่งที่กำลังเข้ารหัสจริง ๆ มีขนาดเท่าใด
เรื่องนี้ควรรู้ก่อนจะฝังรูปภาพขนาดใหญ่เป็น `data:` URI เพราะรูปขนาด 100 KB จะกลายเป็นข้อความราว 133 KB ที่อยู่ใน HTML ซึ่งต้องดาวน์โหลดใหม่ทุกครั้งที่เปิดหน้า และแคชแยกไม่ได้
ควรใช้รูปแบบ URL-safe เมื่อใด
Base64 มาตรฐานใช้ `+` และ `/` เป็นอักขระสองตัวสุดท้าย ซึ่งทั้งคู่มีปัญหาเมื่ออยู่ใน URL เพราะใน query string เครื่องหมาย `+` จะถูกตีความเป็นช่องว่าง ข้อมูลของคุณจึงเปลี่ยนไปโดยไม่มีการแจ้งเตือน ส่วน `/` เป็นตัวคั่นเส้นทาง จึงทำให้โครงสร้าง URL พังได้
รูปแบบ URL-safe เปลี่ยนสองตัวนี้เป็น `-` และ `_` ซึ่งไม่มีความหมายพิเศษในทั้งสองตำแหน่ง ให้ติ๊กช่องนี้หากผลลัพธ์จะนำไปใส่ใน URL ชื่อไฟล์ หรือที่ใดก็ตามที่ถือว่าอักขระเหล่านั้นเป็นไวยากรณ์ ส่วนการถอดรหัสรองรับทั้งสองรูปแบบโดยอัตโนมัติ คุณจึงไม่ต้องรู้ว่าได้รับมาแบบไหน
เรื่อง padding ก็เกี่ยวข้องกัน เครื่องหมาย `=` ท้ายข้อความมีไว้ให้ความยาวหารสี่ลงตัวเสมอ แต่ `=` ก็มีความหมายใน query string เช่นกัน การตัดออกจึงปลอดภัย เพราะความยาวยังบอกได้อยู่ว่าถอดออกมาได้กี่ไบต์ และเครื่องมือนี้ถอดรหัสได้ทั้งแบบที่มีและไม่มี padding
คำถามที่พบบ่อย
- ข้อความของฉันถูกส่งไปที่ไหนหรือไม่
- ไม่ การแปลงทั้งหมดทำงานในเบราว์เซอร์ของคุณด้วย JavaScript ที่ดาวน์โหลดมาพร้อมหน้าเว็บ ไม่มีเซิร์ฟเวอร์เข้ามาเกี่ยวข้อง คุณตรวจสอบได้โดยตัดการเชื่อมต่ออินเทอร์เน็ตหลังหน้าเว็บโหลดเสร็จ เครื่องมือจะยังทำงานได้ตามปกติ
- ทำไมการถอดรหัสบอกว่าผลลัพธ์เป็นไฟล์ไบนารี ไม่ใช่ข้อความ
- เพราะมันเป็นเช่นนั้นจริง Base64 บรรจุไบต์แบบใดก็ได้ รวมถึงรูปภาพ ไฟล์ PDF และไฟล์บีบอัด หากไบต์เหล่านั้นไม่ใช่ข้อความ UTF-8 ที่ถูกต้อง ก็ไม่มีข้อความที่สมเหตุสมผลให้แสดง เครื่องมือจึงแจ้งให้ทราบ แทนที่จะโชว์อักขระแทนที่เต็มหน้าจอซึ่งดูเหมือนโปรแกรมมีข้อผิดพลาด
- ใส่รหัสผ่านใน Base64 ปลอดภัยหรือไม่
- ไม่ปลอดภัย และขอพูดตรง ๆ ว่ารหัสผ่านที่เข้ารหัส Base64 ก็คือรหัสผ่านที่เปิดเผยอยู่ดี ระบบยืนยันตัวตนแบบ HTTP Basic ส่งชื่อผู้ใช้และรหัสผ่านเป็น Base64 ซึ่งเป็นเหตุผลว่าทำไมจึงต้องใช้ผ่าน HTTPS เท่านั้น ตัวการเข้ารหัสแบบนี้ไม่ได้เพิ่มความปลอดภัยเลย
- ทำไม Base64 ของฉันมีเครื่องหมายเท่ากับต่อท้าย
- นั่นคือ padding เพราะ Base64 ทำงานเป็นกลุ่มละสี่อักขระซึ่งแทนสามไบต์ เมื่อความยาวข้อมูลหารสามไม่ลงตัว จะมีเครื่องหมาย `=` หนึ่งหรือสองตัวมาเติมกลุ่มสุดท้าย มันไม่ได้บรรจุข้อมูลใด คุณตัดออกได้ด้วยตัวเลือก "ไม่ใส่ padding" แล้วยังถอดรหัสกลับได้ถูกต้อง
- รองรับภาษาไทยและอิโมจิหรือไม่
- รองรับ ข้อความจะถูกแปลงเป็นไบต์ UTF-8 ก่อนเข้ารหัส จึงใช้ได้กับ Unicode ทุกแบบ ทั้งภาษาไทย จีน อาหรับ และอิโมจิรวมถึงชุดที่ประกอบจากหลายส่วนอย่างธงชาติหรืออิโมจิครอบครัว ทั้งนี้เครื่องมือ Base64 จำนวนมากเรียกใช้ฟังก์ชันรุ่นเก่าของเบราว์เซอร์โดยตรง ซึ่งใช้กับอะไรที่เกินภาษาละตินไม่ได้เลย
- Base64 เหมือนกับการเข้ารหัสลับหรือการแฮชหรือไม่
- ไม่เหมือน และควรแยกให้ชัดทั้งสามอย่าง Base64 ใครก็แปลงกลับได้และไม่ป้องกันอะไร ส่วนการแฮชเป็นทางเดียวและย้อนกลับไม่ได้เลย ขณะที่การเข้ารหัสลับย้อนกลับได้เฉพาะผู้ที่มีกุญแจ หากคุณต้องการค่าตรวจสอบความถูกต้อง ให้ใช้เครื่องมือสร้างค่าแฮชแทน