text: 基於HMAC的一次性密碼演算法。HOTP在2005年由IETF釋出在RFC 4226標準文件中，定義了演算法的同時附帶有一例基於Java的實現。自此之後，世界上許多公司接納了HOTP演算法，它也成為了可以自由使用的開源標準。演算法.HOTP演算法在驗證時使用對稱生成的人類可讀密碼，每個密碼僅在一次驗證中有效。這種一次性屬性直接來自於計數器數值的單次使用。任何有意願使用HOTP的一方都必須定義一系列對於驗證器而言已明確的引數，無論是否這些引數是否可以被驗證器接受，都可能包含：HOTP 驗證中的雙方都會運算最終數值，驗證器會將本地運算結果與被驗證方提供的結果進行比對。由於驗證雙方都分別各自自增計數器數值，驗證器的計數器可能落後於被驗證方，因此定義用於重新同步的協議是意義的。RFC4226標準中給出了相關建議，但並不做強制要求。為解決可能的不同步，驗證器會使用當前計數器值起嘗試用連續多個值進行運算，如果驗證成功，則驗證器將對應的計數器值更新為當前值，無需被驗證方做任何操作。視窗大小由引數指定。:7,8上述建議是出於避免HOTP 數值驗證過程中出現卡死，但是同時也使得數值相對偏小，暴力破解攻擊也因此變得容易。有一個建議是在驗證失敗幾次之後就鎖定驗證過程，或者每次驗證失敗時都延長下次操作時間。專有的硬體金鑰通常會提供六位驗證碼，也就是"d"的預設值。金鑰截留最長長度為31位，由於公式中 formula_1 ≈ 9.3，也就是"d"的最大值取10，因此第十位數值可能的取值也就更少，為0、1或者2。雙重重定向驗證.在驗證之後，驗證器可以透過運算得出下一個HOTP 數值來執行驗算，得出返回的數值之後，接受驗證的一方將計算HOTP 數值進行驗證。值得注意的是，這一過程中的計數器數值需要保證同步。HOTP 運算值.HOTP 運算值設計上是人類可讀的，它是一個位數為d的十進位制數字：HOTP 運算值 = HOTP("K", "C") mod 10"d"上述公式也說明運算值是最小位數為d的十進位制數值。HOTP本質上是雜湊訊息驗證碼。HOTP("K", "C") = truncate(HMACH("K", "C"))擷取首先是位於最小的四位"MAC"數值當中，截得之後用於作為回撥數值，記為"i"。truncate("MAC") = extract31("MAC", "MAC"[(19 × 8) + 4:(19 × 8) + 7] × 8)引索數值"i"用於從"MAC"當中選中31位數，起始點為"i + 1"。extract31("MAC", "i") = "MAC"["i" + 1:"i" + (4 × 8) − 1]注意，取得的31位數長度僅有單位值的4位元組，可以容納於4位元組短語意味著沒有標記位。這是出於避免負數的模數運算，但是這也有許多不同的定義與實現。金鑰.已有許多供應商提供軟體以及硬體金鑰。實現開放驗證提案的HOTP硬體金鑰實現往往比使用專有演算法的同類產品便宜許多。 截止至2010年，這些硬體金鑰的價格已經很低。 有些產品也可以同時用於生成強密碼。軟體金鑰在。接納程度.儘管許多計算機媒體在2004-05年持負面態度，自從IETF在2005年十二月將HOTP接納為RFC 4226標準之後，許多提供商開始生產相容HOTP的金鑰，甚至是基於此的整套驗證解決方案。2010年發表文章，表示“高德納諮詢公司預期基於硬體的一次性密碼的市場會有一定程度的增長，對於智慧手機來說，一次性密碼將會成為預設硬體平臺的一部分”。
metadata: erhwenkuo/wikipedia-zhtw
metadata: 基於雜湊訊息驗證碼的一次性密碼演算法
metadata: https://zh.wikipedia.org/wiki?curid=6515428