ข้าม​ไป​ยัง​เนื้อหา

Kerckhoffs’s Principle

ระบบ​ต้อง​ปลอดภัย​แม้​ทุก​อย่าง​เปิดเผย — ยกเว้น​กุญแจ​ลับ

Kerckhoffs’s Principle ตั้ง​ชื่อ​ตาม Auguste Kerckhoffs นัก​เข้า​รหัส​ชาว​ดัตช์ ผู้​ตี​พิมพ์​บทความ “La Cryptographie Militaire” ในปี 1883 โดย​วาง​กฎ 6 ข้อ​สำหรับ​การ​ออกแบบ​ระบบ​เข้า​รหัส​ทาง​ทหาร มี​เพียง​ข้อ​ที่​สอง​เท่านั้น​ที่​ยัง​คง​ถูก​อ้าง​ถึง​จนถึง​ทุก​วัน​นี้ นั่น​คือ ระบบ​ต้อง ไม่​จำเป็น​ต้อง​เก็บ​เป็น​ความ​ลับ และ​ต้อง​สามารถ​ตก​ไป​อยู่​ใน​มือ​ศัตรู​ได้​โดย​ไม่​เกิด​ความ​เสียหาย

พูด​ให้​สั้น​และ​ใช้งาน​ได้​จริง​กว่า​นั้น ระบบ​ความ​ปลอดภัย​ควร ยัง​คง​ปลอดภัย​แม้​ผู้​โจมตี​จะ​รู้​ทุก​รายละเอียด​ของ​ระบบ ยกเว้น​กุญแจ​ลับ (secret key) ต่อ​มา​ใน​ปี 1949 Claude Shannon ได้​สรุป​แนวคิด​เดียวกัน​นี้​เป็น​ประโยค​สั้น ๆ ที่​รู้จัก​กัน​ใน​ชื่อ Shannon’s Maxim: “the enemy knows the system” — ให้​สมมติ​ว่า​ศัตรู​รู้จัก​ระบบ​ของ​เรา​อย่าง​ละเอียด​อยู่​แล้ว แล้ว​ออกแบบ​ให้​ปลอดภัย​บน​สมมติฐาน​นั้น

หัวใจ​คือ​การ​แบ่ง​เส้น​ให้​ชัด​ระหว่าง code ซึ่ง​เป็น​ความ​รู้​สาธารณะ​ได้ กับ data/key ซึ่ง​ต้อง​เป็น​ความ​ลับ​เท่านั้นPublic Code, Private Keys

ทำไม​หลักการ​นี้​ถึง​สำคัญ​กว่า​ที่​คิด? เพราะ​มัน​ชี้​ปัญหา​พื้นฐาน​ของ​แนวทาง​ตรง​ข้าม​คือ security by obscurity (ความ​ปลอดภัย​ด้วย​การ​ปิดบัง):

  • ความ​ลับ​ที่​รั่วไหล​ไม่​สามารถ​ย้อน​กลับ​ได้ — ถ้า​ความ​ปลอดภัย​ของ​ระบบ​ขึ้น​กับ​การ​ปิดบัง algorithm หรือ source code เมื่อ​มัน​หลุด​ออก​ไป​ครั้ง​เดียว (ผ่าน reverse engineering, memory dump, insider, หรือ leak) ระบบ​ทั้งหมด​พัง​ทันที​และ​แก้​ไม่​ได้​ด้วย​การ​เปลี่ยน​อะไร​ง่าย ๆ ต้อง​ออกแบบ​ระบบ​ใหม่​ทั้งหมด
  • key ที่​รั่วไหล​แก้ไข​ได้​ง่าย​กว่า​มาก — ถ้า​ความ​ปลอดภัย​ขึ้น​กับ key เท่านั้น เมื่อ key หลุด เรา​แค่ หมุนเวียน (rotate) key ใหม่ ระบบ​เดิม​ยัง​ใช้งาน​ได้​ต่อ นี่​คือ​สิ่ง​ที่ Bruce Schneier อธิบาย​ไว้​ว่า “every secret creates a potential failure point” — ยิ่ง​มี​ความ​ลับ​น้อย​จุด ยิ่ง​มี​จุด​เสี่ยง​น้อย
  • การ​เปิดเผย algorithm เชิญ​ชวน​ให้​ผู้เชี่ยวชาญ​ภายนอก​มา​ช่วย​ตรวจสอบ — ประวัติศาสตร์ cryptanalysis แสดง​ให้​เห็น​ซ้ำ​แล้ว​ซ้ำ​เล่า​ว่าการ​วิเคราะห์​แบบ​เปิดเผย (open review) มัก​เผย​จุด​อ่อน​ที่​ทีม​ออกแบบ​เดิม​มอง​ข้าม และ​ทำให้ algorithm แข็งแกร่ง​ขึ้น​ใน​ระยะ​ยาว เช่น AES ที่​ผ่าน​การ​แข่งขัน​สาธารณะ​และ​ตรวจสอบ​โดย​นัก​เข้า​รหัส​ทั่ว​โลก​ก่อน​ถูก​เลือก​เป็น​มาตรฐาน
  • obscurity ไม่ใช่​ศูนย์ แต่​ไม่​ควร​เป็น “ชั้น​ความ​ปลอดภัย​เดียว” — Kerckhoffs’s Principle ไม่​ได้​บอกว่าการ​ปิดบัง​ไม่มี​ประโยชน์​เลย (defense in depth ยัง​มี​ที่ทาง​ของ​มัน) แต่​เตือน​ว่า ห้าม​พึ่งพา​มัน​เป็น​กลไก​ป้องกัน​หลัก เพราะ​มัน​เป็น​ฐาน​ที่​เปราะบาง​เกิน​ไป

