ลิงก์วิเศษ: JWT เทียบกับสตริงแบบสุ่ม
บทช่วยสอนที่ฉันเจอเกี่ยวกับการใช้การตรวจสอบความถูกต้องของลิงก์วิเศษ (ในโหนด) แนะนำกลไกเช่นนี้:
- ผู้ใช้เข้าถึงปลายทางของคุณด้วยที่อยู่อีเมลของพวกเขา
- คุณสร้าง JWT ที่ลงนามจากอีเมลและวันที่โดยใช้คีย์คงที่ (ถ้าคุณเข้าใจมากกว่านี้คุณใช้
RS256รูปแบบไม่สมมาตรแทนแบบสมมาตรที่HS256ใช้ในบทช่วยสอนส่วนใหญ่ (ฉันคิดว่าเป็นค่าเริ่มต้น)) - ส่งอีเมลพร้อมโทเค็นเป็นพารามิเตอร์การค้นหา
- การคลิกของผู้ใช้ปลายทางถูกโจมตีคุณยืนยัน JWT จากนั้นอีเมลและวันที่ภายใน
ขอโทษสำหรับคำถามเล็ก ๆ น้อย ๆ ในสมองแต่ทำไมเราถึงต้องแฮชหรือเข้ารหัสที่นี่?
จะไม่เป็นการรอบคอบมากขึ้นที่จะสร้างสตริงขนาดใหญ่ (เช่น 50 ตัวอักษร) ที่ไม่ซ้ำกันสุ่มสตริงตัวอักษรและตัวเลข (เรียกมันว่า
LURA) จากนั้นจัดเก็บอีเมลและวันที่แล้วส่งให้ผู้ใช้หรือไม่? เมื่อปลายทางยืนยันได้รับการตีเราสามารถพูดได้ว่า"yepp ผมมีสิ่งที่ไฟล์และฉันออกมัน 2 นาทีที่ผ่านมาในที่ที่คุณไป" จุดประสงค์ของการใช้ JWT คือเพื่อยืนยันว่าฉันเป็นคนสร้างโทเค็น (ด้วยรหัสของฉัน) แต่ฉันยังสามารถตรวจสอบได้ว่าถ้าฉันเพิ่งดูว่าฉันมีLURAสตริงอยู่ในไฟล์ใช่ไหม นอกจากนี้JWT มีปัญหา ฉันมีความรู้สึกว่า JWT มีไว้เพื่อใช้เมื่อเครื่องที่ตรวจสอบความถูกต้องแตกต่างจากเครื่องที่ออกและการใช้งานเป็นอันตรายต่อความปลอดภัยในกรณีนี้คำถามโบนัส : ฉันได้อ่านหลายครั้งเกี่ยวกับการเข้ารหัสรหัสผ่านที่
SHA256เป็นวิธีอ่อนแอเกินไปใน2020Argon2และที่หนึ่งควรเลือก เหตุใดจึงเป็นRS256ทางเลือกที่ดีหากเป็น "ที่เข้าใจว่าเป็น SHA 256 พร้อมคีย์ RSA 2048 บิต"
คำตอบ
จะไม่เป็นการรอบคอบมากกว่าที่จะสร้างสตริง ...
ใช่มันจะ. โทเค็นมักจะเป็นวิธีแก้ปัญหาที่ตรงไปตรงมาและง่ายกว่าในการทำให้ถูกต้อง โซลูชันการเข้ารหัสมักมีข้อผิดพลาดหรือจำเป็นต้องนำไปใช้อย่างถูกต้องทั้งหมดเพื่อความปลอดภัย โทเค็นแบบสุ่มมีความปลอดภัยมากกว่าเพราะง่ายกว่า
JWT มีประโยชน์อย่างยิ่งเมื่อมีหลายระบบ: หากระบบหนึ่งให้โทเค็นเพื่อเข้าถึงระบบอื่นและไม่มีการเข้าถึงฐานข้อมูลเดียวกัน
SHA256 อ่อนแอเกินไปในปี 2020
SHA256 ยังคงถือเป็นฟังก์ชันแฮชวัตถุประสงค์ทั่วไปที่ปลอดภัย ปัญหาคือฟังก์ชันแฮชวัตถุประสงค์ทั่วไปไม่เหมาะกับการเข้ารหัสรหัสผ่านเนื่องจากเร็วเกินไป เนื่องจากคอมพิวเตอร์ทั่วไปสามารถคำนวณแฮช SHA256 ได้หลายพันล้านแฮชต่อวินาทีจึงเป็นไปได้ที่จะถอดรหัสรหัสผ่านโดยใช้การคาดเดาหลายพันล้านครั้งต่อวินาที
อย่างไรก็ตามใน JWT SHA256 ไม่ได้ใช้สำหรับรหัสผ่าน แต่เพื่อความสมบูรณ์ของข้อความดังนั้นจึงไม่มีปัญหาที่มันเร็ว ไม่มีอะไรให้คาดเดา
เป็นความจริงที่คุณสามารถใช้สตริงแบบสุ่มสำหรับลิงก์วิเศษและมันจะทำงานได้ดี อย่างไรก็ตามมีประโยชน์บางประการสำหรับการเลือกใช้งานโดยใช้ JWT:
- การตรวจสอบ JWT ไม่จำเป็นต้องมีการเรียกฐานข้อมูล นี่อาจเป็นประโยชน์หลักของการใช้ JWT เลย ขึ้นอยู่กับจำนวนผู้ใช้ซึ่งอาจหมายถึงความแตกต่างของประสิทธิภาพอย่างมีนัยสำคัญ
- ง่ายกว่าที่จะรวมเข้ากับกลไกการเข้าสู่ระบบที่มีอยู่เช่นผู้ให้บริการข้อมูลประจำตัว (อาจเป็นบุคคลที่สาม) ที่จัดการการสร้าง / ยืนยัน / จัดเก็บโทเค็นอยู่แล้ว สิ่งนี้มีประโยชน์เช่นหากแอปพลิเคชันของคุณใช้โทเค็นสำหรับล็อกอินผู้ใช้ด้วยชุดชื่อผู้ใช้ / รหัสผ่านแบบเดิมอยู่แล้วและต้องการเพิ่มลิงก์วิเศษเป็นตัวเลือกเพิ่มเติม
สำหรับคำถามของคุณเกี่ยวกับอัลกอริทึมสำหรับ RS256 / HS256 ใน JWT วัตถุประสงค์ไม่ได้สำหรับการเข้ารหัส แต่สำหรับการลงนาม ข้อกำหนดในอัลกอริทึมสำหรับการเข้ารหัสและการลงนามที่ปลอดภัยนั้นแตกต่างกัน (และแตกต่างกันมากขึ้นหากพูดถึงการแฮชรหัสผ่าน)
หมายเหตุเพิ่มเติมเหตุผลในการเลือกระหว่าง RS256 และ HS256 คือคุณต้องการอนุญาตให้ผู้อื่นตรวจสอบโทเค็นของคุณหรือไม่
สำหรับ RS256 คุณสร้างคู่คีย์สาธารณะ / ส่วนตัว คุณสร้างลายเซ็นโดยใช้คีย์ส่วนตัวในขณะที่บุคคลที่สามสามารถยืนยันโทเค็นที่คุณสร้างโดยใช้คีย์สาธารณะของคุณ สำหรับ HS256 คีย์สำหรับการลงนามและการยืนยันจะเหมือนกันดังนั้นโดยปกติคุณจะเก็บไว้เป็นความลับหมายถึงคุณเท่านั้นที่สามารถตรวจสอบโทเค็นได้