개발관련/(과거)메모

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를 확장한다.

플로우

  1. 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);
  2. 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를 대신사용할 수 있지만, 권고하지 않음

보안

참고문헌