ฉันทำงานกับ API สำหรับบริการ REST ที่ฉันจะผลิตและบริโภค ฉันใช้เวลาไม่กี่วันที่ผ่านมาพยายามหาวิธีจัดการกับการรับรองความถูกต้องอย่างดีและคิดว่าในที่สุดฉันก็คิดอะไรบางอย่าง
ฉันกำลังทำสิ่งนี้ตามข้อเท็จจริงต่อไปนี้เกี่ยวกับสแต็กแอปพลิเคชัน:
- ไคลเอ็นต์ & เซิร์ฟเวอร์อยู่ใน. NET4 (ส่วนลูกค้าในโปรไฟล์ลูกค้า)
- เซิร์ฟเวอร์แสดงโดยใช้ WCF REST
- ฉันไม่ต้องการเก็บชื่อผู้ใช้และรหัสผ่านไว้ในหน่วยความจำในแอพ
จาก 3 ฉันต้องการใช้รูปแบบการตรวจสอบความถูกต้องของโทเค็นเพื่อให้หลังจากที่ข้อมูลรับรองถูกตรวจสอบโดยเซิร์ฟเวอร์ลูกค้าจะได้รับโทเค็นกลับมาใช้ตลอดช่วงเวลาที่เหลือของแอป (สิ่งนี้จะทำให้ฉันทำสิ่งอื่น ๆ เช่น หมดเวลาผู้ใช้สามารถย้ายผู้ใช้อย่างต่อเนื่องระหว่างเว็บและเดสก์ท็อปเวอร์ชัน ฯลฯ ) หลังจากหาวิธีการโทรซ้ำและป้องกันการรบกวนฉันได้รับสิ่งต่อไปนี้:
- ก่อนที่ลูกค้าจะพยายามพิสูจน์ตัวตนมันจะสร้างคู่คีย์ Diffie-Hellman โดยใช้
ECDiffieHellmanCng
คลาส - มันจะส่งส่วนสาธารณะของคู่กุญแจผ่านสายพร้อมกับชื่อผู้ใช้และรหัสผ่าน (ผ่าน HTTPS แน่นอน)
- เซิร์ฟเวอร์รับรองความถูกต้องของชื่อผู้ใช้ / รหัสผ่านหากทำสำเร็จจะทำสิ่งต่อไปนี้:
- สร้างโทเค็นเซสชันที่ไม่ซ้ำกัน
- สร้างคู่คีย์ DH ของตนเองและคำนวณความลับที่ใช้ร่วมกันจากพับลิกคีย์ที่ลูกค้าให้ไว้
- บันทึกโทเค็นเซสชันความลับที่ใช้ร่วมกันผู้ใช้และเวลา "การกระทำล่าสุด" (ใช้สำหรับหน้าต่างหมดอายุการหมุน) ในฐานข้อมูล
- ส่งคืนโทเค็นเซสชันคีย์สาธารณะ DH และข้อความยืนยันความสำเร็จในการตรวจสอบความถูกต้อง
- ไคลเอ็นต์ใช้คีย์ DH จากการตอบสนองคำนวณความลับที่ใช้ร่วมกันและเก็บทั้งโทเค็นและความลับในหน่วยความจำ
จากจุดนี้เป็นต้นไปการรวมโทเค็นโทเค็น / ความลับทำงานเหมือนกับ REST API อื่น ๆ ส่วนใหญ่โดยมีการร้องขอลายนิ้วมือและประทับเวลาจากนั้นสร้าง HMAC บางประเภท เมื่อใดก็ตามที่ลูกค้าดำเนินการกับเซิร์ฟเวอร์ลูกค้าจะตรวจสอบคู่โทเค็น / ลับและอนุญาตให้ดำเนินการหากถูกต้องและไม่หมดอายุและอัปเดตบันทึกการกระทำล่าสุดในเซสชัน
ฉันไม่เห็นข้อบกพร่องที่ชัดเจนใด ๆ และอาจมีการวางแผนอย่างหนักในเรื่องนี้ แต่ฉันต้องเรียนรู้วิธีการทำสิ่งนี้ในบางจุด HMAC ป้องกันการโจมตีซ้ำ, การเจรจา DH ช่วยป้องกันการโจมตี MITM (ฉันไม่สามารถนึกถึงการโจมตีที่ใช้การได้จากหัวของฉันระหว่าง HMAC / DH)
มีหลุมใดที่ใครสามารถกระตุ้นได้