HKDF 간단 메모
개발관련/(과거)메모
2022. 2. 21. 22:31
간단메모
개요
- KDF(Key Derivation Function)는 에플리케이션/프로토콜 서브 로직 등에서 많이 활용할 수 있다.
- 사용자 정의 보안 프로토콜에서 Key/IV/Nonce 등의 Secret 값을 만들기 위해 사용한다.
- 우리가 사용하는 인증서의 비밀번호는 PBKDF를 사용한다(실질적으로 표현하면 인증서에 상응하는 PrivateKey를 암호화하는 키를 생성하기 위한 비밀번호).
- PBKDF는 패스워드/Hash 기반으로 키를 유도한다.
- HKDF는 HMAC을 기반으로 키를 유도한다.
- HKDF는 "extract-then-expand"의 페러다임(2개의 모듈)을 갖고 있다.
- extract에서는 일반 입력 값으로(엔트로피가 낮은 값으로) 고정 길이의 PRK(의사난수 키) 값을 추출한다.
- expand에서는 extract에서 발췌한 PRK를 확장한다.
플로우
- HKDF-Extract(salt, IKM) -> PRK(의사난수키)
- salt: HMAC에서 Key로 사용(공개 값 사용 가능)
- IKM: HMAC 대상 data
- salt가 null인 경우 아래와 같음
-
byte[] salt = DatatypeConverter.parseHexBinary("0000000000000000000000000000000000000000000000000000000000000000"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(salt, "RawBytes")); byte[] extract = mac.doFinal(IKM);
- HKDF-Expand(PRK, info, L) -> OKM(최종 결과)
- PRK: Extract의 결과
- info: salt와 비슷한 아무 값(생략 가능)
- L: 결과 값의 길이
-
/* The output OKM is calculated as follows: N = ceil(L/HashLen) T = T(1) | T(2) | T(3) | ... | T(N) OKM = first L bytes 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) ... */
- 위의 식으로 HMAC 결과 값 만큼 append하여 결과를 출력한다.
- 만약 HmacSHA256을 사용하고, 원하는 출력값이 96인 경우 위의 where절을 3번 실행한다.
기타 정보
- Extract의 salt는 재사용이 가능하며, 없어도 되지만 보안상 추가하는 것이 좋다고 봄.
- Expand의 "info"는 여러개의 세션 또는 컨텍스트 간에 중복 결과를 방지한다. IKM은 같은 경우가 많으니 info 값을 salt 처럼 활용하는 것 같다.
- 만약 extarct에서 사용하는 입력 값이 높은 엔트로피를 갖고있으면 extract는 생략할 수 있다.
- 최종 결과 값 OKM 값이 해시 길이(예:32byte)보다 낮은 경우 PRK를 대신사용할 수 있지만, 권고하지 않음
보안
참고문헌
'개발관련 > (과거)메모' 카테고리의 다른 글
Runnable/ExecutableJAR with Maven(Java 배치프로그램/메이븐 빌드) (0) | 2021.05.19 |
---|---|
Docker 분석/정리 (0) | 2021.03.16 |
ChartJS 소개 및 기본 예제 (0) | 2021.02.04 |
Postgresql Streaming Replication(9.1) (0) | 2021.01.20 |
PostgreSQL 백업 & 복구 (0) | 2021.01.20 |