ฉันกำลังออกแบบ web api ซึ่งจำเป็นต้องให้สิทธิ์การเข้าถึงแอปไคลเอนต์ต่างๆ ผ่านรหัส api ที่ส่งเป็นส่วนหัว http ฉันรู้ ไม่ใช่ว่าควรทำอย่างไร แต่ฉันไม่สามารถควบคุมส่วนนี้ได้
การออกแบบปัจจุบันของฉันสำหรับคีย์ api: มี 16 ไบต์สำหรับรหัสแอป (guid) ในฐานข้อมูล + 16 ไบต์ที่สร้างแบบสุ่ม (keybytes) เนื่องจากนโยบายของบริษัท ฉันถูกขอให้ไม่เก็บคีย์ API ในฐานข้อมูล ดังนั้นฉันจึงเก็บแฮช sha256 ของ (clientid + คีย์ไบต์ + เกลือ) และเกลือในฐานข้อมูล
เมื่อใดก็ตามที่มีคำขอเข้ามา ฉันจะแบ่งคีย์ api ออกเป็น (id, keybytes) ค้นหาไคลเอนต์ในฐานข้อมูลด้วย id จากนั้นคำนวณ sha256 (id + keybytes + salt-from-db) และตรวจสอบว่าตรงกับฐานข้อมูลที่เก็บไว้แฮชหรือไม่ . ข้อกำหนดจากทีมรักษาความปลอดภัยขององค์กรคือไม่เก็บคีย์ api ไว้ใน db แต่เก็บแฮชไว้ (เช่นเดียวกับรหัสผ่านผู้ใช้) ฉันพิจารณา PBKDF2 ด้วย (ฉันใช้ .net 5) แต่อาจช้าเกินไปสำหรับการทำทุกๆ reuest ที่เข้ามา (ต้องเรียกใช้สำหรับแต่ละคำขอเพราะฉันไม่สามารถเปลี่ยนแอปไคลเอ็นต์เพื่อเข้าสู่ระบบผ่านการโทรช้า จากนั้นส่งโทเค็น พวกเขาควรจะส่งกุญแจไปพร้อมกับทุกคำขอ)
โดยพื้นฐานแล้ว มันก็เหมือนกับการจัดเก็บ sha256(รหัสผ่าน+เกลือ) ในฐานข้อมูลสำหรับผู้ใช้ ดังนั้นฉันจึงไม่แน่ใจว่ามัน "ดีพอ" หรือไม่ (เนื่องจากรหัสผ่านนั้นสุ่ม 16 ไบต์และรหัสผู้ใช้เป็นอีก 16 ไบต์แบบสุ่ม - คู่มือแอพและฐานข้อมูลคือ ในทางทฤษฎี ไม่สามารถเข้าถึงได้)
อีกทางเลือกหนึ่งที่ฉันมีสำหรับคีย์ api คือการใช้ AES-GCM: สร้าง nonce แบบสุ่ม (iv) และเข้ารหัสรหัสแอป (guid) ด้วยรหัสลับ (เก็บไว้เฉพาะในการตั้งค่า webapi ไม่ใช่ db) และใช้ไบต์ (nonce , encryptedid, tag) เป็นคีย์ API นี่หมายความว่าไม่มีการค้นหาฐานข้อมูลในกรณีที่คีย์ API ไม่ถูกต้อง อย่างไรก็ตาม ฉันไม่แน่ใจว่าโซลูชันนี้มีความปลอดภัยเพียงใด (หลังจากนั้น ฉันกำลังเข้ารหัสข้อมูลขนาด 128 บิตเพียงบล็อกเดียว นั่นคือ appid guid ด้วยคีย์ ในบรรดา apiclients ทั้งหมด)
อันไหนที่ "ยอมรับได้" (ถ้าเป็นทั้งสองอย่าง ฉันจะเอาอันแรกเพราะมันมีการใช้งานแล้ว) ในกรณีที่มี "การละเมิดความปลอดภัย (เช่น ฐานข้อมูลถูกขโมย) ?
ฉันรู้ว่าถ้าพวกเขาไปถึง db คีย์ api คือสิ่งที่ฉันกังวลน้อยที่สุด แต่ฉันก็ยังอยากฟังความคิดเห็น....