HKDF

HKDF

HKDFHMAC 메시지 인증코드를 기반으로 한 단순키 유도함수(KDF)이다.[1][2] 그것은 처음에는 여러 KDF 메커니즘의 확산을 억제하기 위해서뿐만 아니라 다양한 프로토콜과 애플리케이션의 구성요소로서 그것의 저자들에 의해 제안되었다.[2] HKDF가 따르는 주요 접근방식은 "추출-후확장"[2] 패러다임으로 KDF는 논리적으로 두 개의 모듈로 구성되는데, 1단계는 입력 키 재질을 가져다가 고정 길이의 유사 키로 "추출"한 다음, 2단계는 이 키를 몇 개의 추가 유사 키(KDF의 출력)로 "확장"한다.

예를 들어 디피를 통해 교환된 공유 비밀을 변환하는 데 사용할 수 있다.암호화,[1] 무결성 검사 또는 인증에 적합한 핵심 자료로 헬맨.

그것은 RFC 5869에 공식적으로 설명되어 있다.[2] 그것의 저자들 중 한 명은 또한 2010년 동반 논문에서 이 알고리즘을 설명했다.[1]

NIST SP800-56Cr2는[3] RFC5869 HKDF가 그것의 버전이라는 점에 주목하고 권고사항의 추출 및 확장 메커니즘에 대한 근거에 대한 논문을[1] 인용하면서 매개변수 가능한 추출-확장 체계를 명시한다.

C#, Go,[4] Java,[5] JavaScript,[6] Perl, PHP,[7] Python,[8] Ruby 및 기타 프로그래밍 언어에 대한 HKDF 구현이 있다.

메커니즘

HKDF는 선택적 소금(키 역할을 함)과 잠재적으로 취약한 입력 키 재료(IKM)(데이터 역할을 함)에 HMAC 해시 함수(예: HMAC-SHA256)를 사용하여 유사 입력 키(PRK)를 추출한다. 그런 다음 PRK 키의 해시 블록을 반복적으로 생성하여 출력 키 재료에 추가함으로써 원하는 길이의 암호화된 강력한 출력 키 재료(OKM)를 생성하여 최종적으로 원하는 길이로 잘라낸다.

추가 보안을 위해 PRK 키 HMAC 해시 블록은 HMAC에 의해 해시되어 현재 해시 블록을 생성하기 전에 중간에[clarification needed] 선택적 컨텍스트 문자열이 있는 증분 8비트 카운터에 이전 해시 블록을 추가하여 생성 중에 체인으로 연결된다.[citation needed]

HKDF의 중요한 특성은 엔트로피를 증폭시키지 않고 약한 엔트로피의 큰 원천을 보다 균등하고 효과적으로 활용할 수 있게 한다는 것이다.[citation needed]

사용하다

HKDF는 두 가지 주요 용도 및 잠재적으로 독립적인 용도를 가지고 있다.

  1. 더 큰 랜덤 소스에서 엔트로피를 "추출"(콘덴스/블렌드)하여 더 균일하게 편향되지 않고 더 높은 엔트로피지만 더 작은 출력(예: 암호화 키)을 제공한다. 이것은 암호 MAC의 확산 특성을 활용함으로써 이루어진다.
  2. 기존 공유 키와 같이 이미 합리적으로 무작위 입력의 생성 출력을 더 큰 암호학적 독립적 출력으로 "확대"하기 위해, 따라서 그 초기 공유 키로부터 결정적으로 복수의 키를 생성하여 동일한 프로세스가 동일한 입력이 a인 한 여러 장치에서 동일한 비밀키를 안전하게 생산할 수 있도록 한다.재사용의

또한 이 두 기능을 결합하여 PRNG를 형성하여 잠재적으로 편향될 수 있는 난수 발생기의 출력을 개선하고, 분석으로부터 보호하며, 악성 입력으로부터 난수 생성을 방어하는데 도움을 줄 수 있다.

예: 파이썬 구현

#!/usr/bin/env python3 수입하다 해시리브 수입하다 흐맥 로부터 수학 수입하다 천장을 치다  hash_len = 32  반항하다 hmac_sha256(핵심을, 자료):     돌아오다 흐맥.새로운(핵심을, 자료, 해시리브.sah256).소화시키다()  반항하다 hkdf(길이: 인트로, ikm, 소금에 절이다: 바이트 = b"", 정보: 바이트 = b"") -> 바이트:     """키 파생 함수"""     만일 (소금에 절이다) == 0:         소금에 절이다 = 바이트([0] * hash_len)     쫑알거리다 = hmac_sha256(소금에 절이다, ikm)     t = b""     okm = b""     을 위해 i  범위(천장을 치다(길이 / hash_len)):         t = hmac_sha256(쫑알거리다, t + 정보 + 바이트([1 + i]))         okm += t     돌아오다 okm[:길이] 

참조

  1. ^ a b c d Krawczyk, Hugo (2010). "Cryptographic Extraction and Key Derivation: The HKDF Scheme". Cryptology ePrint Archive. International Association for Cryptologic Research.
  2. ^ a b c d Krawczyk, H.; Eronen, P. (May 2010). "RFC 5869". Internet Engineering Task Force.
  3. ^ Elaine Barker; Lily Chen; Richard Davis (August 2020). "NIST Special Publication 800-56C: Recommendation for Key-Derivation Methods in Key-Establishment Schemes".
  4. ^ "package hkdf". pkg.go.dev.
  5. ^ "A standalone Java 7 implementation of HMAC-based key derivation function". github.com.
  6. ^ "Node.js implementation of RFC5869: HMAC-based Extract-and-Expand Key Derivation Function". npmjs.com.
  7. ^ "hash_hkdf — Generate a HKDF key derivation of a supplied key input". php.net.
  8. ^ "HMAC-based Extract-and-Expand Key Derivation Function (HKDF) implemented in Python". github.com.