[마스터링 이더리움] 5장 지갑
지갑 정의
- 지갑은 암호화폐를 보관하는 것이 아님
- 지갑은 암호화폐를 제어할 수 있는 키를 보관하는 것임
- 또 트랜잭션을 생성하고, 서명하는 기능을 제공
HD 지갑과 Non-HD 지갑
- 지갑은 HD(Hierarchical Deterministic)지갑과 Non-HD지갑으로 나뉨.
- 둘의 차이는 지갑 속에 키들이 서로 연관이 있으면 HD지갑이고, 그렇지 않으면 Non-HD지갑임.
- Non-HD 지갑은 키가 필요하면 임의로 키를 생성하는 방식으로 키를 관리하기 매우 어려움. 특히 새로 생성되는 키를 백업하는 것은 매우 번거로움.
- HD지갑은 하나의 시드로 부터 복수의 개인키, 공개키, 계정을 만들 수 있음. 무한히 많은 수의 키를 만들 수 있음.
- 대부분의 지갑앱은 결정지갑임. 권장됨.
- HD지갑도 복수의 키를 가지고 있지만, 시드만 안다면 모든 키를 생성할 수 있기 때문에 백업에 매우 용이.
- HD지갑에서의 키 트리 구조
니모닉 생성 및 시드 생성 절차
- 메타매스크를 설치할 때, 니모닉이라는 것을 들어봤을 것임. 12개의 단어를 잘 저장하라고. 이게 바로 시드를 만들기 위한 니모닉임.
- 니모닉은 사람이 쉽게 기억하기 쉽고, 또 입력하기 쉽게 단어로 구성되어 있음. 없는 단어를 입력하면 빠르게 키 입력 오류를 발견할 수 있음.
니모닉과 시드를 구별해야 함. 위 그림의 7단계를 보면 니모닉과 암호문을 키 스트래칭 해쉬함수에 넣어 512비트의 시드를 생성한다.
시드를 생성할 때 옵션으로 암호문을 입력할 수 있는데, 암호문을 입력하면 2단계 인증을 할 수 있다.
암호문을 넣지 않은 상태라면, 니모닉이 노출되면 시드가 노출되고 모든 개인키, 공개키가 노출된다. 그러나 암호문을 입력한 상태라면, 니모닉이 노출되어도 암호문을 모르면 키는 노출되지 않는다.
따라서 안전하게 키를 관리하려면, 니모닉과 암호문을 별도의 장소에 보관해야 한다!!!
확장 개인키, 공개키
- 왜 확장키가 필요한가??? 공개키를 파생하는데 필요하다?
- 개인키가 없는 공개키를 다수 생성할 수 있다. 개인키가 없기 때문에 화폐를 인출할 수는 없다.
- 이것의 용도는 쇼핑카드와 같이 거래 내역을 기록하고 추적하는데 사용될 수 있다. 화폐 인출의 목적이 아니라, 물건의 흐름을 파악하고자 할 때 공개키로부터 계정을 생성하여 사용할 수 있다.
- 또 다른 용도는 하드웨어 지갑처럼, 개인키는 하드웨어에 저장하고, 공개키만 온라인에 저장해 두고 사용할 수 있다. 이 경우, 사용자는 복수의 수신 계정을 공개키로 생성할 수 있다.
확장키의 보안 취약
- 시드로 부터 키를 파생하는 기능은 매우 훌륭하지만, 보안에 매우 취약한 문제가 있다.
- 키 트리에서 한 자식노드의 개인키가 노출되면, 모든 키가 노출된다. 이것은 확장키가 체인 코드를 포함하기 때문에, 하나의 개인키와 부모의 체인 코드를 알면 전체 키를 유추해 낼 수 있기 때문이다.
강화 파생(hardened derivation)
- 이와 같은 보안 취약을 위해 부모 공개키와 자식 체인 코드 간의 관계를 끊는 강화 파생함수가 사용된다.
- 이 함수는 부모의 공개키를 체인 코드를 사용하는 것이 아니라, 부모의 개인키를 사용한다. 이렇게 함으로써 체인 코드는 부모의 개인키를 유추하는데 사용될 수 없게 된다.
지갑 식별자
- HD지갑은 복수의 키를 트리 형태로 갖는다.
- 트리의 깊이, 넓이에 따라 키 경로가 결정된다.
- 예
m/44'/60'/0'/0/2 -> 메인 이더리움 계정에 대한 세 번째 수신 공개키
M/44'/0'/3'/1/14 -> 4번째 비트코인 계정의 15번째 주소 변경 공개키
- 키 경로를 보면 어떤 암호화폐인지, 몇 번째 계정인지 알 수 있다.