กลับไปหน้าบทความ

อ่าน 5 นาที

รหัสผ่านใช้ครั้งเดียวแบบ HMAC

รหัสผ่านแบบใช้ครั้งเดียวแบบ HMAC ( HOTP ) เป็น อัลกอริ ทึมรหัสผ่านแบบใช้ครั้งเดียว (OTP) ที่ใช้ รหัสยืนยันข้อความแบบแฮช (HMAC) เมื่อไคลเอนต์พยายามเข้าถึงเซิร์ฟเวอร์...

รหัสผ่านใช้ครั้งเดียวแบบ HMAC

( เรียนรู้วิธีและเวลาในการลบข้อความนี้ )

รหัสผ่านแบบใช้ครั้งเดียวแบบ HMAC ( HOTP ) เป็น อัลกอริ ทึมรหัสผ่านแบบใช้ครั้งเดียว (OTP) ที่ใช้รหัสยืนยันข้อความแบบแฮช (HMAC) เมื่อไคลเอนต์พยายามเข้าถึงเซิร์ฟเวอร์ เซิร์ฟเวอร์ปลายทางจะส่งคำท้าไปยังไคลเอนต์ จากนั้นไคลเอนต์จะคำนวณการตอบกลับซึ่งแสดงถึงรหัสผ่านแบบใช้ครั้งเดียว ซึ่งมักจะเป็นส่วนหนึ่งของ โปรโตคอล การตรวจสอบสิทธิ์แบบหลายปัจจัยเช่น อัลกอริทึมการท้าทายและการตอบสนองของ Open Authentication Initiative (OATH) [ 1 ]

HOTP ได้รับการเผยแพร่เป็นเอกสารข้อมูลIETF RFC  4226 ในเดือนธันวาคม 2548 โดยบันทึกรายละเอียดของอัลกอริทึมพร้อมกับการใช้งานในภาษา Java ตั้งแต่นั้นมา อัลกอริทึมนี้ได้รับการนำไปใช้โดยหลายบริษัททั่วโลก (ดูด้านล่าง) อัลกอริทึม HOTP เป็นมาตรฐานเปิดที่ใช้งานได้ฟรี

อัลกอริทึม

อัลกอริทึม HOTP นำเสนอวิธีการตรวจสอบสิทธิ์โดยการสร้างรหัสผ่านที่อ่านง่ายสำหรับมนุษย์แบบสมมาตร หรือค่าต่างๆโดยแต่ละค่าจะใช้สำหรับการตรวจสอบสิทธิ์เพียงครั้งเดียวเท่านั้น คุณสมบัติการใช้เพียงครั้งเดียวนี้เกิดขึ้นโดยตรงจากการใช้ค่าตัวนับแต่ละค่าเพียงครั้งเดียว

ฝ่ายที่ประสงค์จะใช้ HOTP ต้องกำหนดเงื่อนไขบางประการพารามิเตอร์ ; โดยทั่วไปแล้ว พารามิเตอร์เหล่านี้จะถูกกำหนดโดยผู้ตรวจสอบสิทธิ์ และหน่วยงานที่ได้รับการตรวจสอบสิทธิ์จะยอมรับหรือไม่ยอมรับพารามิเตอร์เหล่านี้ก็ได้:

  • วิธีแฮชเข้ารหัสลับ H (ค่าเริ่มต้นคือSHA-1 )
  • กุญแจลับKซึ่งเป็นสตริงไบต์ใดๆ และต้องเก็บรักษาไว้เป็นความลับ
  • ตัวนับCซึ่งมีความยาว 8 ไบต์ ทำหน้าที่นับจำนวนรอบการทำงาน
  • ค่า HOTP มีความยาวd (6–10 ค่าเริ่มต้นคือ 6 และแนะนำให้ใช้ 6–8)

ทั้งสองฝ่ายคำนวณค่า HOTP ที่ได้จากรหัสลับKและตัวนับCจากนั้นตัวตรวจสอบความถูกต้องจะตรวจสอบค่าที่สร้างขึ้นในเครื่องของตนเองกับค่าที่ผู้รับการตรวจสอบความถูกต้องป้อนเข้ามา

