검수요청.png검수요청.png

"HD 지갑"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
(계층 결정적 지갑)
(HD 지갑 계정 만드는 방법)
 
(사용자 2명의 중간 판 24개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''HD 지갑'''<!--HD지갑-->(에이치디 지갑)이란 Hierarchical Deterministic Wallet의 약자로서, 하나의 마스터 [[시드]](seed) 키를 사용하여 무수히 많은 주소를 생성할 수 있는 [[암호화폐 지갑]]이다. '''계층적 결정 지갑'''이라고 한다. 기존의 암호화폐 지갑은 필요할 때마다 매번 새로 생성해야 해서 매우 번거롭고 불편했지만, HD 지갑을 사용하면 하나의 마스터 시드 키에서 다수의 지갑을 생성할 수 있어서 매우 편리하다.<ref>"[https://www.investopedia.com/terms/h/hd-wallet-hierarchical-deterministic-wallet.asp HD Wallet (Hierarchical Deterministic Wallet)]", ''Investopia''</ref>
+
'''HD 지갑'''<!--HD지갑-->(에이치디 지갑)이란 Hierarchical Deterministic Wallet의 약자로서, 하나의 마스터 [[시드]](seed) [[키]]를 사용하여 무수히 많은 주소를 생성할 수 있는 [[암호화폐 지갑]]이다. '''계층적 결정 지갑'''이라고도 한다.
 
 
HD 지갑을 사용하는 암호화폐에는 [[카르다노]](에이다)와 한국의 [[모파스]](MoFAS) 등이 있다.
 
  
 
== 개요 ==
 
== 개요 ==
[[파일:BIP32.png|썸네일|500픽셀|'''[[BIP32]]''']]
+
HD 지갑은 단일 시드에서 많은 키를 쉽게 유도하기 위해 만들어졌다. HD 지갑은 [[비트코인]]의 [[BIP32]]표준으로 정의되어 현재 가장 개선적인 [[지갑]]이라는 평가를 받고 있다. HD 지갑은 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 구조인 트리 구조로 파생된 키를 포함한다. 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 있다. HD 지갑은 BIP32에서 제안되었고, [[BIP44]]에서 개선되었다.<ref name="공룡">공룡, 〈[https://blog.naver.com/forkblock/221559838087 HD Wallet]〉, 《네이버 블로그》, 2018-10-26</ref> 기존의 암호화폐 지갑은 필요할 때마다 매번 새로 생성해야 해서 매우 번거롭고 불편했지만, HD 지갑을 사용하면 하나의 마스터 시드 키에서 다수의 지갑을 생성할 수 있어서 매우 편리하다.<ref>"[https://www.investopedia.com/terms/h/hd-wallet-hierarchical-deterministic-wallet.asp HD Wallet (Hierarchical Deterministic Wallet)]", ''Investopia''</ref> HD 지갑을 사용하는 암호화폐에는 [[카르다노]](에이다)와 한국의 [[모파스]](MoFAS) 등이 있다.
HD 지갑은 먼저 BIP-32 문서를 코드로 프로그래밍화한 것을 말한다. HD 지갑은 결정적 계층 구조 지갑으로 2진 트리처럼, 또는 부모-자손 관계를 이용해 끝없이 파생시킬 있는 지갑이다. BIP32에서 제안되었고, BIP44에서 개선되었다.<ref name="공룡">공룡, 〈[https://blog.naver.com/forkblock/221559838087 HD Wallet]〉, 《네이버 블로그》, 2018-10-26</ref>
 
  
 
== 지갑의 유형 ==
 
== 지갑의 유형 ==
 
[[파일:비결정적지갑.PNG|썸네일|300픽셀|'''[[비결정적 지갑]]''']]
 
[[파일:비결정적지갑.PNG|썸네일|300픽셀|'''[[비결정적 지갑]]''']]
 
[[파일:결정적지갑.PNG|썸네일|300픽셀|'''[[결정적 지갑]]''']]
 
[[파일:결정적지갑.PNG|썸네일|300픽셀|'''[[결정적 지갑]]''']]
 +
[[파일:계층결정적지갑.PNG|썸네일|300픽셀|'''[[HD 지갑]]''']]
 +
 +
지갑은 키 간의 연관성 유무에 따라 두 가지 종류로 나뉜다. 먼저 [[비결정적 지갑]]은 [[키]] 간의 연관성이 없어 각각의 키는 독립적으로 서로 다른 [[난수]]에서 생성된다. 또 다른 종류는 [[결정적 지갑]]이다. 모든 키가 시드라고 알려진 하나의 마스터 키에서 유도되어 나온다. 모든 키가 서로 연관되어 있으며 원본 시드가 있는 경우 복구가 가능하다. 키 유도 방법은 여러 가지가 있는데 그 중 가장 일반적으로 사용되는 방법이 바로 HD 지갑이다. 비결정적 지갑은 [[백업]]이 너무 성가시고 가장 기본적인 상황에서 사용되므로, 백업용으로 [[니모닉 시드]]가 있는 HD 지갑을 사용하는 것이 좋다.<ref name="modolee">modolee, 〈[https://steemit.com/kr-dev/@modolee/mastering-ethereum-4-wallet (Mastering Ethereum) 4장 지갑(Wallet)]〉, 《스팀잇》, 2018-11</ref>
  
지갑은 2가지의 종류가 있다. 첫 번재 종류는 [[]] 간의 연관성이 없는 [[비결정적 지갑]]이다. 각각의 키가 독립적으로 서로 다른 [[난수]]에서 생성된다. 두 번째 종류는 [[결정적 지갑]]으로 키 간의 연관성이 있다. 모든 키가 시드라고 알려진 하나의 마스터 키에서 유도되어 나온다. 모든 키가 서로 연관되어 있으며 원본 시드가 있는 경우 복구가 가능하다. 유도 방법은 여러 가지가 있는데 그 중 하나가 HD 지갑이다. 비결정적 지갑은 [[백업]]이 너무 성가시고 가장 기본적인 상황에서 사용되므로, 백업용으로 니모닉 시드가 있는 HD 지갑을 사용하는 것이 좋다.<ref name="modolee">modolee, 〈[https://steemit.com/kr-dev/@modolee/mastering-ethereum-4-wallet (Mastering Ethereum) 4장 지갑(Wallet)]〉, 《스팀잇》, 2018-11</ref>
+
=== 비결정적 지갑 ===
 +
이전 스타일의 지갑은 각 지갑 파일에 무작위로 추출된 단일 [[개인키]]를 저장했는데, 이러한 방법은 여러 측면에서 불편하기 때문에 결정적 지갑으로 대체되고 있다. 예를 들어서 암호화폐를 사용하는 동안 프라이버시를 극대화한다는 차원에서는 암호화폐 [[주소]]의 재사용을 피하는 것이 좋은 지침으로 간주된다. 즉, 자금을 받을 때마다 새로운 개인키가 필요한 새로운 주소를 사용한다. 더 나아가 [[트랜잭션]]에 대해 새로운 주소를 사용할 수 있지만, [[토큰]]을 많이 처리하면 비용도 많이 들 수 있다. 이렇게 하려면 비결정적 지갑은 정기적으로 목록을 증가시켜야 하는데, 이는 정기적인 백업이 필요하다는 뜻이다. 만약 지갑을 백업하기 전에 [[데이터]]를 잃어버리면 자금과 [[스마트 계약]]에 접근할 수 없게 된다. 따라서 비결정적 지갑은 때마다 모두 새로운 주소를 위한 새로운 지갑 파일을 만들기 때문에 다루기가 가장 어렵다.
  
 
=== 결정적 지갑 ===
 
=== 결정적 지갑 ===
결정적 지갑은 하나의 마스터 키 또는 시드에서 파생된 모든 개인 키를 포함하고 있다. 시드는 랜덤하게 생성된 숫자로 인덱스 번호 또는 '체인 코드'와같은 다른 데이터와 조합되어 개인 키를 유도한다. 백업시 하나의 백업으로 모든 유도된 키를 복구할 수 있어 지갑의 모든 자금과 내용을 보호하는데 좋다. 시드로 지갑 임포트, 익스포트가 가능해서 다른 지갑간의 이동이 가능하다. 이런 설계는 전체 지갑의 접근에 시드 하나만 필요하므로, 시드 보안을 가장 중요하게 만든다. <ref name = "modolee"></ref>
+
결정적 혹은 시드 지갑은 하나의 마스터 키 또는 하나의 시드에서 파생된 개인 키를 포함하고 있다. 시드는 개인키를 만들기 위해 랜덤하게 생성된 숫자로, 인덱스 번호 또는 [[체인]] 코드와 같은 다른 데이터와 결합되어 개인 키를 유도한다. 결정적 지갑에서 시드는 모든 파생된 키를 복구할 수 있다. 그러므로 생성 시점에 단일 백업으로 지갑의 모든 자금과 스마트 계약을 보호할 수 있다. 또한 시드는 지갑을 내보내거나 가져오기에 활용 가능해서 다른 지갑 간에 모든 키를 쉽게 이동시킬 수 있다. 이런 설계로 인해 시드 하나만 있다면 전체 지갑에 접근할 수 있으므로, 시드 보안은 매우 중요하다. <ref name = "modolee"></ref> 한편 보안 노력을 단일 데이터에 집중할 수 있다는 것은 장점으로 볼 수 있다.
  
=== 계층 결정적 지갑 ===
+
=== HD 지갑 ===
[[파일:계층결정적지갑.PNG|썸네일|300픽셀|'''[[계층 결정적 지갑]]''']]
+
결정적 지갑은 단일 시드에서 많은 키를 쉽게 유도하기 위해 만들어졌다. 현재 가장 진보한 형태의 결정적 지갑은 비트코인의 BIP32 표준으로 정의된 HD 지갑이다. HD 지갑은 부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 구조인 트리 구조로 파생된 키를 포함한다. 이러한 구조는 부모 키가 자식 키의 시퀀스를 유도할 수 있고, 각각의 자식은 다시 또 손자 키의 시퀀스를 유도할 수 있다. HD 지갑은 결정적 지갑에 비해 몇 가지 장점이 있다. 먼저 HD 지갑의 트리 구조는 예를 들어, 특정 서브 키의 특정 분기는 입금을 위해 사용하고, 다른 브랜치는 출금의 잔돈을 받기 위해 사용할 수 있다. 또한 부서, 자회사, 특정 기능 또는 회계 카테고리로 다른 분기를 할당하여 기업 설정과 같은 구조적인 의미를 표현하는 데도 사용할 수 있다. HD 지갑의 또 다른 장점은 사용자가 개인키에 접근하지 않고, 연속된 [[공개키]]를 생성할 수 있는 것이다. HD 지갑은 보안상 안전하지 않은 서버, 보기 전용, 수신 전용의 용도로 사용할 수 있는데, 이때 지갑에는 자금을 움직이는 개인키가 들어 있지 않게 만들 수 있다.<ref name = "modolee"></ref>
결정적 지갑은 단일 시드에서 많은 키를 쉽게 유도하기 위해 만들어졌다. 현재 가장 진보한 형태의 결정적 지갑은 비트코인의 BIP32 표준에 정의된 계층 결정적 지갑(HD 지갑)이다. HD 지갑은 트리구조(부모 키가 연속된 자식 키를 유도할 수 있고, 각각의 자식키는 손자 키를 유도할 수 있는 구조)의 유도 키를 포함한다. 계층 결정적 지갑의 트리 구조는 결정적 지갑보다 추가적인 조직적 의미를 나타내는 데 사용할 수 있다. 특정 서브 키의 브랜치는 입금을 위해 사용하고, 다른 브랜친는 출금의 잔돈을 받기 위해 사용할 수 있다. 키 브랜치는 기업 설정에도 사용 할 수 있어 부서, 자회사, 특정 기능 또는 회계 카테고리를 다른 브랜치로 할당할 수 있다. 또한, 사용자가 개인 키에 접근하지 않고, 연속된 공개 키를 생성할 수 있다. 자금을 사용할 수 있는 개인 키를 지갑이 가지고 있지 않기 때문에 안전하지 않은 서버나 감시 전용 또는 수신 전용으로 사용할 수 있다. <ref name = "modolee"></ref>
 
  
 
== HD 지갑의 발달 과정 ==
 
== HD 지갑의 발달 과정 ==
  
 
=== RNG ===
 
=== RNG ===
[[RNG]]는 [[난수]] 발생기라는 뜻으로, [[운영체제]]에서 만드는 무작위성을 생성하는 함수를 말한다. 주로 저장장치의 출력값으로 만들거나 날짜와 시간으로 생성한다. 그런데 일반 운영체제가 만들어주는 랜덤 숫자는 보안성이 높지 않다. 그 이유는 [[해커]]가 그 값을 예측할 수 있기 때문이다. 이런 경우를 '엔트로피가 낮다'라고 표현한다. 그래서 학자들은 이 숫자들을 다시 해시값으로 변환해서 해시 알고리즘을 공개하지만 않으면 완벽하게 예측할 수 없는 숫자를 만들어내는 알고리즘을 만들어 냈다. DRBG(Deterministic Random Bits Generate)가 이와 같이 랜덤하게 생성된 숫자를 해시함수를 통해 순차적으로 생산하는 알고리즘이다. 이 알고리즘은 [[NIST]]에 의해서 국제 표준으로 권장되며 비트코인도 여기에 영향을 받아 사용한다.<ref name="공룡"></ref>
+
[[RNG]]는 [[난수]] 발생기라는 뜻으로, [[운영체제]]에서 만드는 무작위성을 생성하는 함수를 말한다. 주로 저장장치의 출력값으로 만들거나 날짜와 시간으로 생성한다. 그런데 일반 운영체제가 만들어주는 랜덤 숫자는 보안성이 높지 않다. 그 이유는 [[해커]]가 그 값을 예측할 수 있기 때문이다. 이런 경우를 '엔트로피가 낮다'라고 표현한다. 그래서 학자들은 이 숫자들을 다시 [[해시값]]으로 변환해서 [[해시]] [[알고리즘]]을 공개하지만 않으면 완벽하게 예측할 수 없는 숫자를 만들어내는 알고리즘을 만들어 냈다. [[DRBG]](Deterministic Random Bits Generate)가 이와 같이 랜덤하게 생성된 숫자를 해시함수를 통해 순차적으로 생산하는 알고리즘이다. 이 알고리즘은 [[NIST]]에 의해서 국제 표준으로 권장되며 비트코인도 여기에 영향을 받아 사용한다.<ref name="공룡"></ref>
  
 
=== HMAC-SHA512 ===
 
=== HMAC-SHA512 ===
HMAC(Hash-based Message Authentication Code)는 해시기반 메세지 인증 방식을 말한다. 최초의 HMAC은 서로간의 메시지 내용을 확인하기 위해 고안된 알고리즘이다. 만일 내가 작성된 메시지와 함께 내용을 암호화 해서 같이 보내면 상대는 받은 내용을 다시 암호화 해서 기존의 받은 암호문과 비교한다. XOR 연산을 통해서 키 값을 패딩한 후 이를 메세지 내용과 연결후 Hash값을 생성한다. 이렇게 한차례 더 Hash값을 얻어낸 숫자가 바로 저희가 원하는 숫자를 구하는 방식이다.<ref name = "공룡"></ref> HMAC-SHA512를 통해 처음 생성된 키가 마스터 노드이다. 마스터 노드는 64바이트의 16진수로 구성되어 있다. 이를 파생시키는 방법은 준비되어 있는 마스터 노드를 32바이트 2개로 나누고 이를 다시 HMAC-SHA512 해시 함수에 넣어서 64바이트 숫자를 생성한다. 이런식으로 하면 거의 무한대로 키와 비트코인 주소를 생산할 수 있다. .<ref name = "공룡"></ref>
+
[[HMAC]](Hash-based Message Authentication Code)는 해시기반 메세지 인증 방식을 말한다. 최초의 HMAC은 서로간의 메시지 내용을 확인하기 위해 고안된 알고리즘이다. 만일 내가 작성된 메시지와 함께 내용을 [[암호화]] 해서 같이 보내면 상대는 받은 내용을 다시 암호화 해서 기존의 받은 암호문과 비교한다. [[XOR]] 연산을 통해서 키 값을 [[패딩]]한 후 이를 메세지 내용과 연결후 해시값을 생성한다. 이렇게 한차례 더 해시값을 얻어낸 숫자가 바로 원하는 숫자를 구하는 방식이다.<ref name = "공룡"></ref> [[HMAC-SHA512]]를 통해 처음 생성된 키가 [[마스터노드]]이다. 마스터노드는 64바이트의 16진수로 구성되어 있다. 이를 파생시키는 방법은 준비되어 있는 마스터노드를 32바이트 2개로 나누고 이를 다시 HMAC-SHA512 해시 함수에 넣어서 64바이트 숫자를 생성한다. 이런식으로 하면 거의 무한대로 키와 비트코인 주소를 생산할 수 있다. .<ref name = "공룡"></ref>
  
=== 단절된 파생법(Hardened derivation) ===
+
=== 단절된 파생법 ===
Hardened derivation은 [[단절된 파생법]]이라 부른다. 마약 우연히 마스터 노드를 해커가 알게된다면 모든 마스터 노드들의 자식 키를 알아낼 수 있다. 이를 방지하기 위해서 도입된 개념이다. Hardened derivation은 각 자손 키들마다 인덱스를 선택해 넣어준다. 그 인덱스 값이 표현할 수 있는 가짓수가 2의 64제곱 값을 갖는다면 거의 단절되었다고 볼 수 있다. 만약 하나의 자식 키를 알아 냈더라도 다시 그 다음 파생된 자식 키의 값을 알아내려면 2의 64제곱의 숫자만큼 다시 대입해봐야 한다. 그래서 이를 단절됐다고 표현한다. 이런 문제점을 해결하기 위해 [[BIP32]]는 가장 처음 파생되는 값에는 단절 파생법을 제안한다.<ref name="공룡"></ref>
+
만약 우연히 마스터 노드를 해커가 알게된다면 모든 마스터 노드들의 자식 키를 알아낼 수 있다. 단절된 파생법(Hardened derivation)은 이를 방지하기 위해서 도입된 개념이다. 강화된 유도(Hardened derivation)는 각 자손 키들마다 인덱스를 선택해 넣어준다. 그 인덱스 값이 표현할 수 있는 가짓수가 2의 64제곱 값을 갖는다면 거의 단절되었다고 볼 수 있다. 만약 하나의 자식 키를 알아 냈더라도 다시 그 다음 파생된 자식 키의 값을 알아내려면 2의 64제곱의 숫자만큼 다시 대입해봐야 한다. 그래서 이를 단절됐다고 표현한다. 이런 문제점을 해결하기 위해 [[BIP32]]는 가장 처음 파생되는 값에는 단절 파생법을 제안한다.<ref name="공룡"></ref>
  
 
== HD 지갑 계정 만드는 방법 ==
 
== HD 지갑 계정 만드는 방법 ==
HD 지갑을 통해 계정을 만들기 위해서는 크게 두 가지가 필요하다. 하나는 시드라는 정숫값이고, 다른 하나는 그 계정까지의 경로이다. HD 지갑의 경로는 여러 개의 정수로 구성되며 그 개수에 제한은 없다. HD 지갑은 시드와 경로가 있으면 항상 동일한 값의 자식 키를 구할 수 있다. 자식들은 Tree와 같이 계층적인 구조를 가진다.<ref name="Hyunsik Jeong in">Hyunsik Jeong in, 〈[https://medium.com/codechain-kr/%EC%BD%94%EB%93%9C%EC%B2%B4%EC%9D%B8%EA%B3%BC-hd-wallet-d7a9e120794f 코드 체인과 HD WALLET]〉, 《MEDIUM》, 2018-10-22</ref>
+
HD 지갑을 통해 계정을 만들기 위해서는 크게 두 가지가 필요하다. 하나는 시드라는 정숫값이고, 다른 하나는 그 계정까지의 경로이다. HD 지갑의 경로는 여러 개의 정수로 구성되며 그 개수에 제한은 없다. HD 지갑은 시드와 경로가 있으면 항상 동일한 값의 자식 키를 구할 수 있다. 자식들은 트리와 같이 계층적인 구조를 가진다.<ref name="Hyunsik Jeong in">Hyunsik Jeong in, 〈[https://medium.com/codechain-kr/%EC%BD%94%EB%93%9C%EC%B2%B4%EC%9D%B8%EA%B3%BC-hd-wallet-d7a9e120794f 코드 체인과 HD WALLET]〉, 《MEDIUM》, 2018-10-22</ref>
  
=== 시드 ===
+
* 시드 : HD 지갑은 시드로부터 마스터키를 생성한다. HD 지갑은 128, 256 또는 512비트 임의의 숫자인 단일 루트 시드(root seed)로 만든다. 일반적으로 닉모닉이 시드를 생성한다. HD 지갑의 모든 키는 루트 시드에서 결정적으로 파생되었으며, 모든 호환 HD 지갑에서 그 시드로부터 전체 HD 지갑을 재생성할 수 있다. 이것은 루트 시드를 파생시킨 [[니모닉]]을 전송하는 것만으로도 수천 혹은 수백만 개의 키가 포함된 HD 지갑의 내보내기, 백업, 복원, 가져오기를 쉽게 만든다.
HD 지갑은 시드로부터 마스터키를 생성한다. 그리고 HD 지갑은 키마다 자식 키를 생성할 수 있는데 번호가 0부터 2³² - 1까지 붙어있어 총 2³²개의 자식 키가 존재한다. 자식키는 용도에 따라 일반 자식 키(Normal Child Key)와 강화된 자식 키(Hardened Child Key)로 나뉜다. 일반 자식 키는 0부터 2³¹ -1번까지고 부모의 공개키를 통해서 해당 계정의 공개키를 구할 수 있다. 강화된 자식키는 2³¹부터 2³² - 1번까지고 부모의 비밀키를 알아야지만 공개키를 구할 수 있다. 강화된 자식키를 통해서 겉으로 부모와 연관이 없는 자식키를 만들 수 있다. <ref name="Hyunsik Jeong in"></ref>
 
  
=== 경로 ===
+
* 경로 : HD 지갑의 키는 경로(path) 이름 규칙을 사용하여 식별하며, 각 트리 레벨은 슬래시(/) 문자로 구분한다. 마스터 개인키로부터 파생된 개인 키는 m, 마스터 공개키에서 파생된 공개키는 M으로 시작한다. 따라서 m/0은 마스터 개인 키의 첫 번째 자식 개인 키이고, M/0은 첫 번째 자식 공개 키이다. m/0/1은 마스터 개인 키의 첫 번째 자식의 두 번째 자식의 개인키이며 마스터키의 손자의 공개키이다.<ref name = "modolee"></ref>
HD 지갑의 키는 각 트리 레벨이 /로 나눠지는 path 명명 규칙을 사용해서 구별한다. 마스터 개인 키로부터 유도된 개인 키들은 m, 공개키들은 M으로 시작한다. m/0은 마스터 개인 키의 첫 번째 자식 개인 키이고, M/0은 마스터 공개 키의 첫 번째 자식 공개 키이다. m/0/1은 마스터 공개 키의 첫 번째 가식의 두 번째 자식의 공개키이며 마스터키의 손자의 공개키이다. <ref name = "modolee"></ref>
 
  
== 장점 ==
+
{{각주}}
하위 계층의 지갑 주소는 개인키 없이 공개키로 만으로도 만들 수 있다. 즉, 개인키를 노출하지 않아도 된다. Seed 값으로 만든 마스터 개인키로 하위 계층의 개인키를 만들고, 마스터 공개키로 하위 계층의 공개키와 지갑 주소를 만들 수 있다. 즉, 하위 계층의 공개키는 개인키로 만드는 것이 아니라 상위계층의 공개키로 만들 수 있다, 지갑 주소를 만들 대 개인키를 사용하지 않는다. <ref> 미스터, 〈[https://sun2lub.blog.me/221385706639 '블록체인' 지갑이해하기]〉, 《네이버 블로그》, 2018-10-26 </ref> HD 지갑의 모든 키는 루트 시드로부터 파생되었기 때문에 다른 호환 가능한 HD 지갑에서도 시드로부터 재생산할 수 있다. 따라서 지갑을 쉽게 백업하고 복원하는 것이 쉽게 가능하다. <ref name = "modolee"></ref>
 
  
{{각주}}
+
== 참고자료 ==
 +
* 공룡, 〈[https://blog.naver.com/forkblock/221559838087 HD Wallet]〉, 《네이버 블로그》, 2018-10-26
 +
* "[https://www.investopedia.com/terms/h/hd-wallet-hierarchical-deterministic-wallet.asp HD Wallet (Hierarchical Deterministic Wallet)]", ''Investopia''
 +
* modolee, 〈[https://steemit.com/kr-dev/@modolee/mastering-ethereum-4-wallet (Mastering Ethereum) 4장 지갑(Wallet)]〉, 《스팀잇》, 2018-11
 +
* Hyunsik Jeong in, 〈[https://medium.com/codechain-kr/%EC%BD%94%EB%93%9C%EC%B2%B4%EC%9D%B8%EA%B3%BC-hd-wallet-d7a9e120794f 코드 체인과 HD WALLET]〉, 《MEDIUM》, 2018-10-22
  
 
== 같이 보기 ==
 
== 같이 보기 ==

2021년 12월 8일 (수) 16:01 기준 최신판

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. 1.0 1.1 1.2 1.3 1.4 공룡, 〈HD Wallet〉, 《네이버 블로그》, 2018-10-26
  2. "HD Wallet (Hierarchical Deterministic Wallet)", Investopia
  3. 3.0 3.1 3.2 3.3 modolee, 〈(Mastering Ethereum) 4장 지갑(Wallet)〉, 《스팀잇》, 2018-11
  4. Hyunsik Jeong in, 〈코드 체인과 HD WALLET〉, 《MEDIUM》, 2018-10-22

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 HD 지갑 문서는 암호화폐 지갑에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.