• base64
  • encoding

ทุกสิ่งที่คุณต้องรู้เกี่ยวกับ Base64

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

Yijun
Yijun
Developer

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

Base64 คืออะไร?

Base64 เป็นวิธีการเข้ารหัสที่แสดงถึงข้อมูลไบนารีโดยใช้ตัวอักษรที่พิมพ์ได้ 64 ตัว ตัวอักษร 64 ตัวนี้ประกอบด้วย:

  • A-Z, a-z, 0-9 (ตัวเลขและตัวอักษร 62 ตัว)
  • + และ / (ตัวอักษรพิเศษ 2 ตัว)
  • = (ใช้สำหรับ padding)

ในงานพัฒนาของเราทุกวัน Base64 เป็นสิ่งที่พบได้ทั่วไป คุณอาจเคยพบมันในสถานการณ์ต่อไปนี้:

  • การฝังรูปภาพหรือไอคอนขนาดเล็กใน HTML
  • การส่งผ่านข้อมูลไบนารีในผลตอบกลับของ API
  • การเข้ารหัสไฟล์แนบในอีเมล

ตัวอย่างเช่น คุณอาจเคยเห็นโค้ด HTML เช่นนี้:

สตริงยาวในที่นี้เป็นรูปภาพขนาดเล็กที่ถูกเข้ารหัสใน Base64

ทำไมต้อง Base64?

เพื่อเข้าใจเหตุผลของการมีอยู่ของ Base64 เราต้องย้อนกลับไปดูที่ประวัติต้นๆ ของการพัฒนาคอมพิวเตอร์

ในวันแรก ๆ ของเครือข่ายคอมพิวเตอร์ ระบบส่วนใหญ่สามารถจัดการกับตัวอักษรที่พิมพ์ได้ ASCII เท่านั้น การเข้ารหัส ASCII ใช้เพียง 7 บิตของข้อมูลไบนารี เป็นการแสดงตัวอักษร 128 ตัว นี่ทำงานได้ดีสำหรับการจัดการกับข้อความภาษาอังกฤษ แต่มีปัญหาเมื่อส่งผ่านข้อมูลไบนารี (เช่น ภาพหรือไฟล์เสียง)

ระบบต่าง ๆ อาจแปลตัวอักษรควบคุมบางตัวแตกต่างกัน ซึ่งอาจทำให้ข้อมูลเสียหายระหว่างการส่งผ่าน ตัวอย่างเช่น ระบบบางระบบอาจเปลี่ยนการแตกบรรทัดจาก LF (Line Feed) เป็น CR (Carriage Return) + LF ซึ่งจะเป็นหายนะสำหรับข้อมูลไบนารี

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

ในความเป็นจริง ก่อน Base64 ยังมีวิธีการเข้ารหัส Base16 (ใช้ตัวอักษร 16 ตัว) และ Base32 (ใช้ตัวอักษร 32 ตัว) อย่างไรก็ตาม Base64 ให้สมดุลที่ดีที่สุดระหว่างประสิทธิภาพของการเข้ารหัสและความเป็นจริงในการปฏิบัติงาน ทำให้มันกลายเป็นวิธีการเข้ารหัสที่ใช้กันอย่างแพร่หลายที่สุด

การทำงานของการเข้ารหัส Base64

แนวคิดหลักของ Base64 คือการเข้ารหัส 3 ไบต์ (24 บิต) ของข้อมูลไบนารีให้กลายเป็นตัวอักษรที่พิมพ์ได้ 4 ตัว

มาทำความเข้าใจขั้นตอนนี้ผ่านตัวอย่างที่เฉพาะเจาะจง

สมมติว่าเราต้องการเข้ารหัสสตริง "Logto":

  1. ขั้นแรก เราแปลง "Logto" เป็นโค้ด ASCII:
  • L: 76 (01001100)
  • o: 111 (01101111)
  • g: 103 (01100111)
  • t: 116 (01110100)
  • o: 111 (01101111)
  1. เราผสานตัวเลขไบนารีเหล่านี้ (ทั้งหมด 5 ไบต์, 40 บิต): 0100110001101111011001110111010001101111

  2. เราแบ่งบิตเหล่านี้ออกเป็นกลุ่มของ 6 บิต (โปรดทราบว่ากลุ่มสุดท้ายมีเพียง 4 บิตเท่านั้น): 010011 | 000110 | 111101 | 100111 | 011101 | 000110 | 1111

  3. เนื่องจากกลุ่มสุดท้ายมีเพียง 4 บิต เราจึงต้องเติม 0 สองตัวที่ท้ายให้กลายเป็น 6 บิต: 010011 | 000110 | 111101 | 100111 | 011101 | 000110 | 111100

  4. เราแปลงแต่ละกลุ่ม 6 บิตเป็นทศนิยม: 19 | 6 | 61 | 39 | 29 | 6 | 60

  5. ตาม ตารางการเข้ารหัส Base64 เราแปลงตัวเลขเหล่านี้เป็นตัวอักษรที่ตรงกัน: T | G | 9 | n | d | G | 8

  6. ในที่สุด เนื่องจากการเข้ารหัส Base64 มักจะเข้ารหัส 3 ไบต์ (24 บิต) ของข้อมูลไบนารีให้กลายเป็นตัวอักษรที่พิมพ์ได้ 4 ตัว และ "Logto" แปลงเป็นไบต์ 5 ไบต์ในรูปแบบไบนารี 3 ไบต์แรกถูกเข้ารหัสเป็น TG9n และไบต์ 2 ตัวสุดท้ายถูกเข้ารหัสเป็น dG8 ดังนั้นเราจึงต้องเพิ่ม = เป็นตัวอักษร padding ที่ท้าย