ตัวตรวจสอบความถูกต้องและเอนทิตีที่ได้รับการตรวจสอบความถูกต้องจะเพิ่มค่าตัวนับCอย่างอิสระ เนื่องจากเอนทิตีที่ได้รับการตรวจสอบความถูกต้องอาจเพิ่มค่าตัวนับมากกว่าตัวตรวจสอบความถูกต้องRFC 4226จึงแนะนำโปรโตคอลการซิงโครไนซ์ใหม่ โดยเสนอให้ตัวตรวจสอบความถูกต้องพยายามตรวจสอบซ้ำๆ โดยมีค่ามากกว่าค่าตัวนับของตนเองในช่วงเวลาขนาดsค่าตัวนับของตัวตรวจสอบความถูกต้องจะยังคงเพิ่มขึ้นจากค่าที่การตรวจสอบสำเร็จ และไม่จำเป็นต้องมีการดำเนินการใดๆ จากเอนทิตีที่ได้รับการตรวจสอบความถูกต้อง  

เพื่อป้องกันการโจมตีแบบเดาสุ่มที่มุ่งเป้าไปที่ขนาดเล็กของค่า HOTP นั้น RFC ยังแนะนำให้ใช้การจำกัดความเร็วในการตรวจสอบ HOTP อย่างต่อเนื่อง ซึ่งสามารถทำได้โดยการล็อกการตรวจสอบหลังจากความพยายามที่ล้มเหลวจำนวนเล็กน้อย หรือโดยการเพิ่มระยะเวลาหน่วงแบบเชิงเส้นหลังจากความพยายามที่ล้มเหลวแต่ละครั้ง

โดยทั่วไปแล้ว รหัส 6 หลักจะมาจากโทเค็นฮาร์ดแวร์เฉพาะของผู้จำหน่ายหลายราย ซึ่งระบุค่าเริ่มต้นของdการตัดทอนจะดึงเอา 31 บิตหรือตัวเลขทศนิยมออกมา ซึ่งหมายความว่าdจะมีค่าได้มากที่สุด 10 โดยหลักที่ 10 จะมีความผันแปรน้อยกว่า โดยมีค่าเป็น 0, 1 และ 2 (เช่น 0.3 หลัก)

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

ค่าHOTPคือผลลัพธ์การออกแบบที่มนุษย์อ่านได้ ซึ่งเป็น ตัวเลขทศนิยม dหลัก (โดยไม่ตัดเลข 0 นำหน้า):

ค่า HOTP = HOTP ( K , C ) ม็อด10 วัน

กล่าวคือ ค่าดังกล่าวคือ ตัวเลขฐานสิบที่มีค่าน้อยที่สุด dของ HOTP

HOTPคือการตัดทอนHMACของตัวนับC (ภายใต้คีย์Kและฟังก์ชันแฮชH ):

HOTP ( K , C ) = truncate(HMAC H ( K , C )),

โดยที่ตัวนับCต้องใช้แบบbig- endian

การตัดทอนจะนำบิตที่มีค่าต่ำที่สุด 4 บิตของMACมาใช้เป็นตัวกำหนดตำแหน่งไบต์i :

truncate( MAC ) = extract31( MAC , MAC [(19 × 8 + 4):(19 × 8 + 7)]),

โดยที่ ":" ใช้สำหรับดึงบิตจากหมายเลขบิตเริ่มต้นไปจนถึงหมายเลขบิตสุดท้าย ซึ่งหมายเลขบิตเหล่านี้เริ่มต้นที่ 0 การใช้ "19" ในสูตรข้างต้นเกี่ยวข้องกับขนาดของผลลัพธ์จากฟังก์ชันแฮช ด้วยค่าเริ่มต้นของ SHA-1 ผลลัพธ์คือ20  ไบต์ดังนั้นไบต์สุดท้ายคือไบต์ที่ 19 (0-origin)

ดัชนี iนั้นใช้สำหรับเลือก 31 บิตจากMACโดยเริ่มจากบิตi × 8 + 1:

extract31( MAC , i ) = MAC [( i × 8 + 1):( i × 8 + 4 × 8 − 1)].

