เครื่องมือสำหรับนักพัฒนา · ตัวเข้ารหัสและตัวถอดรหัส Base64
Base64 ไม่ใช่การเข้ารหัส: เหตุใดทุกคนจึงสามารถอ่านความลับที่เข้ารหัสได้
· เหตุใดจึงสำคัญ
base64 ความปลอดภัย การเข้ารหัส
Base64 ไม่ได้ซ่อนอะไรเลย ใครก็ตามที่มีสตริงสามารถถอดรหัสได้ทันทีโดยไม่ต้องใช้คีย์ โพสต์นี้จะอธิบายความแตกต่างระหว่างการเข้ารหัส การเข้ารหัส และการแฮช และสิ่งที่ควรทำเมื่อคุณพบความลับ Base64 ในพื้นที่เก็บข้อมูล
ค่าปรับแต่งที่ดูมีสัญญาณรบกวนและถอดรหัสเป็นรหัสผ่านฐานข้อมูล — การค้นพบที่เป็นรูปธรรมและความรวดเร็วในการย้อนกลับ
การค้นหา Base64 ในไฟล์กำหนดค่าทำให้เกิดความปลอดภัยที่ผิดพลาด นักพัฒนาค้นพบรหัสผ่านฐานข้อมูลที่ปรากฏเป็นลำดับสัญญาณรบกวน เช่น dGlnZXJfZGF0YWJhc2VfYWRtaW4 โดยถือว่ามีการเข้ารหัส และส่งต่อไปยังพื้นที่เก็บข้อมูลข้างรหัสแอปพลิเคชัน สัปดาห์ต่อมา การตรวจสอบความปลอดภัยเผยให้เห็นข้อความธรรมดาจริง: Tiger_database_admin
Base64 ไม่ได้ซ่อนอะไรเลย มันเป็นการเข้ารหัส ไม่ใช่การเข้ารหัส รหัสผ่านเดียวกันที่กลับรายการจะกลายเป็น Raw อีกครั้งทันทีในเบราว์เซอร์ โดยไม่ต้องใช้คีย์ ไม่มีการคำนวณ และไม่มีความล่าช้า โพสต์นี้จะอธิบายว่าทำไมการเข้ารหัสจึงมีอยู่ ความแตกต่างโดยพื้นฐานจากการเข้ารหัสและการแฮช และสิ่งที่เกิดขึ้นจริงเมื่อมีคนพบความลับ Base64 ในประวัติที่มุ่งมั่น
การเข้ารหัส การเข้ารหัส และการแฮช: งานที่แตกต่างกันสามงาน — แต่ละงานรับประกันอะไร และงานไหนต้องใช้คีย์
ความสับสนเกิดขึ้นเนื่องจาก Base64 ดูเหมือนการป้องกัน มนุษย์ไม่สามารถมองดู dGlnZXJfZGF0YWJhc2VfYWRtaW4 และอ่าน Tiger_database_admin ได้ ปรากฏถูกบดบังจนกว่าคุณจะเรียกใช้ผ่านตัวถอดรหัส การสร้างความสับสนในระดับผิวเผินนั้นให้ความรู้สึกเหมือนปลอดภัย แต่ไม่ใช่ Base64 ได้รับการออกแบบมาเพื่อแก้ไขปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง: การย้ายข้อมูลไบนารี่โดยพลการผ่านช่องทางข้อความเท่านั้น อีเมล เว็บฟอร์มเก่า และระบบบรรทัดโปรโตคอลไม่สามารถพกพาไบต์ดิบได้ Base64 แปลงไบต์เป็นอักขระ ASCII ที่พิมพ์ได้ เพื่อให้ข้อมูลสามารถส่งผ่านช่องสัญญาณเหล่านั้นได้ครบถ้วน
เมื่อข้อมูลมาถึง ผู้รับจะถอดรหัสกลับเป็นไบต์ การเข้ารหัสและถอดรหัสนั้นง่ายพอๆ กัน พวกเขาไม่ต้องการคีย์ ไม่มีเอนโทรปี ไม่มีไลบรารีการเข้ารหัส การเข้ารหัส การเข้ารหัส และการแฮชมีจุดประสงค์สามประการแยกกันและให้การรับประกันที่แตกต่างกันสามประการ การเข้ารหัสแปลงข้อมูลเป็นการนำเสนอที่แตกต่างกัน เพื่อให้สามารถผ่านช่องทางเฉพาะหรือใช้ในบริบทเฉพาะได้ Base64, URL-การเข้ารหัส การแสดงเลขฐานสิบหก และแม้แต่เครื่องหมายคำพูดแบบ Escape ใน JSON ล้วนเป็นการเข้ารหัสทั้งหมด ทุกคนสามารถย้อนกลับได้และไม่ต้องใช้รหัสลับ
เหตุใดจึงมี Base64 — การขนส่งไบต์อย่างปลอดภัยผ่านช่องข้อความ ไม่เคยเป็นความลับ
เป้าหมายคือความเข้ากันได้ของรูปแบบ ไม่ใช่การรักษาความลับ ในทางตรงกันข้าม การเข้ารหัสต้องใช้คีย์ที่รู้จักเฉพาะผู้ที่ได้รับอนุญาตเท่านั้น มีเพียงผู้ที่มีคีย์ที่ถูกต้องเท่านั้นที่สามารถเปลี่ยนไซเฟอร์เท็กซ์กลับเป็นข้อความธรรมดาได้ หากไม่มีคีย์ ข้อความจะยังคงไม่ชัดเจน แม้แต่กับบุคคลที่เชี่ยวชาญพอที่จะโจมตีก็ตาม การแฮชเป็นแบบทางเดียวโดยการออกแบบ: การแฮชที่เข้ารหัสลับของรหัสผ่านไม่สามารถย้อนกลับได้เลย ใช้เพื่อตรวจสอบว่ารหัสผ่านตรงกับแฮชที่เก็บไว้โดยไม่ต้องจัดเก็บรหัสผ่านเอง
Kubernetes Secret ชื่อฐานข้อมูลรหัสผ่านที่มี base64: dGlnZXJfZGF0YWJhc2VfYWRtaW4 ไม่ใช่ความลับจริงๆ Base64 เป็นการเข้ารหัสเริ่มต้นที่ Kubernetes ใช้สำหรับการจัดเก็บ ไม่ใช่การป้องกัน ใครก็ตามที่มีสิทธิ์เข้าถึง YAML หรือฐานข้อมูล etcd สามารถถอดรหัสค่าได้ในไม่กี่วินาที ตัวแปรสภาพแวดล้อมที่มีคีย์ API ที่เข้ารหัส base64 ในสคริปต์เริ่มต้นประสบปัญหาเดียวกัน ส่วนหัวการตรวจสอบสิทธิ์พื้นฐานที่ส่งการอนุญาต: Basic base64_username:password ไปยังเซิร์ฟเวอร์สามารถถอดรหัสได้โดยพร็อกซี เครื่องมือตรวจสอบ หรือผู้สังเกตการณ์เครือข่ายระหว่างไคลเอ็นต์และเซิร์ฟเวอร์
ตัวอย่างการทำงาน: การถอดรหัสสตริง 'ความลับ' ในเบราว์เซอร์ - การวาง การถอดรหัส และข้อความธรรมดา โดยไม่เกี่ยวข้องกับเซิร์ฟเวอร์
หากช่องเป็น HTTP แทนที่จะเป็น HTTPS การเปิดรับแสงจะยิ่งใหญ่ยิ่งขึ้น Base64 ในบริบทเหล่านี้คือปลาเฮอริ่งแดง: ความลับที่แท้จริงได้ถูกบุกรุกโดยการจัดเก็บหรือส่งต่อในรูปแบบที่สามารถกู้คืนได้เลย ตัวอย่างที่ดีจะทำให้ปัญหาเป็นรูปธรรม สมมติว่าคีย์ API สำหรับบริการของบริษัทอื่นปรากฏในไฟล์การกำหนดค่าเป็น YXBpa2V5XzEyMzQ1Njc4OTAx คัดลอกสตริงนี้ลงในตัวเข้ารหัสและตัวถอดรหัส Base64 ในเบราว์เซอร์ของคุณ วางลงในช่องป้อนข้อมูลแล้วคลิกถอดรหัส
เครื่องมือส่งคืน apikey_1234567890 สิ่งนี้เกิดขึ้นทันทีในเบราว์เซอร์ของคุณ โดยไม่ต้องติดต่อกับเซิร์ฟเวอร์ ไม่ต้องใช้คีย์ และไม่มีการตรวจสอบสิทธิ์ การดำเนินการทั้งหมดใช้เวลาไม่ถึงหนึ่งวินาที ตอนนี้ สมมติว่าคีย์เดียวกันนี้ถูกพบในที่เก็บ GitHub สาธารณะโดยผู้ประสงค์ร้าย พวกเขาถอดรหัสได้ง่ายพอๆ กันไม่ว่าจะใช้เครื่องมือใดก็ตามที่พวกเขาต้องการ และใช้มันเพื่อเข้าถึงบริการ ไม่ว่าสตริงจะยังคงถูกบดบังในพื้นที่เก็บข้อมูล เดินทางผ่านเครือข่าย หรือปรากฏในบันทึกของแอปพลิเคชัน สตริงนั้นสามารถถูกเปิดเผยได้ด้วยการดำเนินการเล็กๆ น้อยๆ ที่มีอยู่ในทุกภาษาการเขียนโปรแกรมและในเครื่องมือของเบราว์เซอร์เช่นนี้
จุดที่ข้อผิดพลาดนี้ปรากฏขึ้น - Kubernetes Secrets, ไฟล์ .env, ส่วนหัวการรับรองความถูกต้องพื้นฐาน และทรัพยากรแอปมือถือ
ข้อผิดพลาดปรากฏขึ้นทุกที่เนื่องจาก Base64 เป็นเรื่องธรรมดามากจนทำให้เกิดความสับสนเมื่ออยู่ใกล้กัน นักพัฒนาเห็นข้อมูลที่เข้ารหัส Base64 สรุปได้ว่ามีคนคิดว่ามันสำคัญ และทิ้งความลับไว้ในรูปแบบนั้น ไฟล์ .env ที่มี API_KEY=VGhpcyBpcyBub3QgcmVhbGx5IGEgc2VjcmV0 ปรากฏต่อวิศวกรรุ่นน้องว่ามีความปลอดภัยมากกว่า API_KEY=นี่ไม่ใช่ความลับจริงๆ แม้ว่าการถอดรหัสจะดำเนินการเพียงครั้งเดียวก็ตาม แอปพลิเคชันมือถือรวมโทเค็นที่เข้ารหัส Base64 ไว้ในทรัพยากรที่ผู้ถอดรหัสสามารถแยกและถอดรหัสได้ การสำรองฐานข้อมูลประกอบด้วยรหัสผ่านที่เข้ารหัส Base64 ในช่องที่มีไว้เพื่อค้นหาและไม่ได้รับการป้องกัน
ในแต่ละกรณี มีคนเข้าใจผิดว่าการเข้ารหัสเป็นการเข้ารหัส และสร้างที่เก็บข้อมูลลับแบบข้อความธรรมดาซึ่งมีการจัดรูปแบบในลักษณะที่ต้องใช้ขั้นตอนพิเศษในการอ่านหนึ่งขั้นตอน จะทำอย่างไรเมื่อค้นพบความลับ Base64 ขึ้นอยู่กับบริบท
สิ่งที่ต้องทำแทน — ผู้จัดการความลับ การเข้ารหัสจริงที่เหลือ และการสับเปลี่ยนอะไรก็ตามที่กระทำไปแล้ว
หากข้อมูลลับเป็นโทเค็น API คีย์หรือรหัสผ่าน และได้ถูกกำหนดให้ใช้การควบคุมเวอร์ชันแล้ว ให้ถือว่าข้อมูลนั้นถูกบุกรุก เพิกถอน สร้างใหม่ และอัปเดตทุกสถานที่ที่ใช้ การคอมมิตเชิงประวัติเป็นส่วนหนึ่งของเร็กคอร์ดถาวรของที่เก็บ แม้ว่าความลับจะถูกลบออกในการคอมมิตใหม่ในภายหลังก็ตาม ทุกคนที่มีสิทธิ์เข้าถึงประวัติพื้นที่เก็บข้อมูลสามารถค้นหาได้
ขณะนี้การค้นหาที่เก็บสำหรับค่าที่เข้ารหัส Base64 ถือเป็นกลยุทธ์การลาดตระเวนมาตรฐาน ดังนั้นการที่บางสิ่งที่เป็น Base64 ไม่ได้ทำให้มันเป็นความลับ สำหรับการดำเนินการใดๆ ที่กำลังดำเนินอยู่ อย่าเข้ารหัสความลับด้วย Base64 และถือว่าข้อมูลเหล่านั้นได้รับการปกป้องแล้ว ใช้ตัวจัดการความลับที่เก็บค่าที่เข้ารหัส ควบคุมการเข้าถึง และตรวจสอบได้ จัดเก็บเฉพาะข้อมูลอ้างอิงหรือแหล่งที่มา ไม่ใช่ข้อมูลลับในโค้ดแอปพลิเคชันและการกำหนดค่า การเข้ารหัสจริงขณะพักหมายความว่าข้อมูลถูกเข้ารหัสด้วยคีย์ที่จัดเก็บแยกต่างหาก และไม่มีประโยชน์สำหรับทุกคนที่ไม่มีคีย์นั้น
สิ่งนี้ไม่ครอบคลุม — การเลือกอัลกอริธึมการเข้ารหัสหรือการออกแบบการจัดการคีย์
ฐานข้อมูลที่เข้ารหัสคอลัมน์ที่ละเอียดอ่อน ตัวจัดการความลับที่ใช้การเข้ารหัสเอนเวโลปด้วยคีย์ในโมดูลความปลอดภัยของฮาร์ดแวร์ หรือตัวจัดการรหัสผ่านที่ได้รับคีย์การเข้ารหัสจากรหัสผ่านผู้ใช้ ล้วนนำเสนอการรักษาความลับอย่างแท้จริง การเข้ารหัสระดับแอปพลิเคชัน ณ จุดที่มีการสร้างความลับก่อนที่จะถูกจัดเก็บไว้ที่ใดก็ตาม ยังคงแข็งแกร่งยิ่งขึ้น การหมุนเวียนความลับที่ถูกเปิดเผย แม้ว่าจะเป็นเพียงการเข้ารหัส Base64 ก็ตาม จะช่วยขจัดโอกาสแห่งโอกาสในการนำไปใช้ในทางที่ผิด หากมีข้อมูลลับอยู่ในพื้นที่เก็บข้อมูล ให้ตรวจสอบบันทึกเพื่อดูว่ามีการเข้าถึงเมื่อใดและนำไปใช้ทำอะไรในระหว่างหน้าต่างการเปิดเผยข้อมูล
เพื่อความปลอดภัยอย่างต่อเนื่อง ให้ใช้โทเค็นอายุสั้นที่ออกโดยบริการอนุญาต ไม่ใช่ข้อมูลลับแบบคงที่ที่จัดเก็บไว้ในการกำหนดค่า โทเค็นที่หมดอายุในหนึ่งชั่วโมงจะมีค่าน้อยกว่าสำหรับผู้โจมตีแม้ว่าจะถูกบุกรุกก็ตาม บทความนี้ไม่ครอบคลุมถึงการเลือกอัลกอริธึมการเข้ารหัส การออกแบบการจัดการคีย์ หรือสถาปัตยกรรมการตรวจสอบสิทธิ์ นี่เป็นคำถามเชิงลึกทางวิศวกรรมที่มีมาตรฐานและข้อเสียของตัวเอง ประเด็นนั้นง่ายกว่า: Base64 ไม่ใช่หนึ่งในเครื่องมือสำหรับปัญหาเหล่านั้น เป็นการแปลงรูปแบบสำหรับการขนส่งและการจัดเก็บ
ประเด็นสำคัญ: ถือว่า Base64 เป็นข้อความธรรมดา - วิธีที่ตัวเข้ารหัสและตัวถอดรหัส Base64 ชี้ประเด็นด้วยการคลิกเพียงครั้งเดียว โดยไม่มีความลับใด ๆ หลุดออกจากแท็บของคุณ
อย่าปล่อยให้การปรากฏตัวของ Base64 ในพื้นที่เก็บข้อมูล ไฟล์การกำหนดค่า หรือบันทึกทำให้คุณสบายใจว่าข้อมูลได้รับการปกป้อง เครื่องมือใดๆ ที่สามารถอ่านข้อความสามารถถอดรหัส Base64 ได้ และการดำเนินการนั้นจะเกิดขึ้นทันทีและกำหนดได้ การอ่านสตริงที่เข้ารหัส Base64 ในรูปแบบไซเฟอร์เท็กซ์ถือเป็นความเข้าใจผิดที่พบบ่อย และจะทิ้งความลับที่แท้จริงไว้อย่างชัดเจน นักพัฒนามักจะตระหนักถึงสิ่งนี้หลังจากค้นพบความลับของ Base64 ในการผลิตหรือในการตรวจสอบเท่านั้น มุมมองใหม่เกิดขึ้นเมื่อวิศวกรถอดรหัสสตริงตัวอย่างในเครื่องและเห็นว่าข้อความธรรมดาต้นฉบับปรากฏขึ้นทันที
เครื่องมือนี้ทำให้จุดที่หลีกเลี่ยงไม่ได้: การเข้ารหัสไม่ใช่การเข้ารหัส เมื่อความแตกต่างนั้นชัดเจน การติดตามผลจะเป็นไปโดยอัตโนมัติ ข้อมูลลับ Base64 ทุกรายการในโค้ดเบสจะต้องถูกหมุนเวียน ทุกสถานที่ที่ใช้ความลับจะต้องได้รับการอัปเดต ต้องประเมินหน้าต่างการรับแสง ในอนาคต ผู้จัดการข้อมูลลับและการเข้ารหัสจริงจะต้องแทนที่การเข้ารหัสในบทบาทนี้ ตัวเข้ารหัสและตัวถอดรหัส Base64 แสดงให้เห็นว่าการกลับรายการรวดเร็วและง่ายดายเพียงใด โดยที่คุณไม่ต้องออกจากเบราว์เซอร์อย่างเป็นความลับ ปฏิบัติต่อความง่ายดายดังกล่าวเสมือนเป็นมาตรการรักษาความปลอดภัยที่แท้จริง: หากคุณสามารถถอดรหัสได้ภายในไม่กี่วินาที คนอื่นก็สามารถถอดรหัสได้เช่นกัน