ดังนั้น ผลการเข้ารหัส Base64 ของ "Logto" คือ TG9ndG8=

ใน Node.js เราสามารถสร้างการเข้ารหัส Base64 ได้ดังนี้:

ตัวอย่างนี้อธิบายลักษณะสำคัญหลายประการของการเข้ารหัส Base64:

  • ทุก 3 ไบต์ของอินพุตผลิตขึ้นเป็นตัวออก 4 ตัว
  • เมื่อตัวเลขของไบต์อินพุตไม่เป็นพหุคูณของ 3 จะใช้ตัวอักษร padding "=" ในตัวอย่างนี้เรามีไบต์อินพุต 5 ไบต์ ซึ่งผลิตเป็นตัวอักษร Base64 7 ตัวและตัวอักษร padding 1 ตัว
  • จำนวนของตัวอักษร padding สามารถบอกเราจำนวนที่แน่นอนของไบต์ในข้อมูลต้นฉบับ:
    • ไม่มี padding: ข้อมูลต้นฉบับเป็นพหุคูณของไบต์ 3
    • 1 =: เพิ่มบิตศูนย์ 2 บิตลงในข้อมูลต้นฉบับก่อนเข้ารหัส
    • 2 =: เพิ่มบิตศูนย์ 4 บิตลงในข้อมูลต้นฉบับก่อนเข้ารหัส

เมื่อใดและทำไมต้องใช้ Base64

Base64 มีประโยชน์โดยเฉพาะในสถานการณ์ต่อไปนี้:

  1. การฝังข้อมูลไบนารีขนาดเล็ก (เช่น รูปภาพหรือไอคอนขนาดเล็ก) ใน HTML
  2. การส่งผ่านข้อมูลไบนารีในโปรโตคอลที่ส่งผ่านแต่ตัวอักษรเท่านั้น
  3. การส่งผ่านข้อมูลในระบบที่มีข้อจำกัดเกี่ยวกับตัวอักษรพิเศษ
  4. การอำพรางข้อมูลอย่างง่าย (หมายเหตุ: นี่ไม่ใช่การเข้ารหัส!)

ข้อได้เปรียบหลักของการใช้ Base64 คือ:

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

นอกเหนือจาก Base64 มาตรฐานแล้ว ยังมีตัวแปรบางตัวที่ควรรู้:

  • URL-safe Base64: แทนที่ + ด้วย -, / ด้วย _ และลบ = ออก การเข้ารหัสนี้สามารถใช้โดยตรงใน URL ได้โดยไม่ต้องเข้ารหัสเพิ่มเติม

ข้อจำกัดและการพิจารณาของ Base64

แม้ว่าจะมีประโยชน์ Base64 ยังมีข้อจำกัดบางประการ:

  1. การเพิ่มขึ้นของข้อมูล: การเข้ารหัส Base64 เพิ่มปริมาณข้อมูลประมาณ 33% สำหรับข้อมูลจำนวนมาก สิ่งนี้อาจนำไปสู่การเพิ่มภาระค่าเก็บรักษาและแบนด์วิดธ์อย่างมีนัยสำคัญ

  2. ผลกระทบจากประสิทธิภาพ: กระบวนการเข้ารหัสและถอดรหัสต้องใช้เวลา CPU สำหรับข้อมูลจำนวนมากหรือการดำเนินงานที่บ่อยครั้งสิ่งนี้อาจกลายเป็นคอขวดของประสิทธิภาพ

  3. ความเข้าใจผิดเรื่องความปลอดภัย: หลายคนเข้าใจผิดว่า Base64 เป็นรูปแบบการเข้ารหัส ที่จริงแล้ว Base64 เป็นเพียงการเข้ารหัสและสามารถถอดรหัสได้ง่าย อย่าใช้มันเพื่อปกป้องข้อมูลที่เป็นความลับ!

  4. ความอ่านได้: ข้อมูลที่เข้ารหัสด้วย Base64 ไม่สามารถอ่านได้โดยมนุษย์ สิ่งนี้อาจทำให้การดีบักทำได้ยาก

เมื่อใช้ Base64 ในแอปพลิเคชันขนาดใหญ่ ให้พิจารณายุทธศาสตร์การเพิ่มประสิทธิภาพต่อไปนี้:

  • เข้ารหัส Base64 เฉพาะข้อมูลที่จำเป็นเท่านั้น
  • พิจารณาใช้ไลบรารีการเข้ารหัส/ถอดรหัส Base64 เฉพาะ ซึ่งมักจะมีประสิทธิภาพมากกว่าไลบรารีสำหรับวัตถุประสงค์ทั่วไป
  • ทำการเข้ารหัส/ถอดรหัส Base64 ที่ด้านข้างของลูกค้าเพื่อลดภาระงานเซิร์ฟเวอร์

สรุป

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

จำไว้ว่าประเด็นคือการใช้ Base64 ในเวลาที่เหมาะสมและในที่ที่เหมาะสม ขอให้คุณโชคดีในการเดินทางเขียนโปรแกรมของคุณ!