본문 바로가기
블록체인/크립토 월렛

11. 크립토 월렛의 개인키 관리 분석 - 크립토 월렛에서 개인키 관리를 위한 기술

by 비트코기 2023. 10. 1.

크립토 월렛 분석과 검토를 통한 개인키 관리 및 사례 연구

04. 크립토 월렛의 개인키 관리 분석


제3절 크립토 월렛에서 개인키 관리를 위한 기술

 

크립토 월렛에서 개인키를 관리하기 위한 기술적 요소가 있다. 대표적으로 BIP-32, BIP-39가 있다. BIP(Bitcoin Improvement Proposals)란 비트코인을 개선하고자 제안하는 개선 제안서이다. 크립토 월렛에서 사용하는 핵심 기술에 대해 알아본다.

 

1. HD 월렛(Hierarchical Deterministic Wallets)

BIP-32 HD 월렛은 결정론적 지갑을 위한 표준 규격으로 하나의 시드(Seed)로부터 여러 개의 키 쌍 체인을 파생시키는 방법을 정의한다. HD 월렛에는 트리 구조에서 생성된 키를 담고 있다. 이 구조에서는 부모 키가 자식 키 열을 만들어 낼 수 있고 각각의 자식 키는 손자 키 열을 만들어 낼 수 있으며 이 과정이 무한대로 반복된다.

 

HD 월렛은 무작위(비결정적) 키에 대해 두 가지 주요한 장점을 제공한다. 첫째, 유기적인 의미를 표현하기 위해 트리 구조가 사용될 수 있다. 둘째, 사용자가 해당 개인키에 접근하지 않고도 일련의 공개키를 생성할 수 있다. 이러한 특성 때문에 안전하지 않은 서버상에서나 수신 기능이 있는 서버에서도 HD 월렛을 사용할 수 있고 각각의 거래에 대해 다른 공개키를 발급하게 된다. 이러한 트리 구조는 <그림 3-1>에 나와 있다.

 

<그림 3-1> Seed에서 생성된 키로 구성된 트리, 출처 :  Pieter Wuille,  BIP-32: Hierarchical Deterministic Wallets,   n.p.: bip-0032.mediawiki, 2012.

 

HD 월렛은 단일 시드(Seed)에서 시작하여 각각의 하위 체인에서는 하위 키들을 파생시키기 위해 이전 키와 체인에 대한 정보를 사용한다. HD 월렛 구조는 아래와 같다.

 

<표 3-1> HD 월렛의 주요 구성요소

구성요소 설명
Master Seed HD 월렛의 뿌리가 되는 값으로 암호학적으로 안전한 난수(random number)를 생성해서 만든다. 이 값은 모든 계정(account) 및 하위 체인의 개인키를 생성하는 데 사용된다.
Master Node Master Seed에서 파생된 최상위 키값을 의미하며 모든 계정 및 하위 체인의 개인키 생성에 사용되며 Master Private Key와 Master Public Key 값을 갖는다.
Wallets/Accounts HD 월렛은 하나 이상의 계정으로 구성된다. 각 계정은 독립적인 하위 체인을 가지며 각각의 계정에서 사용하는 모든 키 쌍은 Master Node에서 파생된다. 하나의 HD 월렛 내에 여러 개의 계정을 만들 수 있으며 이러한 계정은 각각 서로 다른 목적으로 사용될 수 있다.
Wallet Chains 각 계정은 하나 이상의 하위 체인을 가질 수 있으며 하위 체인은 각각 독립적인 인덱스 값을 갖는 다수의 키 쌍으로 구성된다.
하위 체인은 같은 계정 내에서 생성되며 Master Node를 사용해 파생된다.
Address HD 월렛은 다수의 주소를 포함하며 각각의 주소는 하위 체인에서 파생된 공개키의 해시값으로 만들어진다. 이러한 주소는 비트코인을 수신하기 위해 사용되며 HD 월렛은 필요에 따라 새로운 주소를 동적으로 생성할 수 있다.

