การตรวจสอบสิทธิ์ API โทเค็น VS โทเค็นแบบไดนามิกครั้งเดียว


13

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

คำแนะนำแรก: (โทเค็น AKA แบบคงที่หนึ่งครั้ง)

  1. ลูกค้าร้องขอโทเค็นหลักโดยการส่งชื่อผู้ใช้และรหัสผ่านและ current_time (ตัวแปรนี้จะถูกบันทึกไว้ในฐานข้อมูลของเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ด้วย) ไปยัง api เซิร์ฟเวอร์ตีความอินพุตและแสดงโทเค็นที่ถูกแฮช (เช่น: 58f52c075aca5d3e07869598c4d66648) บันทึกไว้ในฐานข้อมูลและส่งคืนไปยังไคลเอนต์

  2. ตอนนี้ไคลเอนต์จะบันทึกโทเค็นหลักและสร้างโทเค็นแฮชใหม่โดยใช้โทเค็นหลัก + ตัวแปร current_time ที่ส่งในคำขอการตรวจสอบสิทธิ์ (ให้เรียกโทเค็นใหม่นี้ว่า main_token) ด้วยเซิร์ฟเวอร์ทำเหมือนกันและสร้างโทเค็นเดียวกัน .

  3. ทุกครั้งที่ลูกค้าสอบถามเซิร์ฟเวอร์ API มันจะส่ง main_token ไปยังเซิร์ฟเวอร์ตอนนี้เซิร์ฟเวอร์จะเปรียบเทียบโทเค็นที่สร้างในนั้นโดยที่ main_token ส่งมาจากลูกค้าหากตรงกับมันหมายความว่าผู้ใช้เป็นของจริง

คำแนะนำที่สอง: (โทเค็นไดนามิก)

  1. ไคลเอนต์สร้างสองคีย์สุ่ม ($ key1 = rand (10,000,90000); $ key2 = แรนด์ (10,000,90000);) ในแต่ละคำขอบน API ลูกค้าจะสร้างแฮชโดยใช้ประเภทคิวรีและสองคีย์ด้วย อัลกอริทึมที่ซับซ้อนและส่งสองคีย์เหล่านี้ + แฮชไปยังเซิร์ฟเวอร์

  2. เซิร์ฟเวอร์ที่ใช้อัลกอริทึมเดียวกับที่ใช้ในไคลเอนต์สร้างแฮชและเปรียบเทียบกับเซิร์ฟเวอร์ที่ส่งโดยไคลเอนต์หากตรงกับเซิร์ฟเวอร์จะจัดการกับแบบสอบถาม


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


2
วิธีที่สองคือสื่อการตรวจสอบสิทธิ์ มีจะต้องเป็นสิ่งที่มีต้นกำเนิดจากเซิร์ฟเวอร์ที่ใช้งานของลูกค้าในเทคนิครับรองความถูกต้องมิฉะนั้นไม่มีทางที่จะรู้ว่าไม่มีกรณีที่ลูกค้าเพิ่งทำขึ้นที่สำคัญ ในเทคนิคที่สองเซิร์ฟเวอร์จะเกิดอะไรขึ้นเมื่อการเข้าสู่ระบบเสร็จสมบูรณ์ซึ่งให้แก่ลูกค้าเพื่อรับประกันว่าลูกค้าจะเหมือนกันกับที่ได้ให้ไว้
จิมมี่ฮอฟฟา

1
บางทีฉันอาจจะพลาดบางสิ่งบางอย่าง ... แต่ทำไมไม่ใช้ OAuth เป็นกลไกการตรวจสอบสิทธิ์ มันเป็นมาตรฐานและจะมีห้องสมุดสำหรับลูกค้าของคุณที่จะใช้ในทุกภาษา
Icode4food

คำตอบ:


14

ฉันชอบวิธีแรกโดยทั่วไป

  • ง่ายต่อการเข้าใจและนำไปใช้
  • มันปลอดภัย (สำหรับความรู้ของฉัน)
  • มันเป็นวิธีการที่ไม่แปลกที่ฉันเคยเห็นมาแล้วในอดีต

