อ่าน 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

การใช้งาน 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