31 บิตนั้นน้อยกว่าคำขนาด 4 ไบต์เพียงบิตเดียว ดังนั้นค่าจึงสามารถใส่ลงในคำดังกล่าวได้โดยไม่ต้องใช้บิตเครื่องหมาย (บิตที่มีนัยสำคัญที่สุด) วิธีนี้ทำเพื่อหลีกเลี่ยงการคำนวณเลขคณิตแบบโมดูลาร์บนจำนวนลบอย่างแน่นอน เนื่องจากมีคำจำกัดความและการใช้งานที่แตกต่างกันมากมาย[ 2 ]

การดำเนินการ

โค้ด Python ต่อไปนี้เป็นการใช้งานอัลกอริธึม HMAC-SHA1 และ HOTP

นำเข้าhashlibdef hmac_sha1 ( * , key : bytes , msg : bytes ) -> bytes :ถ้าlen ( key ) > 64 :key = hashlib.sha1 ( key ) .digest ( )อื่น:คีย์= คีย์แค่( 64 , b ' \0 ' )o_key_pad = bytes ( i ^ 0x5c for i in key )i_key_pad = bytes ( i ^ 0x36 for i in key )ส่งคืนhashlib.sha1 (แป้นพิมพ์ o +hashlib.sha1 ( i_key_pad + msg ) .digest ( )) . ย่อย()def hotp ( * , key : bytes , ctr : int , length : int ) -> str :mac = hmac_sha1 ( key = key , msg = ctr . to_bytes ( 8 , 'big' ))ออฟเซ็ต= mac [ - 1 ] & 0xftruncated = bytearray ( mac [ offset : offset + 4 ])ตัดทอน[ 0 ] &= 0x7fค่า= int.from_bytes ( truncated , ' big ' ) % ( 10 ** length )ส่งคืนค่า str ( value ) .rjust ( length , ' 0' )

otpauth://รูปแบบ URI

URI ที่กล่าวถึงในส่วนนี้ถูกเข้ารหัสเป็นรหัส QR สมาร์ทโฟนหลายรุ่นอนุญาตให้ผู้ใช้สแกนรหัสเหล่านี้และลงทะเบียนในแอปยืนยันตัวตน เช่นGoogle Authenticator

การใช้งาน HOTP และTOTP บางอย่าง สำหรับสมาร์ทโฟนอนุญาตให้ผู้ใช้สแกนคิวอาร์โค้ดเพื่อเพิ่มโทเค็น HOTP และ TOTP ลงในแอปตรวจสอบสิทธิ์ คิวอาร์โค้ดเหล่านี้มีUniform Resource Identifiers (URIs) ที่มีรูปotpauth://แบบ[ 3 ]

otpauth://URI ของ HOTP เริ่มต้นด้วย otpauth://hotp/และต้องประกอบด้วยป้ายกำกับ รหัสลับ และตัวนับ ป้ายกำกับจะถูกเข้ารหัสเป็นส่วนหนึ่งของเส้นทาง ในขณะที่รหัสลับและตัวนับจะถูกเข้ารหัสเป็นพารามิเตอร์การค้นหา URI อาจมีฟิลด์อื่นๆ เพิ่มเติมได้ เช่น จำนวนหลัก (ค่าเริ่มต้นคือ 6) อัลกอริทึมที่ใช้ (ค่าเริ่มต้นคือ SHA1) และชื่อผู้ออก

รหัสลับถูกเข้ารหัสเป็น RFC 4648 Base32โดยไม่รวมส่วนเติม (padding) ตัวอย่างเช่น URI otpauth://hotp/Wikipedian?secret=JBSWY3DPFQQHO33SNRSCC&counter=42แสดงถึงโทเค็น HOTP ที่มีชื่อว่า "Wikipedian" โดยมีรหัสลับHello, world!เข้ารหัสเป็น ASCII และตัวนับเริ่มต้นคือ 42 เมื่อเพิ่มลงในตัวตรวจสอบความถูกต้องแล้ว ควรจะได้รหัส439256นี้

โทเค็น

โทเค็นทั้งแบบฮาร์ดแวร์และซอฟต์แวร์มีจำหน่ายจากผู้จำหน่ายหลายราย สำหรับรายละเอียดเพิ่มเติม โปรดดูข้อมูลอ้างอิงด้านล่าง

