HOTP 動態截斷函式如何推廣到更長的散列?
HOTP 是RFC 4226中基於 HMAC 的一次性密碼算法,它使用“動態截斷”功能將 20 字節 HMAC-SHA-1 值轉換為 31 位字元串。動態截斷(來自第 5.3 節)是這樣工作的(並且可能是無用的):
DT(String) // String = String[0]...String[19] Let OffsetBits be the low-order 4 bits of String[19] Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15 Let P = String[OffSet]...String[OffSet+3] Return the Last 31 bits of P
TOTP ( RFC 6238 ) 允許使用 SHA-256 和 SHA-512 作為 HOTP 中的 HMAC 雜湊,但似乎沒有定義一個新的動態截斷函式來與它們一起使用:
TOTP 實現可以使用 HMAC-SHA-256 或 HMAC-SHA-512 函式,基於 SHA-256 或 SHA-512
$$ SHA2 $$雜湊函式,而不是為 HOTP 計算指定的 HMAC-SHA-1 函式$$ RFC4226 $$.
我應該使用低 4 位
String[19]
作為偏移量、低 4 位String[length-1]
還是使用其他位數或完全不同的截斷算法?
我設法通過複製測試向量來找到它。
TL;DR:該標准假定您使用雜湊的最後一個字節的低 4 位,無論其長度如何。因此,將原始 DT 定義中的 19 替換為 SHA-256 的 31 或 SHA-512 的 63 就可以了。
找出這一點並不完全簡單,因為標準只列出了一個測試秘密:
測試令牌共享密鑰使用 ASCII 字元串值“12345678901234567890”。時間步長 X = 30,Unix 紀元作為初始值來計算時間步長,其中 T0 = 0,TOTP 算法將顯示指定模式和時間戳的以下值。
事實上,要重現 SHA-256 和 SHA-512 的測試向量值,您必須將該秘密擴展到 32/64 個字元。即使用ASCII字元串“12345678901234567890123456789012”和“1234567890123456789012345678901234567890123456789012345678901234”代替。