Score:1

เทคนิคการสร้างคีย์ API

ธง jp

ฉันกำลังออกแบบ 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 คือสิ่งที่ฉันกังวลน้อยที่สุด แต่ฉันก็ยังอยากฟังความคิดเห็น....

Score:2
ธง in

เมื่อใดก็ตามที่มีคำขอเข้ามา ฉันจะแบ่งคีย์ api ออกเป็น (id, keybytes) ค้นหาไคลเอนต์ในฐานข้อมูลด้วย id จากนั้นคำนวณ sha256 (id + keybytes + salt-from-db) และตรวจสอบว่าตรงกับฐานข้อมูลที่เก็บไว้แฮชหรือไม่ . ข้อกำหนดจากทีมรักษาความปลอดภัยขององค์กรคือไม่เก็บคีย์ api ไว้ใน db แต่เก็บแฮชไว้ (เช่นเดียวกับรหัสผ่านผู้ใช้) ฉันพิจารณา PBKDF2 ด้วย (ฉันใช้ .net 5) แต่มันอาจจะช้าเกินไปสำหรับการทำทุกๆ reuest ที่เข้ามาใหม่ (ต้องเรียกใช้สำหรับแต่ละคำขอเพราะฉันไม่สามารถเปลี่ยนแอปไคลเอนต์เพื่อเข้าสู่ระบบผ่านการโทรช้า จากนั้นส่งโทเค็น พวกเขาควรจะส่งกุญแจไปพร้อมกับทุกคำขอ)

หากคีย์ยังคงเป็นความลับและประกอบด้วย 16 ไบต์แบบสุ่มทั้งหมด ก็ไม่มีความจำเป็นสำหรับ PBKDF2; แฮชที่ปลอดภัยเป็นวิธีหนึ่งอยู่แล้ว และไม่สามารถบังคับคีย์ 128 บิตได้ อีก 16 ไบต์แบบสุ่มใน UID จะเพิ่มน้ำตาลไอซิ่งบนเค้ก เนื่องจากจะหลีกเลี่ยงปัญหาวันเกิด

โดยพื้นฐานแล้ว มันก็เหมือนกับการจัดเก็บ sha256(รหัสผ่าน+เกลือ) ในฐานข้อมูลสำหรับผู้ใช้ ดังนั้นฉันจึงไม่แน่ใจว่ามัน "ดีพอ" หรือไม่ (เนื่องจากรหัสผ่านนั้นสุ่ม 16 ไบต์และรหัสผู้ใช้เป็นอีก 16 ไบต์แบบสุ่ม - app guid และ db ไม่สามารถเข้าถึงได้ในทางทฤษฎี)

ด้วยคีย์ 128 บิต มันไม่สำคัญว่าจะมีข้อมูลสุ่มอื่น ๆ อยู่ในนั้นมากแค่ไหน มันอาจจะดีกว่าถ้าใช้ KBKDF จริง (ฟังก์ชันการสืบทอดคีย์ตามคีย์) หรือ HMAC แม้ว่าจะมีการใช้คีย์เป็นข้อมูลการป้อนข้อมูลคีย์ คุณควรตรวจสอบให้แน่ใจด้วยว่าอินพุตอยู่ในการเข้ารหัสแบบบัญญัติ - แต่ถ้าฟิลด์ทั้งหมดมีขนาดที่กำหนดไว้ล่วงหน้า คุณก็สามารถเชื่อมข้อมูลเหล่านั้นเข้าด้วยกันได้

อีกทางเลือกหนึ่งที่ฉันมีสำหรับคีย์ api คือการใช้ AES-GCM: สร้าง nonce แบบสุ่ม (iv) และเข้ารหัสรหัสแอป (guid) ด้วยรหัสลับ (เก็บไว้เฉพาะในการตั้งค่า webapi ไม่ใช่ db) และใช้ไบต์ (nonce , encryptedid, tag) เป็นคีย์ API นี่หมายความว่าไม่มีการค้นหาฐานข้อมูลในกรณีที่คีย์ API ไม่ถูกต้อง อย่างไรก็ตาม ฉันไม่แน่ใจว่าโซลูชันนี้มีความปลอดภัยเพียงใด (หลังจากนั้น ฉันกำลังเข้ารหัสข้อมูลขนาด 128 บิตเพียงบล็อกเดียว นั่นคือ appid guid ด้วยคีย์ ในบรรดา apiclients ทั้งหมด)

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

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

jp flag
กรณีการใช้งานของฉันคือแอปเดสก์ท็อป (ติดตั้งในองค์กร) โทรผ่าน https the apiวิธีการรักษาความปลอดภัยของแอปไม่ใช่ปัญหาของฉัน :) ฉันจะใช้ลำดับไบต์แบบสุ่มเป็นโทเค็น แต่ฉันได้รับข้อกำหนดพิเศษที่จะไม่เก็บไว้ในฐานข้อมูล ดังนั้นความคิดที่จะปฏิบัติต่อลำดับไบต์สุ่มเช่นรหัสผ่านและแฮช ฉันชอบที่โซลูชัน aes-gcm ไม่ต้องการให้ฉันจัดเก็บอะไรเลย แต่ฉันไม่ชอบความซับซ้อนที่มากเกินไป (รวมถึงหากมาสเตอร์คีย์ถูกบุกรุก คีย์ API ทั้งหมดจะถูกใช้)

โพสต์คำตอบ

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