ไทย

เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · ตัวถอดรหัส JWT

กายวิภาคของ JWT: การแยกจุดและการถอดรหัส Base64url

· มันทำงานอย่างไร

jwt การเข้ารหัส ความปลอดภัย

JWT สามส่วนมีป้ายกำกับว่าส่วนหัว เพย์โหลด และลายเซ็น
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

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

สตริงแบบยาวในส่วนหัวของการอนุญาต — สิ่งที่คุณกำลังมองหาและเหตุใดจึงมีจุดสองจุดพอดี

โทเค็นผู้ถือมักจะมาถึงในส่วนหัวของการอนุญาตเป็นสตริงที่มีขนาดกะทัดรัดและคั่นด้วยจุด JWT ที่ลงชื่อทั่วไปในรูปแบบ JWS แบบกะทัดรัดจะมีสามส่วน ดังนั้นจึงมีจุดแยกสองจุด โทเค็นที่ใช้งานอยู่เป็นข้อมูลประจำตัว: อย่าวางโทเค็นที่ใช้งานจริงในการสาธิต

การทำให้เป็นอนุกรมแบบกระชับ — ส่วนหัว เพย์โหลด และลายเซ็นเป็นสามเซ็กเมนต์ base64url

ในการจัดอนุกรม JWS แบบกะทัดรัด ส่วนแรกคือส่วนหัวที่ได้รับการป้องกัน ส่วนที่สองคือเพย์โหลด และส่วนที่สามคือลายเซ็นหรือ MAC ลายเซ็นครอบคลุมสองส่วนแรกที่เข้ารหัส โดยมีจุดร่วมกัน การแยกสตริงจะค้นหาตำแหน่งส่วนต่างๆ มันไม่สามารถสร้างความไว้วางใจได้

Base64url ที่ไม่มีช่องว่างภายใน — ตัวอักษร JWS ใช้และเหตุใดกลุ่มจึงไม่มีเครื่องหมายเท่ากับต่อท้าย

Base64url ใช้ - และ _ แทน + และ / ใน Base64 ธรรมดา กระชับ JWS ละเว้นส่วนต่อท้าย = ช่องว่างภายใน; ตัวถอดรหัสสามารถคืนค่าช่องว่างภายในก่อนถอดรหัสได้ การถอดรหัสจะสร้างไบต์ สำหรับส่วนหัวและการอ้างสิทธิ์ JSON ให้ถอดรหัสไบต์เป็น UTF-8 ก่อนที่จะแยกวิเคราะห์ข้อความ

ส่วนหัว - วัตถุ JSON ขนาดเล็กที่ตั้งชื่ออัลกอริทึมและบ่อยครั้งเป็นคีย์

โดยปกติแล้วส่วนหัวจะเป็น JSON ที่มี alg และบางครั้งก็เป็นตัวระบุคีย์ kid สิ่งเหล่านี้เป็นการยืนยันที่ทำโดยโทเค็นเอง ผู้ตรวจสอบจะต้องบังคับใช้นโยบายอัลกอริธึมที่อนุญาตของตนเองและรับคีย์ที่เหมาะสมอย่างปลอดภัย การอ่าน alg เพียงอย่างเดียวไม่ถือเป็นการอนุญาต

เพย์โหลด — ออบเจ็กต์การอ้างสิทธิ์ JSON ซึ่งใครก็ตามที่ถือโทเค็นสามารถอ่านได้

เพย์โหลดมีการอ้างสิทธิ์เช่น sub, exp และ aud ใครก็ตามที่ถือโทเค็นสามารถอ่านได้ การเข้ารหัสไม่ใช่การเข้ารหัส exp NumericDate นับวินาทีนับตั้งแต่ยุค Unix แต่การอ้างสิทธิ์ที่ไม่ได้รับการยืนยันไม่มีอำนาจ อย่าเก็บความลับไว้ในเพย์โหลดที่อ่านได้

ลายเซ็น — ไบต์ดิบในสองส่วนแรก ไม่มีความหมายเหมือนข้อความและไม่มีประโยชน์หากไม่มีคีย์

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

ตัวอย่างการทำงาน — ถอดรหัสส่วนโทเค็นตัวอย่างตามเซ็กเมนต์ รวมถึง JSON ที่ปรากฏขึ้น

ใช้ส่วนหัวการสาธิตที่ไม่ละเอียดอ่อน {"alg":HS256"typ"JWT"} และเพย์โหลด {"sub":demo "} การเข้ารหัส base64url คือ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 และ eyJzdWIiOiJkZW1vIn0 การถอดรหัสจะกู้คืน JSON การต่อท้ายส่วนที่สามตามอำเภอใจไม่ได้ทำให้โทเค็นมีความถูกต้อง

ประเด็นสำคัญ: การถอดรหัสคือการอ่าน ไม่น่าเชื่อถือ — ตัวถอดรหัส ToolAcre JWT แสดงส่วนหัวและเพย์โหลด และไม่เคยตรวจสอบลายเซ็น ดังนั้นจึงไม่มีอะไรพิสูจน์ว่าโทเค็นเป็นของแท้

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