สิ่งหนึ่งที่ฉันไม่เห็นพูดถึงเกี่ยวกับครั้งแรกที่คุณควรจำไว้เวลาที่ใช้ในการแฮ็กโทเค็นต้องมีการหมดอายุ TTL ที่สั้นมาก (เช่น 1 วินาที) ดังนั้นคุณยืนยันว่าข้อความไม่ได้ถูกส่งด้วย เวลาและโทเค็นเดียวกันจากข้อความก่อนหน้านี้ 12 ชั่วโมง เห็นได้ชัดว่ามันจะคำนวณเป็น legit แต่ไม่ได้อยู่ในกรณีนี้

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

โปรดทราบว่าฉันไม่ใช่ผู้เชี่ยวชาญด้านความปลอดภัย


OAuth / สหพันธ์

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

มือโปร:

  • ตามมาตรฐาน
  • ผู้อื่นจะพบปัญหาในระบบของผู้อื่นดังนั้นคุณจะพบว่ามีความไม่มั่นคงเกิดขึ้นหรือไม่
  • คุณต้องการการรับรองความถูกต้องน้อยกว่ามาก

Con:

  • คุณต้องจัดการกับผู้ให้บริการบุคคลที่สามและ API หรือสร้างและโฮสต์ "บุคคลที่สาม" ของคุณเองเพื่อแยกการรับรองความถูกต้องออกจากบริการหลักของคุณ
  • สำหรับบริการที่มากเกินไป แต่แนวคิดในการพิจารณาคุ้มค่า

ใบรับรองแบบอะซิงโครนัส

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

จากNovell (ใช่ฉันรู้แล้วnovellจริงเหรอ?)

โทเค็นใช้ตัวแปรเป็นพื้นฐานในการสร้างรหัสผ่านครั้งเดียว ตัวแปรนี้เรียกว่าการท้าทาย สองวิธีหลักในการพิจารณาตัวแปรที่ใช้ในการสร้างรหัสผ่านนั้นไม่ตรงกันหรือแบบซิงโครนัส

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

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

มือโปร:

  • ใบรับรองมีรากฐาน CA ซึ่งทำให้พวกเขาเชื่อถือได้และยากที่จะปลอมแปลง
  • มีสิ่งอำนวยความสะดวกมาตรฐานในระบบปฏิบัติการสำหรับการจัดการและบำรุงรักษาร้านค้าใบรับรองได้อย่างง่ายดาย
  • วิธีการศึกษาที่ดีข้อมูลมากมายที่มีอยู่
  • หมดอายุพร้อมกับสิ่งอื่น ๆ อีกมากมายเป็นสิ่งอำนวยความสะดวกที่สร้างขึ้นในใบรับรองมาตรฐานพวกเขามักจะแข็งแกร่ง

Con:

  • ใบรับรองอาจเป็นเรื่องยุ่งยากในการทำงานกับโปรแกรม
  • ขึ้นอยู่กับว่าคุณต้องการ CA ภายนอกหรือไม่อาจไม่ฟรี
  • อาจต้องบำรุงรักษาที่จัดเก็บใบรับรองด้วยตนเองเพื่อให้แน่ใจว่ามีการกำหนดค่าความน่าเชื่อถือของรูทไว้

NTLM

อย่าหัวเราะถ้านี่เป็นบริการเล็ก ๆ หรือภายในเท่านั้นและคุณอยู่ในสภาพแวดล้อมของ Windows ไม่มีอะไรผิดปกติกับการใช้การรับรองความถูกต้อง NTLM มาตรฐานเพื่อรับประกันการเข้าถึง โดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับ IIS นี่เป็นวิธีที่ง่ายที่สุด ง่ายต่อการบำรุงรักษาและกำหนดค่าเช่นกันใน web.config

มือโปร:

  • ง่ายต่อการกำหนดค่าใช้งานและบำรุงรักษา

Con:

  • การทำงานร่วมกันน้อยที่สุด
  • ไม่เพียงพอสำหรับการพิสูจน์ตัวตนแบบสาธารณะ

