ตรวจสอบ Base64

วางสตริงเพื่อดูว่าเป็น Base64 ที่ถูกต้องหรือไม่ เครื่องมือตรวจสอบจะระบุรูปแบบ ชี้ตำแหน่งอักขระที่ไม่ถูกต้องและปัญหาของแพดดิง และบอกว่าข้อมูลถอดรหัสแล้วได้เป็นอะไร

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. วางสตริงที่ต้องการตรวจสอบลงในช่องอินพุต
  2. อ่านผลการตรวจสอบ ได้แก่ ถูกต้องหรือไม่ถูกต้อง “รูปแบบ” ที่ตรวจพบ (มาตรฐานหรือปลอดภัยสำหรับ URL) และ “ขนาดหลังถอดรหัส”
  3. หากมีรายการใน “ปัญหา” ให้ใช้ตำแหน่งที่รายงานเพื่อค้นหาอักขระที่ไม่ถูกต้อง อักขระช่องว่าง หรือแพดดิงที่อยู่ผิดตำแหน่ง
  4. ดูชนิดเนื้อหาที่ตรวจพบในช่อง “เนื้อหา” เพื่อดูว่าข้อมูลเป็นข้อความหรือไฟล์ เช่น PNG, PDF หรือ ZIP

Base64 ที่ถูกต้องเป็นอย่างไร

  • ชุดตัวอักษร อนุญาตเฉพาะ A-Z, a-z, 0-9 และอักขระอีกสองตัว คือ + และ / ใน Base64 มาตรฐาน หรือ - และ _ ใน Base64URL สตริงที่ใช้ทั้งสองคู่ปะปนกันมักเสียหาย หรือถูกนำมาต่อกันจากสองแหล่ง
  • แพดดิง เครื่องหมาย = ปรากฏได้เฉพาะที่ท้ายสตริงและไม่เกินสองตัว แพดดิงที่อยู่ตรงกลางมักหมายความว่ามีค่าที่เข้ารหัสแล้วสองค่าถูกนำมาต่อกัน
  • ความยาว หากมีแพดดิง ความยาวจะเป็นพหุคูณของ 4 หากไม่มีแพดดิง ความยาวเท่าใดก็ได้ยกเว้น 4n + 1 เพราะอักขระที่เหลือตัวเดียวเก็บข้อมูลได้เพียง 6 บิต ไม่พอสำหรับหนึ่งไบต์

ตัวถอดรหัสแบบเข้มงวดมีกฎเพิ่มอีกหนึ่งข้อ คือบิตล่างที่ไม่ได้ใช้ของอักขระตัวสุดท้ายต้องเป็นศูนย์ ตัวถอดรหัสจำนวนมากไม่สนใจบิตเหล่านี้ แต่บางตัว เช่น base64.StdEncoding.Strict() ของ Go จะปฏิเสธสตริงนั้น

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

ปัญหาสาเหตุที่พบบ่อยวิธีแก้ไข
อักขระไม่ถูกต้องเครื่องหมายคำพูด แบ็กสแลช หรือรหัส %2B และ %3D ที่ติดมากับค่าตอนคัดลอกลบอักขระส่วนเกินออก หรือถอดรหัส URL ก่อน
มีช่องว่างตรงกลาง+ ถูกเปลี่ยนเป็นช่องว่างเมื่อค่าถูกส่งผ่าน URL หรือฟอร์มใส่ + กลับคืน หรือใช้ Base64URL สำหรับ URL
ความยาว 4n + 1ค่าถูกตัดทอนเพราะข้อจำกัดความยาวของคอลัมน์ บรรทัดล็อก หรือการคัดลอกไม่ครบคัดลอกค่าทั้งหมดใหม่อีกครั้ง
แพดดิงอยู่ตรงกลางสตริง Base64 สองชุดถูกนำมาต่อกันแยกออกเป็นส่วน ๆ แล้วถอดรหัสแต่ละส่วนแยกกัน
การขึ้นบรรทัดใหม่การตัดบรรทัดแบบ MIME หรือ PEMโดยทั่วไปไม่เป็นปัญหา ให้ลบออกเมื่อต้องการให้อยู่ในบรรทัดเดียว

ถูกต้องไม่ได้แปลว่ามีความหมาย