โทเค็นซอฟต์แวร์มีให้บริการสำหรับแพลตฟอร์มมือถือ /สมาร์ทโฟนหลักเกือบทั้งหมด ( J2ME [ 4 ] Android [ 5 ] iPhone [ 6 ] BlackBerry [ 7 ] Maemo [ 8 ] macOS [ 9 ] และ Windows Mobile [ 7 ] )

แผนกต้อนรับ

แม้ว่าการตอบรับในช่วงแรกจากสื่อคอมพิวเตอร์บางส่วนจะเป็นไปในเชิงลบในช่วงปี 2547 และ 2548 [ 10 ] [ 11 ] [ 12 ]หลังจากที่ IETF ได้นำ HOTP มาใช้เป็นRFC 4226ในเดือนธันวาคม 2548 ผู้จำหน่ายต่างๆ ก็เริ่มผลิตโทเค็นที่เข้ากันได้กับ HOTP และ/หรือโซลูชันการตรวจสอบสิทธิ์แบบเต็มรูปแบบ  

ตามบทความ "แผนที่เส้นทาง: การแทนที่รหัสผ่านด้วยการตรวจสอบสิทธิ์ OTP" [ 13 ]เกี่ยวกับการตรวจสอบสิทธิ์ที่แข็งแกร่ง ซึ่งเผยแพร่โดย Burton Group (แผนกหนึ่งของGartner, Inc. ) ในปี 2010 " ความคาดหวังของ Gartnerคือรูปแบบฮาร์ดแวร์OTPจะยังคงมีการเติบโตในระดับปานกลาง ในขณะที่ OTP บนสมาร์ทโฟนจะเติบโตและกลายเป็นแพลตฟอร์มฮาร์ดแวร์เริ่มต้นเมื่อเวลาผ่านไป"

ดูเพิ่มเติม

  • RFC 4226: HOTP: อัลกอริทึมรหัสผ่านใช้ครั้งเดียวแบบ HMAC
  • RFC 6238: TOTP: อัลกอริทึมรหัสผ่านใช้ครั้งเดียวแบบอิงเวลา
  • RFC 6287: OCRA: อัลกอริทึมการตอบสนองต่อคำท้าของ OATH
  • โครงการริเริ่มเพื่อการตรวจสอบสิทธิ์แบบเปิด
  • การนำ RFC 4226 - อัลกอริทึม HOPT ไปใช้จริง (เก็บถาวรเมื่อ 2021-12-16 ที่Wayback Machine)ขั้นตอนการนำไปใช้ในภาษา Python ในJupyter Notebook
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=HMAC-based_one-time_password&oldid=1355942617 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ รหัสผ่านใช้ครั้งเดียวแบบ HMAC

รหัสผ่านแบบใช้ครั้งเดียวแบบ HMAC ( HOTP ) เป็น อัลกอริ ทึมรหัสผ่านแบบใช้ครั้งเดียว (OTP) ที่ใช้ รหัสยืนยันข้อความแบบแฮช (HMAC) เมื่อไคลเอนต์พยายามเข้าถึงเซิร์ฟเวอร์...

อัลกอริทึม

อัลกอริทึม HOTP นำเสนอวิธีการตรวจสอบสิทธิ์โดยการสร้างรหัสผ่านที่อ่านง่ายสำหรับมนุษย์แบบสมมาตร หรือ ค่าต่างๆ โดยแต่ละค่าจะใช้สำหรับการตรวจสอบสิทธิ์เพียงครั้งเดียวเท่านั้น คุณสมบัติการใช้เพียงครั้งเดียวนี้เกิดขึ้นโดยตรงจากการใช้ค่าตัวนับแต่ละค่าเพียงครั้งเดียว

การดำเนินการ

โค้ด Python ต่อไปนี้เป็นการใช้งานอัลกอริธึม HMAC-SHA1 และ HOTP

otpauth:// รูปแบบ URI

การใช้งาน HOTP และ TOTP บางอย่าง สำหรับสมาร์ทโฟนอนุญาตให้ผู้ใช้สแกน คิวอาร์โค้ด เพื่อเพิ่มโทเค็น HOTP และ TOTP ลงในแอปตรวจสอบสิทธิ์ คิวอาร์โค้ดเหล่านี้มี Uniform Resource Identifiers (URIs) ที่มีรูป otpauth:// แบบ [ 3 ]