이러한 HD 월렛 구조는 백업 프로세스를 간소화하고 더욱 안전한 비트코인 월렛을 만든다.

 

2. 니모닉 코드(Mnemonic Code)

BIP-39 니모닉 코드는 12개 또는 24개의 영어 단어로 이루어진 시드(Seed) 값의 암호화된 표현이다. 이 시드 값은 지갑의 개인키를 생성하는 데 사용된다.

 

<그림 3-2> 니모닉 코드 생성 및 시드 추출 과정

 

니모닉은 엔트로피를 32비트의 배수로 인코딩한다. 엔트로피가 많을수록 보안이 향상되지만, 문장 길이가 늘어난다. 초기 엔트로피 허용 길이는 128~256비트이다. <표 3-2>은 니모닉 코드 생성 및 시드 추출 과정을 설명한다.

 

<표 3-2> 니모닉 코드 생성 및 시드 추출 과정

구분 절차 설명
니모닉 코드 생성 Entropy 생성 암호학적으로 랜덤한 128~256비트의 엔트로피를 생성한다.
해시값 생성 SHA256 알고리즘을 이용해 해시값을 구하고 해시값 중 왼쪽에서 ‘엔트로피의 길이/32비트’만큼의 체크섬을 생성한다.
체크섬 결합 생성된 체크섬을 엔트로피의 끝에 추가한다.
단어 치환 결합한 132비트를 11비트 단위로 분할하고 각각의 11비트 값을 BIP-39에 정의된 2,048개의 단어로 치환한다.
니모닉 코드 생성 단어 시퀀스로부터 순서를 유지하면서 니모닉 코드를 생성한다.
시드 생성 솔트(Salt) 생성된 니모닉 코드와 솔트 값을 결합한다.
키 스트레칭
(Key Stretching)
솔트와 결합된 값을 PBKDF2 (Password-Based Key Derivation Function Version 2) 키 스트레칭 함수를 이용하여 HMAC-SHA512 (Hash-based Message Authentication Code-Secure Hash Algoritm 512) 알고리즘을 이용해 키 스트레칭한다.
시드 생성 PBKDF2 알고리즘을 이용해 2048번의 해싱을 통해 512비트의 시드를 생성한다.

추가로 솔트와 키 스트레칭은 브루트-포스 공격(Brute-force Attack)이나 레인보우 테이블 공격(Rainbow Table Attack)을 방지하기 위해 값에 임의의 값인 솔트를 추가하고 해시 알고리즘을 여러 번 반복하는 키 스트레칭을 통해 다양한 공격으로부터 데이터를 보호하는 것이다.

 

니모닉 단어 목록에는 다음과 같은 특징이 있다. 첫 번째 현명한 단어 선택이다. 단어 목록은 처음 네 글자를 입력해 명확하게 식별할 수 있는 단어로 생성된다. 두 번째로 비슷한 단어는 피한다. “build”와 “built”, “woman”과 “women”, “quick”과 “quickly”와 같은 단어 쌍은 문장을 기억하기 어렵게 만들 뿐 아니라 오류가 발생하기 쉽고 추측하기 어렵게 된다. 마지막으로 정렬된 단어 목록을 사용한다. 코드 단어를 보다 효율적으로 조회할 수 있도록 단어 목록이 정렬된다. 단어 목록은 네이티브 문자를 포함할 수 있지만 NFKD(Normalization Form Compatibility Decomposition)를 사용하여 UTF-8(Unicode Transformation Format)로 인코딩해야 한다.

 

BIP-39 니모닉 코드는 비트코인 지갑뿐만 아니라 다른 암호화폐 지갑에서도 널리 사용되고 있다. 이 표준을 준수하는 지갑들은 서로 호환될 수 있어 니모닉 코드를 백업하고 여러 지갑 간 이전이 가능해진다.

반응형

댓글