彩神彩票

HMAC:鍵入-散列法用於信息身份驗證

        組織:中國互動出版網(http://www.china-pub.com/

        E-mail:ouyang@china-pub.com

        譯者:馬 良 (idayang superwiles@263.net)

        譯文發布時間:2001-8-7

        版權:本中文翻譯文檔版權歸中國互動出版網所有。可以用於非商業用途自由轉載,但必須保留本文檔的翻譯及版權信息。

        Network Working Group R. Glenn

        Request for Comments: 2104 NIST

        Category: Standards Track S. Kent

        BBN Corp

        November 1998

        HMAC:鍵入-散列法用於信息身份驗證

        (RFC2104--HMAC: Keyed-Hashing for Message Authentication)

        本備忘錄的狀態

        本文檔講述了一種Internet社區的Internet標準跟蹤協議,它需要進一步進行討論和建議以得到改進。請參考最新版的“Internet正式協議標準” (STD1)來獲得本協議的標準化程度和狀態。本備忘錄的發布不受任何限製。

        版權聲明

        Copyright (C) The Internet Society (1998). All Rights Reserved.

        摘要:

        本文檔闡述了一種使用散列函數加密的消息驗證機製——散列消息鑒別碼HMAC。HMAC通過捆綁一個共享密鑰可以使用任何迭代的可用於加密的散列函數。例如:MD5, SHA—1。這種加密機製的強度取決於所用散列函數的特性。

        1. 簡介 2

        2. HMAC的定義。 2

        3. 密鑰。 3

        4. 注意事項 4

        5. 刪節輸出結果 4

        6. 安全 4

        注釋: 5

        附錄: 5

        致謝: 8

        參考書目: 8

        1. 簡介

        在開放的計算與通訊世界中,提供一種途徑去檢測通過不可靠媒介傳輸或存儲的信息完整性是非常重要的。提供這種完整性檢測的機製基於一種通常被稱作消息鑒別碼的密鑰MAC。一般的,消息鑒別碼用於驗證傳輸於兩個共同享有一個密鑰的單位之間的消息。在本文檔中,我們將描述一種基於散列函數的消息鑒別碼機製。這種機製被稱為散列消息鑒別碼HMAC。它是基於[BCK1]的作者所做的工作,他說明並就加密性能分析了HMAC的結構。我們在講述HMAC的基本原理和安全性分析時會提到這些結果,並且還要與其他鍵入式散列方法做對比。

        HMAC可以與任何迭代散列函數捆綁使用。MD5和SHA—1就是這種散列函數HMAC還可以使用一個用於計算和確認消息鑒別值的密鑰。

        這種結構的主要作用是:

        不用修改就可以使用適合的散列函數。而且散列函數在軟件方麵表現的很好。並且源碼是公開和通用的。可以保持散列函數原有的性能而不致使其退化。可以使得基於合理的關於底層散列函數假設的消息鑒別機製的加密強度分析便於理解。發現或需要運算速度更快或更安全的散列函數時,可以很容易的實現底層散列函數的替換。

        本文檔詳細描述了HMAC使用一種抽象的散列函數(用H表示)。具體的HMAC需要定義一個具體的散列函數。目前,可供選擇的散列函數有SHA—1[SHA],MD5,RIPEMD—128/160[RIPEMD]。這些不同的HMAC實現被表示為,HMAC—SHA1,HMAC—MD5,HMAC—RIPEMD,等等。

        注釋:

        在寫本文檔時,MD5和SHA—1是使用最廣泛的加密用散列函數。MD5最近已被證明對於[Dobb]的攻擊存在缺陷。這種攻擊方法和其他目前已知的MD5的缺陷不允許在HMAC中按本文的方法使用MD5(細節請見[Dobb])。然而,SHA—1似乎是一種更強壯的函數。目前,MD5 可以被考慮用於HMAC來為應用程序提供出眾的執行效率的觀點受到批評。無論如何,執行者與用戶都需要了解關於加密用散列函數被破解可能性的最新進展,並可能會需要替換底層的散列函數。(關於HMAC安全性的更多信息參見第六部分)

        2. HMAC的定義。

        定義HMAC需要一個加密用散列函數(表示為H)和一個密鑰K。我們假設H是一個將數據塊用一個基本的迭代壓縮函數來加密的散列函數。我們用B來表示數據塊的字長。(以上說提到的散列函數的分割數據塊字長B=64),用L來表示散列函數的輸出數據字長(MD5中L=16,SHA—1中L=20)。鑒別密鑰的長度可以是小於等於數據塊字長的任何正整數值。應用程序中使用的密鑰長度若是比B大,則首先用使用散列函數H作用於它,然後用H輸出的L長度字符串作為在HMAC中實際使用的密鑰。

        一般情況下,推薦的最小密鑰K長度是L個字長。(與H的輸出數據長度相等)。更詳細的信息參見第三部分。

        我們將定義兩個固定且不同的字符串ipads,opad:

        ('i','o'標誌內部與外部)

        ipads = the byte 0x36 repeated B times

        opad = the byte 0x5C repeated B times.

        計算‘text'的HMAC:

        H( K XOR opad, H(K XOR ipads, text))

        即為以下步驟:

        (1) 在密鑰K後麵添加0來創建一個子長為B的字符串。(例如,如果K的字長是20字節,B=60字節,則K後會加入44個零字節0x00)

        (2) 將上一步生成的B字長的字符串與ipads做異或運算。

        (3) 將數據流text填充至第二步的結果字符串中。

        (4) 用H作用於第三步生成的數據流。

        (5) 將第一步生成的B字長字符串與opad做異或運算。

        (6) 再將第四步的結果填充進第五步的結果中。

        (7) 用H作用於第六步生成的數據流,輸出最終結果基於MD5的相關代碼將作為附錄提供

        3. 密鑰。

        用於HMAC的密鑰可以是任意長度(比B長的密鑰將首先被H處理)。但當密鑰長度小於L時的情況時非常令人失望的,因為這樣將降低函數的安全強度。長度大於L的密鑰是可以接受的,但是額外的長度並不能顯著的提高函數的安全強度。(如果一個隨機的密鑰被認為是不可靠的,那麽選擇一個較長的密鑰是明智的)。

        密鑰必須隨機選取(或使用強大的基於隨機種子的偽隨機生成方法),並且要周期性的更新。(目前的攻擊沒有指出一個有效的更換密鑰的頻率,因為那些攻擊實際上並不可行。然而,周期性更新密鑰是一個對付函數和密鑰所存在的潛在缺陷的基本的安全措施,並可以降低泄漏密鑰帶來的害。)

        4. 注意事項

        HMAC是按底層散列函數可以不修改源碼就可使用這種方式定義的。尤其是它在使用H函數時還要依賴於預定義的初始化值IV(一個定值,由每個迭代散列函數在初始化它的壓縮函數時指定).然而,如果你願意的話,可以修改H函數的源碼來支持可變的初始化值Ivs。

        這個想法是這樣的:壓縮函數作用於B字長數據塊(K XOR opad)和(K XOR ipads),所產生的中間結果可以在密鑰剛剛生成時就預先計算好的。先將這些中間結果存儲,然後在每次有消息需要驗證時來生成H函數的初始化值IV。這種方法為每個要鑒別的消息,保存了H 的壓縮函數對於兩個B字長數據塊(K XOR opad)和(K XOR ipads)的應用。

        當鑒別短數據流,保存這樣的信息是重要的。我們要強調的是:對待這些中間結果要象對待密鑰一樣,並且要同樣的進行保密。

        上述的選擇實現HMAC的方法是本地執行的結果,對內部操作性沒有影響。

        5. 刪節輸出結果

        一個著名的消息鑒別方法是刪節消息鑒別碼的輸出,而隻輸出部分結果。Preneel與Van Oorschot[pv]給出了一些散列消息鑒別碼刪節後的輸出結果的優勢分析。在這一領域的成果並不是絕對的說刪節輸出結果有全麵的安全優勢。它有優勢的一麵(對一個攻擊者來說可用的散列函數結果信息將更少),也有劣勢的一麵(攻擊者要預測的字長更短)。基於HMAC的應用程序可以隻輸出HMAC計算結果的最左的t個字節(也就是說,計算將按第二部分定義的方式執行,但輸出結果將刪節至t個字節)。我們推薦的輸出長度t不小於散列函數輸出長度的一半(匹配生日攻擊的限度)且不能少於80字節(一個適合的速度限製的字節數使得攻擊者難以去預測)。我們建議使用HMAC-H-t來表示基於輸出長度為t的散列函數的HMAC的實現。例如,HMAC-SHA1-80表示HMAC使用SHA-1函數並且輸出被刪節至80字節(如果沒有聲明這項參數,則假定不刪節輸出結果)。

        6. 安全

        這裏將說明消息鑒別機製的安全性取決於所采用的散列函數的加密特性:1。抗衝突攻擊能力(隻限於初始化值是隨機且秘密的,且函數的輸出對攻擊者來說是不可用的情況)2。當作用於單數據塊時,H的壓縮函數的消息鑒別屬性(在HMAC中這些數據塊是部分未知的,當攻擊者自製內部H函數計算結果,並且攻擊者是不能充分的選擇的)HMAC中使用的散列函數,一般都具有以上或更強的屬性。實際上,如果一個散列函數不具有以上的屬性,那麽它對於大多數的加密應用程序是不適用的,包括基於該函數的選擇消息鑒別方案。(對HMAC函數原理詳細闡述和完整的分析參[BCK1])隻要得到關於候選散列函數的加密強度有限的信任,那麽觀察它用於消息鑒別的安全性及以下HMAC結構的兩種屬性是很重要的。

        1.這種結構是獨立於具體所使用的散列函數,並且後者是可以被任何其它安全加密散列函數替代。

        2.消息鑒別相對於加密來說是一種“瞬時”影響。公開的對一種消息鑒別方案的破壞會導致該方案被替換,但是其對已鑒別過的信息卻無能為力。這就與加密形成鮮明對比。如果其加密算法被破解的話,今天加密的的數據,在未來都會受到被破解的威脅,對HMAC已知最有力的攻擊是基於散列函數的衝突頻率。(“生日攻擊法”)[PV,BCK2],但完全不適用於最小有理散列函數。例如:如果我們考慮一個類似MD5的散列函數,其輸出結果長度為L=16字節(128比特),攻擊者需要獲得正確的消息鑒別標誌(使用相同的密鑰K!!)計算大約2**64已知明文。這樣至少要使用H處理2**64數據塊,這是一個不可能完成的任務(一個數據塊的長度為64字節,在連續的1Gbps link的條件下需要250,000年,並且在整個過程中不能更換密鑰!)這樣的攻擊隻有在函數H的衝突行為的嚴重缺陷被發現才有可能成為現實(衝突在處理2**30後會存在)。這樣的發現會導致立即更換現有的函數H(這種故障產生的影響遠遠大於傳統的在上下文環境數字簽名與公開密鑰中使用的散列函數故障。)

        注釋:

        這種攻擊與在無相關密鑰、2**64離線並行計算可以發現衝突的環境中針對加密散列函數的規則衝突攻擊形成鮮明對比。在現在的條件下生日攻擊已基本不可行, 而後者可行性卻很高。(在以上的例子中,如果使用的散列函數的輸出是160字節,則2**64應改為2**80)

        正確的實施以上的結構時需要注意:選擇隨機(或加密的偽隨機)密鑰、一個安全的密鑰交換機製,頻繁的更新密鑰,對密鑰的良好的安全防護。以上這些都是維護HMAC完整的鑒別機製安全的基本要素。

        附錄:

        例程源碼

        為了更好的說明該機製,我們提供了實現HMAC-MD5的源碼,並且還提供了一些相應的測試向量。(代碼是基於[MD5]中的MD5的源碼)

        /*

        ** Function: hmac_md5

        */

        void hmac_md5(text, text_len, key, key_len, digest)

        unsigned char* text; /* pointer to data stream */

        int text_len; /* length of data stream */

        unsigned char* key; /* pointer to authentication key */

        int key_len; /* length of authentication key */

        caddr_t digest; /* caller digest to be filled in */

        {

        MD5_CTX context;

        unsigned char k_ipads[65]; /* inner padding -

        * key XORd with ipads

        */

        unsigned char k_opad[65]; /* outer padding -

        * key XORd with opad

        */

        unsigned char tk[16];

        int i;

        /* if key is longer than 64 bytes reset it to key=MD5(key) */

        if (key_len > 64) {

        MD5_CTX tctx;

        MD5Init(&tctx);

        MD5Update(&tctx, key, key_len);

        MD5Final(tk, &tctx);

        key = tk;

        key_len = 16;

        }

        /*

        * the HMAC_MD5 transform looks like:

        *

        * MD5(K XOR opad, MD5(K XOR ipads, text))

        *

        * where K is an n byte key

        * ipads is the byte 0x36 repeated 64 times

        * opad is the byte 0x5c repeated 64 times

        * and text is the data being protected

        */

        /* start out by storing key in pads */

        bzero( k_ipads, sizeof k_ipads);

        bzero( k_opad, sizeof k_opad);

        bcopy( key, k_ipads, key_len);

        bcopy( key, k_opad, key_len);

        /* XOR key with ipads and opad values */

        for (i=0; i<64; i++) {

        k_ipads[i] ^= 0x36;

        k_opad[i] ^= 0x5c;

        }

        /*

        * perform inner MD5

        */

        MD5Init(&context); /* init context for 1st

        * pass */

        MD5Update(&context, k_ipads, 64) /* start with inner pad */

        MD5Update(&context, text, text_len); /* then text of datagram */

        MD5Final(digest, &context); /* finish up 1st pass */

        /*

        * perform outer MD5

        */

        MD5Init(&context); /* init context for 2nd

        * pass */

        MD5Update(&context, k_opad, 64); /* start with outer pad */

        MD5Update(&context, digest, 16); /* then results of 1st

        * hash */

        MD5Final(digest, &context); /* finish up 2nd pass */

        }

        Test Vectors (Trailing '{PAGE_NEWS_DETAIL}' of a character string not included in test):

        key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b

        key_len = 16 bytes

        data = "Hi There"

        data_len = 8 bytes

        digest = 0x9294727a3638bb1c13f48ef8158bfc9d

        key = "Jefe"

        data = "what do ya want for nothing?"

        data_len = 28 bytes

        digest = 0x750c783e6ab0b503eaa86e310a5db738

        key = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

        key_len 16 bytes

        data = 0xDDDDDDDDDDDDDDDDDDDD...

        ..DDDDDDDDDDDDDDDDDDDD...

        ..DDDDDDDDDDDDDDDDDDDD...

        ..DDDDDDDDDDDDDDDDDDDD...

        ..DDDDDDDDDDDDDDDDDDDD

        data_len = 50 bytes

        digest = 0x56be34521d144c88dbb8c733f0e8b3f6

        致謝:

        Pau-Chen Cheng, Jeff Kraemer, and Michael Oehler, have provided

        useful comments on early drafts, and ran the first interoperability

        tests of this specification. Jeff and Pau-Chen kindly provided the

        sample code and test vectors that appear in the appendix. Burt

        Kaliski, Bart Preneel, Matt Robshaw, Adi Shamir, and Paul van

        Oorschot have provided useful comments and suggestions during the

        investigation of the HMAC construction.

        參考書目:

        [ANSI] ANSI X9.9, "American National Standard for Financial

        Institution Message Authentication (Wholesale)," American

        Bankers Association, 1981. Revised 1986.

        [Atk] Atkinson, R., "IP Authentication Header", RFC 1826, August

        1995.

        [BCK1] M. Bellare, R. Canetti, and H. Krawczyk,

        "Keyed Hash Functions and Message Authentication",

        Proceedings of Crypto'96, LNCS 1109, pp. 1-15.

        (http://www.research.ibm.com/security/keyed-md5.html)

        [BCK2] M. Bellare, R. Canetti, and H. Krawczyk,

        "Pseudorandom Functions Revisited: The Cascade Construction",

        Proceedings of FOCS'96.

        [Dobb] H. Dobbertin, "The Status of MD5 After a Recent Attack",

        RSA Labs' CryptoBytes, Vol. 2 No. 2, Summer 1996.

        http://www.rsa.com/rsalabs/pubs/cryptobytes.html

        [PV] B. Preneel and P. van Oorschot, "Building fast MACs from hash

        functions", Advances in Cryptology -- CRYPTO'95 Proceedings,

        Lecture Notes in Computer Science, Springer-Verlag Vol.963,

        [MD5] Rivest, R., "The MD5 Message-Digest Algorithm",

        RFC 1321, April 1992.

        [MM] Meyer, S. and Matyas, S.M., Cryptography, New York Wiley,

        1982.

        [RIPEMD] H. Dobbertin, A. Bosselaers, and B. Preneel, "RIPEMD-160: A

        strengthened version of RIPEMD", Fast Software Encryption,

        LNCS Vol 1039, pp. 71-82.

        ftp://ftp.esat.kuleuven.ac.be/pub/COSIC/bosselae/ripemd/.

        [SHA] NIST, FIPS PUB 180-1: Secure Hash Standard, April 1995.

        [Tsu] G. Tsudik, "Message authentication with one-way hash

        functions", In Proceedings of Infocom'92, May 1992.

        (Also in "Access Control and Policy Enforcement in

        Internetworks", Ph.D. Dissertation, Computer Science

        Department, University of Southern California, April 1991.)

        [VW] P. van Oorschot and M. Wiener, "Parallel Collision

        Search with Applications to Hash Functions and Discrete

        Logarithms", Proceedings of the 2nd ACM Conf. Computer and

        Communications Security, Fairfax, VA, November 1994.

        作者地址:

        Hugo Krawczyk

        IBM T.J. Watson Research Center

        P.O.Box 704

        Yorktown Heights, NY 10598

        EMail: hugo@watson.ibm.com

        Mihir Bellare

        Dept of Computer Science and Engineering

        Mail Code 0114

        University of California at San Diego

        9500 Gilman Drive

        La Jolla, CA 92093

        EMail: mihir@cs.ucsd.edu

        Ran Canetti

        IBM T.J. Watson Research Center

        P.O.Box 704

        Yorktown Heights, NY 10598

        EMail: canetti@watson.ibm.com

        RFC2104--HMAC: Keyed-Hashing for Message Authentication

        HMAC:鍵入-散列法用於信息身份驗證

        1.RFC文檔中文翻譯計劃

彩神彩票