HD 지갑
HD 지갑(에이치디 지갑)이란 Hierarchical Deterministic Wallet의 약자로서, 하나의 마스터 시드(seed) 키를 사용하여 무수히 많은 주소를 생성할 수 있는 암호화폐 지갑이다. 계층적 결정 지갑이라고도 한다.
목차
개요[편집]
HD 지갑은 단일 시드에서 많은 키를 쉽게 유도하기 위해 만들어졌다. HD 지갑은 비트코인의 BIP32표준으로 정의되어 현재 가장 개선적인 지갑이라는 평가를 받고 있다. HD 지갑은 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 구조인 트리 구조로 파생된 키를 포함한다. 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 수 있다. HD 지갑은 BIP32에서 제안되었고, BIP44에서 개선되었다.[1] 기존의 암호화폐 지갑은 필요할 때마다 매번 새로 생성해야 해서 매우 번거롭고 불편했지만, HD 지갑을 사용하면 하나의 마스터 시드 키에서 다수의 지갑을 생성할 수 있어서 매우 편리하다.[2] HD 지갑을 사용하는 암호화폐에는 카르다노(에이다)와 한국의 모파스(MoFAS) 등이 있다.
지갑의 유형[편집]
지갑은 키 간의 연관성 유무에 따라 두 가지 종류로 나뉜다. 먼저 비결정적 지갑은 키 간의 연관성이 없어 각각의 키는 독립적으로 서로 다른 난수에서 생성된다. 또 다른 종류는 결정적 지갑이다. 모든 키가 시드라고 알려진 하나의 마스터 키에서 유도되어 나온다. 모든 키가 서로 연관되어 있으며 원본 시드가 있는 경우 복구가 가능하다. 키 유도 방법은 여러 가지가 있는데 그 중 가장 일반적으로 사용되는 방법이 바로 HD 지갑이다. 비결정적 지갑은 백업이 너무 성가시고 가장 기본적인 상황에서 사용되므로, 백업용으로 니모닉 시드가 있는 HD 지갑을 사용하는 것이 좋다.[3]
비결정적 지갑[편집]
이전 스타일의 지갑은 각 지갑 파일에 무작위로 추출된 단일 개인키를 저장했는데, 이러한 방법은 여러 측면에서 불편하기 때문에 결정적 지갑으로 대체되고 있다. 예를 들어서 암호화폐를 사용하는 동안 프라이버시를 극대화한다는 차원에서는 암호화폐 주소의 재사용을 피하는 것이 좋은 지침으로 간주된다. 즉, 자금을 받을 때마다 새로운 개인키가 필요한 새로운 주소를 사용한다. 더 나아가 트랜잭션에 대해 새로운 주소를 사용할 수 있지만, 토큰을 많이 처리하면 비용도 많이 들 수 있다. 이렇게 하려면 비결정적 지갑은 정기적으로 키 목록을 증가시켜야 하는데, 이는 정기적인 백업이 필요하다는 뜻이다. 만약 지갑을 백업하기 전에 데이터를 잃어버리면 자금과 스마트 계약에 접근할 수 없게 된다. 따라서 비결정적 지갑은 때마다 모두 새로운 주소를 위한 새로운 지갑 파일을 만들기 때문에 다루기가 가장 어렵다.
결정적 지갑[편집]
결정적 혹은 시드 지갑은 하나의 마스터 키 또는 하나의 시드에서 파생된 개인 키를 포함하고 있다. 시드는 개인키를 만들기 위해 랜덤하게 생성된 숫자로, 인덱스 번호 또는 체인 코드와 같은 다른 데이터와 결합되어 개인 키를 유도한다. 결정적 지갑에서 시드는 모든 파생된 키를 복구할 수 있다. 그러므로 생성 시점에 단일 백업으로 지갑의 모든 자금과 스마트 계약을 보호할 수 있다. 또한 시드는 지갑을 내보내거나 가져오기에 활용 가능해서 다른 지갑 간에 모든 키를 쉽게 이동시킬 수 있다. 이런 설계로 인해 시드 하나만 있다면 전체 지갑에 접근할 수 있으므로, 시드 보안은 매우 중요하다. [3] 한편 보안 노력을 단일 데이터에 집중할 수 있다는 것은 장점으로 볼 수 있다.
HD 지갑[편집]
결정적 지갑은 단일 시드에서 많은 키를 쉽게 유도하기 위해 만들어졌다. 현재 가장 진보한 형태의 결정적 지갑은 비트코인의 BIP32 표준으로 정의된 HD 지갑이다. HD 지갑은 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 구조인 트리 구조로 파생된 키를 포함한다. 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 수 있다. HD 지갑은 결정적 지갑에 비해 몇 가지 장점이 있다. 먼저 HD 지갑의 트리 구조는 예를 들어, 특정 서브 키의 특정 분기는 입금을 위해 사용하고, 다른 브랜치는 출금의 잔돈을 받기 위해 사용할 수 있다. 또한 부서, 자회사, 특정 기능 또는 회계 카테고리로 다른 분기를 할당하여 기업 설정과 같은 구조적인 의미를 표현하는 데도 사용할 수 있다. HD 지갑의 또 다른 장점은 사용자가 개인키에 접근하지 않고, 연속된 공개키를 생성할 수 있는 것이다. HD 지갑은 보안상 안전하지 않은 서버, 보기 전용, 수신 전용의 용도로 사용할 수 있는데, 이때 지갑에는 자금을 움직이는 개인키가 들어 있지 않게 만들 수 있다.[3]
HD 지갑의 발달 과정[편집]
RNG[편집]
RNG는 난수 발생기라는 뜻으로, 운영체제에서 만드는 무작위성을 생성하는 함수를 말한다. 주로 저장장치의 출력값으로 만들거나 날짜와 시간으로 생성한다. 그런데 일반 운영체제가 만들어주는 랜덤 숫자는 보안성이 높지 않다. 그 이유는 해커가 그 값을 예측할 수 있기 때문이다. 이런 경우를 '엔트로피가 낮다'라고 표현한다. 그래서 학자들은 이 숫자들을 다시 해시값으로 변환해서 해시 알고리즘을 공개하지만 않으면 완벽하게 예측할 수 없는 숫자를 만들어내는 알고리즘을 만들어 냈다. DRBG(Deterministic Random Bits Generate)가 이와 같이 랜덤하게 생성된 숫자를 해시함수를 통해 순차적으로 생산하는 알고리즘이다. 이 알고리즘은 NIST에 의해서 국제 표준으로 권장되며 비트코인도 여기에 영향을 받아 사용한다.[1]
HMAC-SHA512[편집]
HMAC(Hash-based Message Authentication Code)는 해시기반 메세지 인증 방식을 말한다. 최초의 HMAC은 서로간의 메시지 내용을 확인하기 위해 고안된 알고리즘이다. 만일 내가 작성된 메시지와 함께 내용을 암호화 해서 같이 보내면 상대는 받은 내용을 다시 암호화 해서 기존의 받은 암호문과 비교한다. XOR 연산을 통해서 키 값을 패딩한 후 이를 메세지 내용과 연결후 해시값을 생성한다. 이렇게 한차례 더 해시값을 얻어낸 숫자가 바로 원하는 숫자를 구하는 방식이다.[1] HMAC-SHA512를 통해 처음 생성된 키가 마스터노드이다. 마스터노드는 64바이트의 16진수로 구성되어 있다. 이를 파생시키는 방법은 준비되어 있는 마스터노드를 32바이트 2개로 나누고 이를 다시 HMAC-SHA512 해시 함수에 넣어서 64바이트 숫자를 생성한다. 이런식으로 하면 거의 무한대로 키와 비트코인 주소를 생산할 수 있다. .[1]
단절된 파생법[편집]
만약 우연히 마스터 노드를 해커가 알게된다면 모든 마스터 노드들의 자식 키를 알아낼 수 있다. 단절된 파생법(Hardened derivation)은 이를 방지하기 위해서 도입된 개념이다. 강화된 유도(Hardened derivation)는 각 자손 키들마다 인덱스를 선택해 넣어준다. 그 인덱스 값이 표현할 수 있는 가짓수가 2의 64제곱 값을 갖는다면 거의 단절되었다고 볼 수 있다. 만약 하나의 자식 키를 알아 냈더라도 다시 그 다음 파생된 자식 키의 값을 알아내려면 2의 64제곱의 숫자만큼 다시 대입해봐야 한다. 그래서 이를 단절됐다고 표현한다. 이런 문제점을 해결하기 위해 BIP32는 가장 처음 파생되는 값에는 단절 파생법을 제안한다.[1]
HD 지갑 계정 만드는 방법[편집]
HD 지갑을 통해 계정을 만들기 위해서는 크게 두 가지가 필요하다. 하나는 시드라는 정숫값이고, 다른 하나는 그 계정까지의 경로이다. HD 지갑의 경로는 여러 개의 정수로 구성되며 그 개수에 제한은 없다. HD 지갑은 시드와 경로가 있으면 항상 동일한 값의 자식 키를 구할 수 있다. 자식들은 트리와 같이 계층적인 구조를 가진다.[4]
- 시드 : HD 지갑은 시드로부터 마스터키를 생성한다. HD 지갑은 128, 256 또는 512비트 임의의 숫자인 단일 루트 시드(root seed)로 만든다. 일반적으로 닉모닉이 시드를 생성한다. HD 지갑의 모든 키는 루트 시드에서 결정적으로 파생되었으며, 모든 호환 HD 지갑에서 그 시드로부터 전체 HD 지갑을 재생성할 수 있다. 이것은 루트 시드를 파생시킨 니모닉을 전송하는 것만으로도 수천 혹은 수백만 개의 키가 포함된 HD 지갑의 내보내기, 백업, 복원, 가져오기를 쉽게 만든다.
- 경로 : HD 지갑의 키는 경로(path) 이름 규칙을 사용하여 식별하며, 각 트리 레벨은 슬래시(/) 문자로 구분한다. 마스터 개인키로부터 파생된 개인 키는 m, 마스터 공개키에서 파생된 공개키는 M으로 시작한다. 따라서 m/0은 마스터 개인 키의 첫 번째 자식 개인 키이고, M/0은 첫 번째 자식 공개 키이다. m/0/1은 마스터 개인 키의 첫 번째 자식의 두 번째 자식의 개인키이며 마스터키의 손자의 공개키이다.[3]
각주[편집]
- ↑ 1.0 1.1 1.2 1.3 1.4 공룡, 〈HD Wallet〉, 《네이버 블로그》, 2018-10-26
- ↑ "HD Wallet (Hierarchical Deterministic Wallet)", Investopia
- ↑ 3.0 3.1 3.2 3.3 modolee, 〈(Mastering Ethereum) 4장 지갑(Wallet)〉, 《스팀잇》, 2018-11
- ↑ Hyunsik Jeong in, 〈코드 체인과 HD WALLET〉, 《MEDIUM》, 2018-10-22
참고자료[편집]
- 공룡, 〈HD Wallet〉, 《네이버 블로그》, 2018-10-26
- "HD Wallet (Hierarchical Deterministic Wallet)", Investopia
- modolee, 〈(Mastering Ethereum) 4장 지갑(Wallet)〉, 《스팀잇》, 2018-11
- Hyunsik Jeong in, 〈코드 체인과 HD WALLET〉, 《MEDIUM》, 2018-10-22
같이 보기[편집]