HKDF: cara mendapatkan kunci baru dan fungsi hash apa yang harus dilakukan dengannya

Untuk algoritma enkripsi modern, salah satu faktor yang mempengaruhi kekuatan kriptografi adalah panjang kunci. Menurut standar NIST , kekuatan kriptografi dari algoritme harus paling sedikit 112 bit. Untuk algoritma simetris, ini berarti panjang kunci minimum harus 224 bit, untuk yang asimetris berdasarkan teori bilangan (misalnya, menyelesaikan masalah faktorisasi untuk algoritme RSA ), panjang minimum yang dapat diandalkan adalah 2048 bit [1]. Kriptografi pada kurva elips tidak menghemat penggunaan kunci besar.





Tetapi bagaimana jika kunci yang ada tidak cukup panjang untuk digunakan dengan aman dalam algoritme pilihan kami? Atau apakah kita membutuhkan lebih banyak kunci daripada yang kita miliki? Di sinilah KDF (Key Derivation Function) datang untuk menyelamatkan - ini adalah fungsi yang menghasilkan satu atau lebih kunci rahasia yang kuat secara kriptografis berdasarkan nilai rahasia yang diberikan (dalam literatur disebut sebagai kunci master, dan terkadang kunci master) menggunakan fungsi pseudo-random. Dan yang paling penting, ini memungkinkan Anda untuk mengatur panjang kunci yang dihasilkan sebagai hasil dari pekerjaan Anda, dan kekuatannya akan sama dengan kunci acak dengan panjang yang sama [2], [3].





KDF . , - HKDF, , Python'.





1. KDF

:





, KDF , "--" (- - extract-and-expand):





  1. "" . - "" , . ;





  2. , , "" . .





Gambar 1. Algoritma KDF [4]
1. KDF [4]

.





Randomness Extraction:

- - :





PRK = XTR (XTSalt, SKM)

:





  • SKM (Source Keying Material) - ( ) , PRK, - . , "" KDF;





  • XTR (randomness eXTRactor) - . , SKM PRK. , ( );





  • PRK (PseudoRandom Key) - . ;





  • XTSalt (eXTractor Salt) - , .. ( ) , , . .





, . - KDF . , HKDF, , -.





Key Expansion:

(PRK) L, . :





DKM = PRF ^ {*} (PRK, CTXinfo, L)

:





  • PRF* (PseudoRandom Function with variable length) - , . , counter feedback mode;





  • CTXInfo (context information) - ( , , , ). , , , ;





  • PRK - ;





  • DKM (Derived Keying Material) - L.





, . ? ?





, . , KDF "" , . , "" , .





, - (-) , , . , premaster secret TLS , (IETF). , , , , PRF* ( PRF* ).





2. HKDF

HKDF (HMAC Key Derivation Function) KDF. KDF ( PRF*), , HMAC.





HKDF

HMAC , - , - , . HashLen ( ), . || ("") . HMAC(key, a || b) , - key a b.





, HKDF :





HKDF (XTS, SKM, CTXinfo, L) = K = K (1) ||  K (2) ||  ... ||  K (t)

XTS, SKM CTXInfo , KDF, K(i), i = 1,...,t :





  1. PRK = HMAC-Hash(XTS, SKM) - , (SKM) (PRK). PRK , HMAC (HMAC-Hash) HashLen . , - , "" - . , SKM , PRK .





  2. K(1) = HMAC-Hash(PRK, CTXinfo || 0),

    K(i+1) = HMAC-Hash(PRK, K(i) || CTXinfo || i), 1 ≤ i < t,





t = L/HashLen - "", L. i . , HashLen, L K. L: L ≤ 255 * HashLen.





Gambar 2. Skema kerja HKDF [4]
2. HKDF [4]

KDF, - ; , HashLen. , , -, XTSalt PRK.





@nusr_et melalui Instagram
@nusr_et via Instagram

. . , "" , . , , , .. , HKDF , . SKM.





3. HKDF

HKDF : Java, JavaScript, PHP, Python. , , , , :





import hashlib
import hmac
from math import ceil

hash_len = 32

def hmac_sha256(key, data):
    return hmac.new(key, data, hashlib.sha256).digest()

def hkdf(length: int, ikm, salt: bytes = b"", CTXinfo: bytes = b"") -> bytes:
    #  -  , ,    ,
    #     hash_len:
    if len(salt) == 0:
        salt = bytes([0] * hash_len)
    
    #  :      
    #   -:
    prk = hmac_sha256(salt, ikm)
    
    k_i = b"0"  #     -  0
    dkm = b""   # Derived Keying Material
    t = ceil(length / hash_len)
    
    #  :   -  K(i),  
    #     . ,     
    #   K(i)    K(i-1):
    for i in range(t):
        k_i = hmac_sha256(prk, k_i + CTXinfo + bytes([1 + i]))
        dkm += k_i
    
    #     hash_len,    length :
    return dkm[:length]
      
      



:





>>> output = hkdf(100, b"input_key", b"add_some_salt")
>>>
>>> print(''.join('{:02x}'.format(byte) for byte in output))
2bcd8350cc31b6945b23b2a47add4d5ec4b1bd9fad0387590bf4e9f4d34ea456e63267c765e7cd5451df1f6f18f41eaba20de594fd8c6a008120276438d18fc4122ec152fff03204c966261b60408a569b6b0e3527ae4a34570c62b2d060fd15f3176a36
>>>
>>> print(len(out))
100
      
      



, hkdf



output "input_key" "add_some_salt". , , , . .  100 , , !





:












All Articles