ใน​บริบท​ของ software engineering ทั่วไป (ไม่ใช่​แค่ cryptography) หลักการ​นี้​แปลง​เป็น​แนว​ปฏิบัติ​ที่​คุ้น​เคย:

  • Source code เป็น open source ได้ (หรือ​แม้แต่​ถูก decompile ได้​เสมอ​ใน​กรณี client-side) แต่ credential, API key, password hash, encryption key ต้อง​แยก​เก็บ​ใน environment variable, secrets manager หรือ vault — ไม่ hardcode ลงใน source
  • Password ไม่​ควร​ถูก​เก็บ​เป็น plaintext แม้แต่​ใน​ระบบ​ที่ “ปลอดภัย​ดี​อยู่​แล้ว” — เก็บ​เป็น hash (พร้อม salt) เพื่อ​ให้​ต่อ​ให้ database รั่วไหล ผู้​โจมตี​ก็​ยัง​ต้อง​เจาะ hash function อยู่ดี
  • Protocol และ API spec ควร​เผยแพร่​ได้ (เช่น OAuth 2.0, TLS handshake) เพราะ​ความ​ปลอดภัย​พึ่งพา key/certificate ไม่ใช่​ความ​ลับ​ของ spec เอง
  • การ “ซ่อน” endpoint หรือ business logic โดย​หวัง​ว่า​ไม่มี​ใคร​เจอ (obscurity ผ่าน URL ที่​เดา​ยาก, ผ่าน minify/obfuscate เพียง​อย่าง​เดียว) ไม่ใช่​มาตรการ​ความ​ปลอดภัย​ที่แท้​จริง — เป็น​ได้​แค่​ชั้น​เสริม​ที่​ทำให้​ผู้​โจมตี​ช้า​ลง​ชั่วคราว ต้อง​มี authentication/authorization ที่แท้​จริง​รองรับ​อยู่​เสมอ
