ลิงก์วิเศษ: JWT เทียบกับสตริงแบบสุ่ม

Oct 08 2020

บทช่วยสอนที่ฉันเจอเกี่ยวกับการใช้การตรวจสอบความถูกต้องของลิงก์วิเศษ (ในโหนด) แนะนำกลไกเช่นนี้:

  1. ผู้ใช้เข้าถึงปลายทางของคุณด้วยที่อยู่อีเมลของพวกเขา
  2. คุณสร้าง JWT ที่ลงนามจากอีเมลและวันที่โดยใช้คีย์คงที่ (ถ้าคุณเข้าใจมากกว่านี้คุณใช้RS256รูปแบบไม่สมมาตรแทนแบบสมมาตรที่HS256ใช้ในบทช่วยสอนส่วนใหญ่ (ฉันคิดว่าเป็นค่าเริ่มต้น))
  3. ส่งอีเมลพร้อมโทเค็นเป็นพารามิเตอร์การค้นหา
  4. การคลิกของผู้ใช้ปลายทางถูกโจมตีคุณยืนยัน JWT จากนั้นอีเมลและวันที่ภายใน

ขอโทษสำหรับคำถามเล็ก ๆ น้อย ๆ ในสมองแต่ทำไมเราถึงต้องแฮชหรือเข้ารหัสที่นี่?

  1. จะไม่เป็นการรอบคอบมากขึ้นที่จะสร้างสตริงขนาดใหญ่ (เช่น 50 ตัวอักษร) ที่ไม่ซ้ำกันสุ่มสตริงตัวอักษรและตัวเลข (เรียกมันว่าLURA) จากนั้นจัดเก็บอีเมลและวันที่แล้วส่งให้ผู้ใช้หรือไม่? เมื่อปลายทางยืนยันได้รับการตีเราสามารถพูดได้ว่า"yepp ผมมีสิ่งที่ไฟล์และฉันออกมัน 2 นาทีที่ผ่านมาในที่ที่คุณไป" จุดประสงค์ของการใช้ JWT คือเพื่อยืนยันว่าฉันเป็นคนสร้างโทเค็น (ด้วยรหัสของฉัน) แต่ฉันยังสามารถตรวจสอบได้ว่าถ้าฉันเพิ่งดูว่าฉันมีLURAสตริงอยู่ในไฟล์ใช่ไหม นอกจากนี้JWT มีปัญหา ฉันมีความรู้สึกว่า JWT มีไว้เพื่อใช้เมื่อเครื่องที่ตรวจสอบความถูกต้องแตกต่างจากเครื่องที่ออกและการใช้งานเป็นอันตรายต่อความปลอดภัยในกรณีนี้

  2. คำถามโบนัส : ฉันได้อ่านหลายครั้งเกี่ยวกับการเข้ารหัสรหัสผ่านที่SHA256เป็นวิธีอ่อนแอเกินไปใน2020Argon2และที่หนึ่งควรเลือก เหตุใดจึงเป็นRS256ทางเลือกที่ดีหากเป็น "ที่เข้าใจว่าเป็น SHA 256 พร้อมคีย์ RSA 2048 บิต"

คำตอบ

2 Sjoerd Oct 08 2020 at 18:15

จะไม่เป็นการรอบคอบมากกว่าที่จะสร้างสตริง ...

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

JWT มีประโยชน์อย่างยิ่งเมื่อมีหลายระบบ: หากระบบหนึ่งให้โทเค็นเพื่อเข้าถึงระบบอื่นและไม่มีการเข้าถึงฐานข้อมูลเดียวกัน

SHA256 อ่อนแอเกินไปในปี 2020

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

อย่างไรก็ตามใน JWT SHA256 ไม่ได้ใช้สำหรับรหัสผ่าน แต่เพื่อความสมบูรณ์ของข้อความดังนั้นจึงไม่มีปัญหาที่มันเร็ว ไม่มีอะไรให้คาดเดา

1 AlphaD Oct 08 2020 at 13:45

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

  1. การตรวจสอบ JWT ไม่จำเป็นต้องมีการเรียกฐานข้อมูล นี่อาจเป็นประโยชน์หลักของการใช้ JWT เลย ขึ้นอยู่กับจำนวนผู้ใช้ซึ่งอาจหมายถึงความแตกต่างของประสิทธิภาพอย่างมีนัยสำคัญ
  2. ง่ายกว่าที่จะรวมเข้ากับกลไกการเข้าสู่ระบบที่มีอยู่เช่นผู้ให้บริการข้อมูลประจำตัว (อาจเป็นบุคคลที่สาม) ที่จัดการการสร้าง / ยืนยัน / จัดเก็บโทเค็นอยู่แล้ว สิ่งนี้มีประโยชน์เช่นหากแอปพลิเคชันของคุณใช้โทเค็นสำหรับล็อกอินผู้ใช้ด้วยชุดชื่อผู้ใช้ / รหัสผ่านแบบเดิมอยู่แล้วและต้องการเพิ่มลิงก์วิเศษเป็นตัวเลือกเพิ่มเติม

สำหรับคำถามของคุณเกี่ยวกับอัลกอริทึมสำหรับ RS256 / HS256 ใน JWT วัตถุประสงค์ไม่ได้สำหรับการเข้ารหัส แต่สำหรับการลงนาม ข้อกำหนดในอัลกอริทึมสำหรับการเข้ารหัสและการลงนามที่ปลอดภัยนั้นแตกต่างกัน (และแตกต่างกันมากขึ้นหากพูดถึงการแฮชรหัสผ่าน)

หมายเหตุเพิ่มเติมเหตุผลในการเลือกระหว่าง RS256 และ HS256 คือคุณต้องการอนุญาตให้ผู้อื่นตรวจสอบโทเค็นของคุณหรือไม่

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