Skip to content

HD Wallet

  • HD 지갑(Hierarchical Deterministic Wallet)은 하나의 마스터 시드(Master Seed)로부터 계층적으로 여러 개의 키 쌍을 결정론적으로 생성할 수 있는 암호화폐 지갑이다. 이는 BIP32(Bitcoin Improvement Proposal 32) 표준으로 정의되었으며, 사용자가 하나의 시드만 백업하면 모든 키를 복구할 수 있다는 장점이 있다.

  • HD 지갑은 암호화폐 사용의 편의성과 보안을 크게 향상시킨 핵심 기술이며, BIP32/39/44 표준을 통해 서로 다른 지갑 간 호환성을 보장한다.

  • 대부분의 현대 암호화폐 지갑이 HD 지갑 방식을 채택하고 있다.

    • 소프트웨어 지갑: MetaMask, Trust Wallet, Exodus 등
    • 하드웨어 지갑: Ledger, Trezor 등
    • 모바일 지갑: Coinbase Wallet, Blockchain.com 등
    • 거래소도 내부적으로 HD 지갑을 사용하여 사용자별 주소를 관리한다.
  • 동작

    1. HD 지갑의 마스터 시드를 정한다. (128~256비트의 무작위 값)

      • 일반적으로 BIP39 표준에 따라 12개 또는 24개의 니모닉 단어(Mnemonic Words)로 표현된다.
      • e.g. “army van defense carry jealous true garbage claim echo media make crunch”
      • PBKDF2 함수를 통해 니모닉 단어와 선택적 패스프레이즈(passphrase)를 512비트 시드로 변환한다.
    2. 마스터 시드를 기준으로 하여, 트리 구조로 키를 생성한다.

      • 마스터 키(Master Key)에서 시작하여 자식 키(Child Key)를 파생시킨다. 동일한 시드에서는 항상 동일한 순서로 동일한 키가 생성된다.
      • 각 키는 인덱스를 가지며, 2^31개의 일반 자식 키와 2^31개의 강화된 자식 키(Hardened Child Key)를 생성할 수 있다.
      • 경로 표기법: m/44’/0’/0’/0/0 (m은 마스터, ‘는 강화된 키를 의미)
      • 부모 키로부터 자식 키를 파생할 때 HMAC-SHA512 해시 함수를 사용한다.
  • BIP44 경로 구조

    m / purpose' / coin_type' / account' / change / address_index
    예시:
    m/44'/0'/0'/0/0 - 비트코인 첫 번째 계정의 첫 번째 외부 주소
    m/44'/60'/0'/0/0 - 이더리움 첫 번째 계정의 첫 번째 외부 주소
    m/44'/0'/0'/1/0 - 비트코인 첫 번째 계정의 첫 번째 내부 주소 (거스름돈)
    • purpose: 항상 44’ (BIP44 표준)
    • coin_type: 암호화폐 종류 (0’ = Bitcoin, 60’ = Ethereum, 2’ = Litecoin 등)
    • account: 계정 인덱스 (사용자가 여러 계정을 분리하여 사용 가능)
    • change: 0 = 외부 체인(수신 주소), 1 = 내부 체인(거스름돈 주소)
    • address_index: 주소 인덱스
  • HD 지갑에는 두 가지 키 파생 방식이 있다.

    • 일반 파생(Normal Derivation): 부모의 확장 공개 키(xpub)만으로 자식 공개 키를 만들 수 있다.

      • 장점: 개인 키 없이도 주소를 계속 생성할 수 있어 편리하다.
      • 문제점: 부모의 확장 공개 키(xpub) + 자식 중 하나의 개인 키가 동시에 노출되면, 수학적으로 부모의 개인 키를 역산할 수 있다. 이렇게 되면 모든 형제 키의 개인 키도 유출된다.
    • 강화된 파생(Hardened Derivation): 자식 키를 만들 때 부모의 개인 키를 필수로 사용한다.

      • 확장 공개 키만으로는 자식 키를 생성할 수 없다.
      • xpub과 자식 개인 키가 동시에 노출되어도 부모 개인 키를 역산할 수 없다.
      • 경로 표기에서 ‘(apostrophe)로 표시한다. (예: 0’ 는 강화된 인덱스 0)
      • 실제로는 2^31 이상의 인덱스 값을 사용한다. (0’ = 2^31 + 0)
    • 계층마다 적절한 방식을 선택한다.

      m / 44' / 0' / 0' / 0 / 0
      ↑ ↑ ↑ ↑ ↑
      강화 강화 강화 일반 일반
      상위 레벨(purpose, coin_type, account): 강화된 파생 사용
      → 보안이 중요한 계층. 개인 키 없이는 하위 키를 생성할 수 없음
      하위 레벨(change, address_index): 일반 파생 사용
      → 편의성이 필요한 계층. xpub으로 주소를 계속 생성 가능
      → 거래소나 회계사에게 xpub을 공유하면 모든 거래 주소를 볼 수 있지만, 돈을 쓸 수는 없음
  • 확장 키(Extended Key)는 HD 지갑에서 사용하는 특별한 형태의 키다.

    • 확장 개인 키(xprv): 개인 키 + 체인 코드를 포함하며, 자식 키를 파생할 수 있다.
    • 확장 공개 키(xpub): 공개 키 + 체인 코드를 포함하며, 개인 키 없이 자식 공개 키를 파생할 수 있다.
    • Base58Check 인코딩으로 표현되며, “xprv”나 “xpub”로 시작한다.
    • 확장 공개 키를 공유하면 상대방이 모든 하위 주소를 볼 수 있지만 지출은 할 수 없다.
  • 장점

    • 하나의 시드만 백업하면 무한대의 키를 복구할 수 있다. 매번 새로운 주소를 쉽게 생성할 수 있어 프라이버시가 향상된다.
    • 부서별, 용도별로 키를 계층적으로 관리할 수 있다.
    • 확장 공개 키를 공유하여 제3자가 거래를 감사할 수 있다.
    • 하나의 시드로 여러 암호화폐 지갑을 관리할 수 있다.
  • 보안 고려사항

    • 시드 구문은 절대 온라인에 저장하거나 공유하지 않아야 한다. 패스프레이즈를 추가하면 시드가 노출되어도 추가 보안을 제공할 수 있다.
    • 확장 개인 키(xprv)가 노출되면 해당 계층 이하의 모든 키가 노출된다. 또는, 확장 공개 키(xpub) + 하나의 하위 개인 키가 노출되면 부모 개인 키를 유추할 수 있다. (강화된 파생이 아닌 경우)

참고