Base64 ไม่มีส่วนหัวและไม่มีเช็กซัม การที่สตริงถูกต้องจึงบอกได้เพียงว่าสามารถถอดรหัสได้ คำธรรมดาจำนวนมากผ่านการตรวจสอบ เพราะตัวอักษรสี่ตัวใด ๆ ก็ประกอบเป็นกลุ่มที่ถูกต้องได้ เครื่องมือตรวจสอบจึงถอดรหัสข้อมูลด้วย แล้วรายงานขนาดและชนิดเนื้อหา ข้อความที่อ่านออกได้หรือลายเซ็นไฟล์ที่รู้จัก เช่น PNG, PDF หรือ ZIP เป็นหลักฐานที่ดีว่าสตริงนั้นเป็น Base64 จริง แต่ไบต์สุ่มเพียงไม่กี่ไบต์ไม่ใช่หลักฐานที่เชื่อถือได้ หากต้องการทดสอบการเข้ารหัสอื่นด้วย ลองใช้ เครื่องมือตรวจหาการเข้ารหัส

การตรวจสอบ Base64 ในโค้ด

// JavaScript: Base64 มาตรฐานที่มีแพดดิง (ตรงกับสตริงว่างด้วย)
/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/

# Python: แจ้งข้อผิดพลาดแทนการข้ามอักขระที่ไม่ถูกต้อง
import base64, binascii
try:
    base64.b64decode(s, validate=True)
except binascii.Error:
    print('invalid')

คำถามที่พบบ่อย

ทำไมคำธรรมดาจึงถูกรายงานว่าเป็น Base64 ที่ถูกต้อง
เพราะคำนั้นถูกต้องจริง อักขระจากชุดตัวอักษรที่เรียงต่อกันด้วยความยาวที่เหมาะสมจะถอดรหัสได้เป็นไบต์บางอย่างเสมอ เช่น คำว่า test ถอดรหัสได้เป็นสามไบต์ ให้ดูชนิดเนื้อหาที่ตรวจพบ หากผลลัพธ์ไม่ใช่ทั้งข้อความที่อ่านออกได้และชนิดไฟล์ที่รู้จัก อินพุตนั้นก็อาจไม่เคยเป็น Base64 มาตั้งแต่แรก
Base64 ที่มีช่องว่างหรือการขึ้นบรรทัดใหม่ถือว่าถูกต้องหรือไม่

MIME และ PEM ตัด Base64 ออกเป็นหลายบรรทัด และตัวถอดรหัสส่วนใหญ่จะข้ามอักขระช่องว่าง อย่างไรก็ตาม ฟิลด์ JSON ส่วนหัว HTTP, JWT และ data URI ต้องการสตริงต่อเนื่องเพียงชุดเดียว เครื่องมือตรวจสอบจึงแสดงอักขระช่องว่างแยกไว้ต่างหาก เพื่อให้คุณตัดสินใจได้ว่าจะมีผลหรือไม่ในที่ที่จะนำสตริงไปใช้

Base64 ที่ไม่มีแพดดิง = ถือว่าถูกต้องหรือไม่
ในหลายกรณีถือว่าถูกต้อง Base64URL มักละแพดดิงไว้ และ RFC 4648 อนุญาตให้ละได้เมื่อทราบความยาวจากบริบท แต่ตัวถอดรหัสแบบเข้มงวดบางตัวยังต้องมีแพดดิง หากระบบปฏิเสธสตริง ให้เติมเครื่องหมาย = จนความยาวเป็นพหุคูณของ 4 ส่วนสตริงที่ไม่มีแพดดิงและยาว 4n + 1 อักขระจะไม่ถูกต้องในทุกกรณี
จะตรวจสอบว่าสตริงเป็น Base64 ใน JavaScript ได้อย่างไร
สำหรับ Base64 แบบเข้มงวดที่มีแพดดิง ให้ทดสอบกับนิพจน์ปกติ (regular expression) ที่อนุญาตกลุ่มละสี่อักขระจากชุดตัวอักษร ตามด้วยแพดดิงที่ไม่บังคับ วิธีที่เร็วกว่าคือเรียก atob() ภายใน try/catch แต่โปรดทราบว่า atob() จะโยน InvalidCharacterError เมื่ออินพุตไม่ถูกต้อง แต่จะยอมรับอักขระช่องว่างและแพดดิงที่ขาดหายโดยไม่แจ้งเตือน และไม่รับอักขระแบบปลอดภัยสำหรับ URL