ขณะปัจจุบัน

เมื่อทำงานกับ nonces ในแนวทางการพิสูจน์ตัวตนของคุณคุณจัดหาวิธีการรับ nonce บนบริการ เมธอดนี้ส่งคืนสตริงหรือชิ้นส่วนของข้อมูลโดยพลการ ("nonce") ในแต่ละคำขอ ทุกการร้องขอไปยังเมธอดอื่นต้องการการดึงข้อมูล nonce และใช้ในอัลกอริทึม crypto สำหรับการร้องขอ ค่าที่นี่คือเซิร์ฟเวอร์ติดตามการใช้ nonces และไม่อนุญาตให้นำกลับมาใช้ nonce อีกครั้งนี่เป็นการป้องกันการโจมตีซ้ำอย่างสมบูรณ์เนื่องจากเมื่อมีการร้องขอที่มีหนึ่ง nonce คำร้องขอที่มี nonce จะไม่สามารถทำได้อีกครั้ง เมื่อมีการร้องขอให้เพิ่มแนวนอนพวกมันจะถูกเพิ่มไปยังรายการของช่องว่างที่มีอยู่เนื่องจากมีการใช้แนวนอนพวกเขากำลังย้ายจากรายการที่มีอยู่ไปยังรายการที่ใช้

มือโปร:

  • เล่นซ้ำการโจมตีค่อนข้างดี
  • ไม่ยากที่จะนำไปปฏิบัติหรือเข้าใจโดยสิ้นเชิง

Con:

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

ฉันสงสัยว่า TTL อาจต้องใช้เวลานานกว่าหนึ่งวินาทีแม้ว่าจะน้อยกว่าหนึ่งนาที (สมมติว่า HTTP / HTTPS เป็นระบบขนส่ง) TTL ขึ้นอยู่กับเวลาล่าช้าของการขนส่ง (กล่าวคือนานกว่าสำหรับอีเมลมากกว่าการเชื่อมต่อโดยตรง)
Donal Fellows

1
คุณลืมKerberos และฉันจะวางคำเตือนที่แข็งแกร่งเป็นพิเศษกับการม้วนแพ็คเกจการตรวจสอบ / โทเค็นของคุณเองตามที่คำถามแนะนำ RYO รับรองความถูกต้องผิดง่ายมาก ตัวอย่างจะใช้การเว้นวรรคที่สำคัญเพียง 80,000 5 หลักตัวเลข (จากกรณีที่ 2 ของ OP) คุณจะต้องระมัดระวังในสิ่งที่คุณใช้แฮช (จากกรณีที่ 1) ตอนนี้หลายคนแตกหักเล็กน้อยจากการค้นหาตารางรุ้ง

1
ขอบคุณมากกับคำตอบฉันย้ายจากโครงการนั้น แต่ฉันจะเก็บคำถามนี้ไว้ในรายการโปรดของฉัน ขออภัยที่ฉันไม่ยอมรับคำตอบของคุณเนื่องจากละเอียดมาก แต่อะไรคือสิ่งที่เกิดขึ้นกับนิยายไม่ดี? :(
SAFAD

@SAFAD ไม่มีอะไรเลวร้ายเกี่ยวกับ Novell ฉันเพิ่งถูกขว้างเมื่อมองหาแหล่งข้อมูลเกี่ยวกับรายละเอียดความปลอดภัยที่ฉันพบบางสิ่งที่ทันสมัยจาก Novell ฉันคิดว่า บริษัท นั้นเสียชีวิตไปหลายปีย้อนกลับมานานมาแล้วตอนนี้ ฉันซาบซึ้งที่ยอมรับทุกอย่างเหมือนกันเมื่อเกลนกล่าวถึงมันอาจจะละเอียดกว่า แต่ฉันพยายามที่จะให้ภาพรวมที่เรียบง่ายของวิธีการปกติ Kerberos เป็นผู้กำกับดูแลที่ดีและเป็นตัวเลือกที่ดี .. บางทีฉันจะเพิ่มเข้าไปในตอนนี้ ..
จิมมี่ฮอฟฟา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.