RFC5869翻譯 HMAC-based Extract-and-Expand Key Derivation Function (HKDF)

HMAC-based Extract-and-Expand Key Derivation Function (HKDF)

Abstract

改文檔描述了一個簡單的基於HMAC的密鑰導出方法,它可以用來在不同的協議和應用中構建早不同的block。
KDF被設計用來滿足不同的應用和需求,並且被用來當做hash函數。

Status of This Memo

Copyright Notice

1.Introduction

KDF是密碼學系統中必要的組件。它的目的是把一個key拓展成多個從密碼學角度來上說是安全的key。

這篇文章定義了一種簡單的基於HMAC的的HKDF,我們稱之爲HKDF。
這篇文章的目的是描述一種KDF來阻止其他的KDF實現。但是並不是強制現有的協議使用該KDF。

HKDF根據 extract-then-expand 設計模式,即KDF有2大模塊。
第一個階段是將輸入的key material進行”extracts”,得到固定長度的key,然後第二階段就是
將這個key”expands”成多個附加的僞隨機的key。

在許多應用中,輸入的key material並不需要離散均勻的。攻擊者可能會知道部分
的key material 或者修改部分的key material 。因此,”extract”的目標是把一個大的key material變成
一個小的key。有些應用中,輸入的key material已經是一個很好的僞隨機數。

extract流程不是必須的,所以expand流程可以獨立的使用extract流程不是必須的,所以expand流程可以獨立的使用。

第二步,expand這個key,使之變成期望長度的的key。輸出的key的長度和個數,取決於指定的加密算法。

2. HMAC-based Key Derivation Function (HKDF)

2.1. Notation

HMAC的兩個參數,第一個是key,第二個是data。data由好幾個元素組成,我們一般用 | 來表示,例如:
HMAC(K, elem1 | elem2 | elem3)

2.2. Step 1: Extract

HKDF-Extract(salt, IKM) -> PRK

變量:
      Hash     HASH函數; HashLen 表示這個HASH函數的輸出字節數。

輸入:
      salt     可選的值,如果沒有指定,則使用HashLen個0代替;

      IKM      輸入的keying material

輸出:
      PRK      a pseudorandom key (HashLen字節大小)

PRK如下計算:
PRK = HMAC-Hash(salt, IKM)

2.3. Step 2: Expand
HKDF-Expand(PRK, info, L) -> OKM

變量:
      Hash     HASH函數; HashLen 表示這個HASH函數的輸出字節數。
輸入:
      PRK      至少HashLen字節長度的pseudorandom key(通常由extract流程導出)
      info     可選的值,可以是""
      L        期望輸出的字節數(長度<=255*HashLen)

輸出:
      OKM      輸出的keying material (L字節)

OKM 如下計算:

   N = ceil(L/HashLen)
   T = T(1) | T(2) | T(3) | ... | T(N)
   OKM = first L octets of T

   where:
   T(0) = empty string (zero length)
   T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
   T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
   T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
   ...

3. Notes to HKDF Users

這節包含了HKDF使用的一些準則,更多的細節請參考 https://eprint.iacr.org/2010/264

3.1. To Salt or not to Salt

HKDF的定義允許使用待隨機值salt和不帶隨機值的操作。這是爲了兼容沒有salt的應用程序。
但是我們需要強調的是,使用salt能夠顯著加強HKDF,ensuring independence between different uses of the
hash function, supporting “source-independent” extraction, and
strengthening the analytical results that back the HKDF design.

隨機的salt和輸入的keying material有2點不同,首先他是不保密的,其次他可以複用。
所以很多應用程序可以使用salt。例如使用HKDF刷新熵池的僞隨機數生成器可以使用固定的salt,而不需要保密這個salt。

In a different application domain, a key agreement protocol deriving cryptographic keys from a Diffie-Hellman exchange can derive a salt
value from public nonces exchanged and authenticated between communicating parties as part of the key agreement (this is the
approach taken in [IKEv2]).

理想情況下,salt是一個HashLen長度隨機數,即使salt是一個很小的值或者熵小,也能對輸出的keying material起着非常大
的作用,我們鼓勵應用程序的設計者使用salt。

指的強調的是,有些應用程序使用保密的salt,這更加能夠保證HKDF的安全性。
An example of such application is IKEv1 in its “public-key encryption
mode”, where the “salt” to the extractor is computed from nonces that
are secret; similarly, the pre-shared mode of IKEv1 uses a secret
salt derived from the pre-shared key.

3.2. The ‘info’ Input to HKDF

雖然info是可選的,但是對於應用程序來說,還是比較重要的。它的目的出的key material和程序上下文進行綁定。
例如,info可以是協議號,算法標識,用戶標識等。這個可以保證相同IKM也能有不同的輸出。對info有一個技術上的強制
規定:必須和IKM不相關。

3.3. To Skip or not to Skip

有些應用程序,輸入的IKM從密碼學角度來上說已經是很強的了(例如TLS的RSA祕鑰交換算法的premaster secret除了開頭2字節,其餘的都是僞隨機值)
這種情況下,可以跳過extract流程,直接使用expand流程。從另一個角度上來說,爲了流程上的兼容,應用程序還需要
extract,比如IKM長度大於HMAC 的key的長度。如果IKM是DH算法的結果,那麼extract不應該被跳過。因爲g^(xy)本身不是離散均勻的。所以需要將
g^(xy)進行extract,然後再進行expand。

如果期望的生產的key長度L小於HashLen,有可能PRK 直接變成了OKM,這個是不建議這麼用的。

3.4. The Role of Independence

4. Applications of HKDF

5. Security Considerations

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章