PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ
ทำความเข้าใจ Proof Key for Code Exchange และวิธีป้องกันการโจมตีดักจับ authorization code
PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
การดักจับรหัสการอนุญาต
หากไม่มี PKCE แอปพลิเคชันบนอุปกรณ์เคลื่อนที่จะเสี่ยงต่อการโจมตีด้วยการดักจับรหัสการอนุญาต เมื่อเซิร์ฟเวอร์การอนุญาตเปลี่ยนเส้นทางรหัสการอนุญาตไปยังรูปแบบ URI แบบกำหนดเองที่ลงทะเบียนไว้ของแอป (เช่น myapp://callback) แอปที่เป็นอันตรายใด ๆ บนอุปกรณ์เดียวกันซึ่งลงทะเบียนรูปแบบ URI เดียวกันก็สามารถดักจับการเปลี่ยนเส้นทางและขโมยรหัสดังกล่าวได้
วิธีการดักจับทำงาน
การโจมตีทำงานดังนี้: แอปที่เป็นอันตรายลงทะเบียนรูปแบบ URI แบบกำหนดเองเดียวกับแอปที่ถูกต้อง เมื่อเซิร์ฟเวอร์การอนุญาตเปลี่ยนเส้นทางรหัสไปยัง myapp://callback OS อาจแสดงแอปทั้งสองเป็นตัวจัดการ หากผู้ใช้เลือกแอปที่เป็นอันตราย หรือ OS กำหนดให้แอปนั้นเป็นค่าเริ่มต้น ผู้โจมตีจะได้รับรหัสการอนุญาตและสามารถแลกรหัสเป็นโทเค็นได้โดยไม่ต้องทราบข้อมูลลับของไคลเอนต์
ตัวตรวจสอบรหัส PKCE
PKCE (RFC 7636) เพิ่มข้อมูลลับที่สร้างขึ้นแบบไดนามิกลงในกระบวนการรหัสการอนุญาต ก่อนเริ่มกระบวนการ ไคลเอนต์จะสร้างสตริงสุ่มที่ผ่านการสุ่มอย่างปลอดภัยทางการเข้ารหัสและมีความยาว 43-128 อักขระ เรียกว่าตัวตรวจสอบรหัส สตริงนี้ไม่ซ้ำกันในคำขอการอนุญาตแต่ละครั้ง และจะไม่ถูกส่งไปจนกว่าจะถึงขั้นตอนแลกเปลี่ยนโทเค็น
การคำนวณรหัสท้าทาย
ไคลเอนต์คำนวณรหัสท้าทายจากตัวตรวจสอบรหัส: code_challenge = BASE64URL(SHA256(code_verifier)) การใช้ SHA256 เป็นวิธีที่ RFC 7636 กำหนด (วิธี "plain" ซึ่งส่งตัวตรวจสอบรหัสโดยตรงไม่ใช่วิธีที่แนะนำ) รหัสท้าทายเป็นการแปลงตัวตรวจสอบรหัสทางเดียว ซึ่งหมายความว่าการทราบรหัสท้าทายไม่ได้ทำให้ทราบตัวตรวจสอบรหัส
การใส่รหัสท้าทายในการขออนุญาต
คำขอการอนุญาตจะมีพารามิเตอร์เพิ่มเติมสองรายการ: "code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256" เซิร์ฟเวอร์การอนุญาตจะจัดเก็บรหัสท้าทายที่เชื่อมโยงกับรหัสการอนุญาตที่ออกให้ ในขั้นตอนนี้จะไม่มีการส่งข้อมูลลับไปยังเซิร์ฟเวอร์ ซึ่งช่วยป้องกันไม่ให้ข้อมูลลับถูกดักจับ
การแลกเปลี่ยนโทเค็นด้วยตัวตรวจสอบรหัส
ระหว่างการแลกเปลี่ยนโทเค็น (คำขอ POST ไปยังปลายทางโทเค็น) ไคลเอนต์จะส่ง "code_verifier=ORIGINAL_RANDOM_STRING" ไปพร้อมกับรหัสการอนุญาต เซิร์ฟเวอร์การอนุญาตจะคำนวณ BASE64URL(SHA256(code_verifier)) และตรวจสอบว่าตรงกับ code_challenge ที่จัดเก็บไว้ มีเพียงไคลเอนต์ที่ถูกต้องซึ่งสร้างตัวตรวจสอบรหัสเท่านั้นที่ผ่านการตรวจสอบนี้ได้
เหตุใดการดักจับจึงล้มเหลวเมื่อใช้ PKCE
หากผู้โจมตีดักจับรหัสการอนุญาตได้ ผู้โจมตีจะได้รับเพียงรหัสและรหัสท้าทายซึ่งเปิดเผยต่อสาธารณะเท่านั้น หากต้องการแลกรหัสเป็นโทเค็น ผู้โจมตีต้องส่งตัวตรวจสอบรหัสมาด้วย เนื่องจากตัวตรวจสอบรหัสสร้างโดยไคลเอนต์ที่ถูกต้องและไม่เคยถูกส่งจนกว่าจะถึงขั้นตอนแลกเปลี่ยนโทเค็น ซึ่งเกิดขึ้นอย่างปลอดภัย ผู้โจมตีจึงไม่สามารถคำนวณหรือค้นคืนตัวตรวจสอบรหัสได้
PKCE ป้องกันการแทรกรหัส
PKCE ยังป้องกันการโจมตีแบบแทรกรหัสการอนุญาต ซึ่งผู้โจมตีแทนที่รหัสที่ถูกต้องด้วยรหัสที่ขโมยมาในการเปลี่ยนเส้นทาง ค่าท้าทายของรหัสที่ขโมยมาไม่ตรงกับตัวตรวจสอบที่ไคลเอ็นต์ของเหยื่อจะนำเสนอ ทำให้การแลกเปลี่ยนโทเค็นล้มเหลว PKCE มอบการป้องกันหลายชั้นต่อช่องทางการโจมตีหลายรูปแบบพร้อมกัน
PKCE สำหรับไคลเอ็นต์ทุกประเภท
แม้ว่า RFC 7636 จะอธิบายไว้ในตอนแรกว่าเป็นวิธีแก้ปัญหาสำหรับไคลเอ็นต์สาธารณะ (ไคลเอ็นต์ที่ไม่มีความลับของไคลเอ็นต์) แต่ OAuth Security BCP และ OAuth 2.1 กำหนดให้ไคลเอ็นต์ทุกประเภทต้องใช้ PKCE รวมถึงไคลเอ็นต์แบบเก็บความลับที่มีความลับของไคลเอ็นต์ด้วย PKCE มอบการป้องกันที่ไม่ขึ้นกับการตรวจสอบสิทธิ์ของไคลเอ็นต์ จึงเป็นประโยชน์กับไคลเอ็นต์ทุกประเภท
PKCE ใน OAuth 2.1
OAuth 2.1 (draft-ietf-oauth-v2-1) รวบรวมแนวปฏิบัติที่ดีที่สุดด้านความปลอดภัยจาก OAuth 2.0 Security BCP ไว้ในเอกสารฉบับเดียว โดยกำหนดให้กระบวนการใช้รหัสการอนุญาตทุกแบบต้องใช้ PKCE ยกเลิกการใช้กระบวนการโดยนัย และกำหนดให้ต้องหมุนเวียนโทเค็นการต่ออายุ PKCE จึงเป็นพื้นฐานขั้นต่ำที่จำเป็นสำหรับการนำ OAuth 2.0 ไปใช้ใหม่ทุกกรณี
หมายเหตุการนำไปใช้
การนำ PKCE ไปใช้อย่างถูกต้องต้องดำเนินการดังนี้ ใช้ตัวสร้างสุ่มที่ปลอดภัยทางการเข้ารหัสสำหรับตัวตรวจสอบ (ไบต์สุ่มอย่างน้อย 32 ไบต์ แล้วเข้ารหัสเป็น base64url) เก็บตัวตรวจสอบอย่างปลอดภัยในไคลเอ็นต์ (ไม่เก็บไว้ใน URL หรือบันทึก) ใช้วิธีการ S256 (ไม่ใช่ plain) และตรวจสอบให้แน่ใจว่าทิ้งตัวตรวจสอบหลังจากแลกเปลี่ยนโทเค็นแล้ว ไลบรารี OAuth สมัยใหม่ส่วนใหญ่จัดการ PKCE โดยอัตโนมัติ
การตรวจสอบตัวตรวจสอบรหัสของ PKCE
ใน PKCE ตัวตรวจสอบรหัสและค่าท้าทายรหัสมีความสัมพันธ์กันอย่างไร
สรุปบทเรียน: ความปลอดภัยของ PKCE
PKCE (RFC 7636) ป้องกันการดักจับรหัสการอนุญาตโดยผูกแต่ละรหัสเข้ากับตัวตรวจสอบรหัสที่สร้างขึ้นแบบไดนามิกและมีเพียงไคลเอ็นต์ที่ถูกต้องเท่านั้นที่ทราบ ระบบจะแฮชตัวตรวจสอบเพื่อสร้างค่าท้าทายรหัส (ซึ่งส่งแบบสาธารณะ) การแลกเปลี่ยนโทเค็นต้องใช้ตัวตรวจสอบต้นฉบับ PKCE ป้องกันทั้งการโจมตีแบบดักจับและแบบแทรก OAuth 2.1 กำหนดให้กระบวนการใช้รหัสการอนุญาตทุกแบบต้องใช้ PKCE
คำถามที่พบบ่อย
บทเรียน “PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ”
ทำความเข้าใจ Proof Key for Code Exchange และวิธีป้องกันการโจมตีดักจับ authorization code คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โฟลว์ OAuth 2.0 และประเภทโทเค็น
- PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ
- Claims และ ID Tokens ของ OpenID Connect
- ช่องโหว่ OAuth และรูปแบบการโจมตี