0Pricing
Cryptology Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โฟลว์ OAuth 2.0 และประเภทโทเค็น
  2. PKCE: การรักษาความปลอดภัยให้ไคลเอนต์สาธารณะ
  3. Claims และ ID Tokens ของ OpenID Connect
  4. ช่องโหว่ OAuth และรูปแบบการโจมตี
← กลับไปที่ Cryptology Academy