flowchart LR
    System[System Design] -->|public knowledge OK| Algorithm[Algorithm and Source Code]
    System -->|must stay secret| Key[Secret Key or Credential]
    Algorithm -->|reviewed openly| Strength[Stronger over time]
    Key -->|compromised| Rotate[Rotate key, system still safe]
    Algorithm -->|compromised| Redesign[Full redesign needed]
  • Content Scrambling System (CSS) ของ DVD (1996) — ระบบ​เข้า​รหัส​ป้องกัน​การ​คัด​ลอก DVD พึ่งพา​การ​ปิดบัง algorithm เป็น​หลัก ในปี 1999 โปรแกรมเมอร์​ชาว​นอร์เวย์ Jon Lech Johansen ทำ reverse engineer จาก​เครื่องเล่น DVD เชิง​พาณิชย์​เครื่อง​หนึ่ง แล้ว​ปล่อย​เครื่องมือ DeCSS ที่​ถอดรหัส​แผ่น​ได้​ใน​ไม่​กี่​วินาที เพราะ CSS ออกแบบ​มา​โดย​ฝาก​ความ​หวัง​ไว้​ที่​ความ​ลับ​ของ algorithm ล้วน ๆ เมื่อ algorithm หลุด ระบบ​ทั้ง​ระบบ​ก็​ใช้​ไม่​ได้​ทันที​สำหรับ​ทุก​แผ่น​ที่​เคย​ผลิต​มา — ตัวอย่าง​คลาสสิก​ของ​การ​ละเมิด Kerckhoffs’s Principle
  • AES (Advanced Encryption Standard) — ตรง​ข้าม​กับ CSS โดย​สิ้นเชิง NIST เปิด​ให้​ทั่ว​โลก​ส่ง algorithm เข้า​ประกวด​และ​ให้​นัก​เข้า​รหัส​จาก​ทุก​ประเทศ​ช่วย​กัน​โจมตี/วิเคราะห์​อย่าง​เปิดเผย​หลาย​ปี​ก่อน​เลือก Rijndael เป็น​มาตรฐาน ทุก​วัน​นี้​ทุก​คน​รู้ algorithm ของ AES ทั้งหมด ความ​ปลอดภัย​ขึ้น​อยู่​กับ​ความ​ยาว​และ​ความ​ลับ​ของ key เท่านั้น — ระบบ​ยัง​ไม่​เคย​ถูก​เจาะ​ใน​ทาง​ปฏิบัติ
  • Hardcoded credential ใน source code / mobile app — เหตุการณ์​ที่​พบ​ซ้ำ ๆ ใน​อุตสาหกรรม​คือ​ทีม​พัฒนา​ฝัง API key หรือ​รหัส​ผ่าน​ฐาน​ข้อมูล​ลง​ใน source code ที่ commit เข้า public GitHub repository หรือ​ฝัง​ไว้​ใน mobile app ที่ decompile ได้​ง่าย เมื่อ obfuscation ถูก​ถอด​หรือ repo รั่ว ความ​ลับ​ก็​หลุด​พร้อม​กับ​ความ​มั่นใจ​ที่​ผิด​ว่า “code ปิด​อยู่​แล้ว​ไม่มี​ใคร​เห็น”
  • Diebold electronic voting machines (ต้น 2000s) — นัก​วิจัย​ด้าน​ความ​ปลอดภัย​พบ​ว่า​ระบบ​พึ่งพา​การ​ปิดบัง source code และ hardware design เป็น​หลัก เมื่อ source code หลุด​ออก​มา (โดย​ไม่​ตั้งใจ) นัก​วิจัย​พบ​ช่อง​โหว่​ร้ายแรง​จำนวน​มาก​ที่​ไม่​เคย​ถูก​ตรวจสอบ​แบบ​เปิด​มา​ก่อน สะท้อน​ความ​เสี่ยง​ของ​ระบบ security-critical ที่​ปฏิเสธ​การ​ตรวจสอบ​สาธารณะ
  • แยก code ออก​จาก secret เสมอ ใน​โครงสร้าง​ระบบ​จริง: เก็บ connection string, API token, signing key ไว้​ใน secrets manager (เช่น environment variable ที่ inject ตอน deploy, หรือ vault) ไม่ใช่​ใน source code หรือ config ที่ commit เข้า repository
  • อย่า​ไว้ใจ obfuscation หรือ minification เป็น​มาตรการ​ความ​ปลอดภัย — มัน​ช่วย​ชะลอ​ผู้​โจมตี​มือใหม่​ได้​บ้าง แต่​ไม่ใช่​การ​ป้องกัน​จริง ต้อง​มี authentication/authorization ที่แท้​จริง​อยู่​เบื้องหลัง​เสมอ (ดู Authentication และ Authorization)
  • ออกแบบ​ระบบ​ให้ rotate key ได้​ง่าย — ถ้า​โครงสร้าง​ระบบ​ผูก key ไว้​แน่น​จน​เปลี่ยน​ไม่​ได้​โดย​ไม่ downtime ก็​เท่ากับ​กำลัง​สร้าง​จุด​เปราะบาง​แบบ​เดียว​กับ secret algorithm การ rotate credential ควร​เป็นกระบวนการ​ปกติ ไม่ใช่​เหตุการณ์​ฉุกเฉิน
  • เปิด​ใจ​ให้ code ถูก​ตรวจสอบ ไม่​ว่า​จะ​เป็น code review ภายใน​ทีม​หรือ open source — ยิ่ง​มี​สายตา​ตรวจสอบ​มาก​เท่าไร ยิ่ง​พบ​จุด​อ่อน​เร็ว​ขึ้น​เท่านั้น แนวคิด​นี้​สอดคล้อง​กับ Linus’s Law ที่​ว่า “ตา​ที่​มาก​พอ​ทำให้ bug ทุก​ตัว​ตื้น”
  • อย่า​ออกแบบ​ระบบ​ที่​ปลอดภัย​ได้​ก็​ต่อ​เมื่อ​ไม่มี​ใคร​รู้​ว่า​มัน​ทำงาน​อย่างไร — ถ้า​พบ​ว่า​ตัวเอง​กำลัง​พึ่งพา​การ​ซ่อน business logic หรือ​ปิดบัง​โครงสร้าง​ระบบ​เพื่อ​ความ​ปลอดภัย นั่น​คือ​สัญญาณ​ให้​กลับ​ไป​ออกแบบ authentication/authorization ให้​แข็งแรง​กว่า​เดิม เพราะ security ที่แท้​จริง​ต้อง​รอด​แม้​ผู้​โจมตี​มี source code ทั้งหมด​อยู่​ใน​มือ
  • นำ​ไป​ปรับ​ใช้​กับ software engineering ทั่วไป ไม่​จำกัด​แค่ cryptography: การ​เก็บ password เป็น hash, การ​ใช้ signed token แทน session ที่​เดา​ได้, การ​ใช้ least-privilege access control ล้วน​เป็นการ​นำ Kerckhoffs’s Principle มา​ประยุกต์​ใช้​ใน​บริบท​กว้าง​กว่า​การ​เข้า​รหัส​ข้อความ