BIP-39 표준 설명: 니모닉 시드 문구의 작동 원리
BIP-39(Bitcoin Improvement Proposal 39)는 니모닉 문장 — 익숙한 12개 또는 24개 단어 시퀀스 — 을 생성하는 표준을 정의하며, 이 문장은 암호화폐 지갑 키를 도출하는 데 사용되는 엔트로피(Entropy)를 인코딩합니다. 2013년 Marek Palatinus, Pavol Rusnak, Aaron Voisine, Sean Bowe가 발표한 BIP-39는 거의 모든 주요 암호화폐에서 지갑 백업의 지배적인 표준이 되었습니다.
기술적 수준에서 BIP-39를 이해하면 시드 문구 백업이 신뢰할 수 있다는 확신을 가질 수 있고, 다양한 지갑 구현의 보안 속성을 평가하는 데 도움이 됩니다.
BIP-39 개요
BIP-39는 두 가지 프로세스를 명시합니다:
- 니모닉 생성 — 랜덤 엔트로피를 사람이 읽을 수 있는 단어 시퀀스로 변환합니다.
- 시드 도출 — 니모닉 단어(및 선택적 패스프레이즈)를 BIP-32 계층적 결정론적 키 생성에 사용할 수 있는 512비트 바이너리 시드로 변환합니다.
이 두 프로세스는 의도적으로 분리되어 있습니다. 니모닉은 사람에게 친화적인 표현이고, 시드는 키 도출에 대한 암호학적 입력입니다.
단계 1: 엔트로피 생성
프로세스는 암호학적으로 안전한 랜덤 데이터(엔트로피) 블록으로 시작합니다. BIP-39는 다섯 가지 엔트로피 크기를 지원합니다:
| 엔트로피 (비트) | 체크섬 (비트) | 총합 (비트) | 단어 수 |
|---|---|---|---|
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
실제로 거의 모든 지갑은 128비트(12단어) 또는 256비트(24단어)만 사용합니다. 다른 크기는 사양에 따라 유효하지만 거의 구현되지 않습니다.
엔트로피 소스의 품질이 가장 중요합니다. 난수 생성기가 편향되거나, 예측 가능하거나, 엔트로피가 불충분한 경우, 생성된 시드 문구를 공격자가 추측할 수 있습니다. 이 주제에 대한 자세한 설명은 엔트로피와 무작위성 가이드를 참조하세요.
엔트로피 소스
- 하드웨어 난수 생성기 (HRNG) — Ledger, Trezor 같은 하드웨어 지갑에서 사용됩니다. 물리적 현상(열 잡음, 산탄 잡음)을 샘플링하여 진정한 무작위성을 생성합니다.
- 운영 체제 CSPRNG — Linux/macOS의
/dev/urandom, Windows의CryptGenRandom, 브라우저의crypto.getRandomValues(). 이것들은 하드웨어 엔트로피 소스에서 시드된 암호학적으로 안전한 의사 난수 생성기(CSPRNG)입니다. - 주사위 굴리기 — 일부 사용자는 카지노 등급 주사위를 사용하여 수동으로 엔트로피를 생성하고, 굴림을 바이너리 또는 단어 인덱스에 매핑합니다. 이는 모든 소프트웨어나 하드웨어 RNG에 대한 신뢰를 제거합니다.
단계 2: 체크섬 계산
엔트로피가 생성되면 체크섬이 추가됩니다:
- 엔트로피 바이트의 SHA-256 해시를 계산합니다.
- 해시의 처음
ENT / 32비트를 가져옵니다(ENT는 비트 단위의 엔트로피 길이). - 이 체크섬 비트를 엔트로피에 추가합니다.
256비트 엔트로피의 경우, 8비트의 체크섬이 생성되어 총 264비트가 됩니다.
체크섬은 오류 감지 메커니즘으로 작동합니다: 복구를 위해 시드 문구를 지갑에 입력할 때, 지갑이 체크섬을 재계산합니다. 단어가 틀리거나 순서가 잘못되면 체크섬이 실패하고 지갑이 니모닉을 거부합니다. 이는 필사 오류를 방지하지만 수정하지는 않습니다 — 무언가 잘못되었다는 것만 감지합니다.
체크섬 관련 주의사항
니모닉의 마지막 단어는 체크섬 비트를 인코딩하므로, 주어진 시퀀스에서 모든 단어가 마지막 단어로 유효한 것은 아닙니다. 24단어 니모닉의 경우, 마지막 단어는 3비트의 엔트로피와 8비트의 체크섬을 인코딩하므로, 주어진 처음 23단어에 대해 2,048개의 가능한 단어 중 8개만 유효합니다. 이것이 마지막 단어를 자유롭게 선택할 수 없는 이유입니다.
단계 3: 단어 매핑
결합된 엔트로피 + 체크섬 비트는 11비트 그룹으로 나뉩니다. 각 11비트 그룹은 0에서 2,047까지의 인덱스를 나타내며, BIP-39 단어 목록의 해당 단어에 대응합니다.
264비트 / 단어당 11비트 = 24단어
132비트 / 단어당 11비트 = 12단어
영어 단어 목록
BIP-39 영어 단어 목록은 정확히 2,048개의 단어를 포함합니다. 이 목록은 다음과 같은 특성으로 신중하게 선별되었습니다:
- 고유한 네 글자 접두사 — 어떤 두 단어도 같은 처음 네 글자를 공유하지 않습니다. 따라서
abandon은aban으로 명확하게 식별할 수 있으며, 이는 소형 금속 백업에 유용합니다. - 일반 어휘 — 단어들은 간단하고 널리 알려진 영어 단어입니다. 전문 용어, 고유 명사, 또는 모호한 용어는 없습니다.
- 유사 단어 회피 — 쉽게 혼동될 수 있는 단어(예: "woman"과 "women")는 가능한 한 배제되었습니다.
- 글자 수 — 모든 단어는 3자에서 8자 사이입니다.
다른 언어 단어 목록
BIP-39는 9개 언어의 단어 목록을 정의합니다:
| 언어 | 상태 | 비고 |
|---|---|---|
| 영어 | 참조 표준 | 가장 널리 지원됨 |
| 일본어 | 표준화됨 | 가타카나 사용; 공백은 전각(U+3000) |
| 한국어 | 표준화됨 | |
| 스페인어 | 표준화됨 | |
| 중국어 (간체) | 표준화됨 | |
| 중국어 (번체) | 표준화됨 | |
| 프랑스어 | 표준화됨 | |
| 이탈리아어 | 표준화됨 | |
| 체코어 | 표준화됨 | |
| 포르투갈어 | 표준화됨 |
중요한 호환성 참고: 하나의 단어 목록으로 생성된 니모닉은 다른 언어의 단어 목록으로 복원할 수 없습니다. 단어 인덱스가 언어마다 다릅니다. 백업을 만들 때 어떤 언어가 사용되었는지 항상 기록하세요.
단계 4: 시드 도출 (PBKDF2)
니모닉 문장은 암호학적 키로 직접 사용되지 않습니다. 대신 PBKDF2-HMAC-SHA512를 사용한 키 스트레칭을 거칩니다:
PBKDF2(
password = 니모닉 문장 (단어를 공백으로 연결, UTF-8 NFKD로 정규화),
salt = "mnemonic" + 선택적_패스프레이즈,
iterations = 2048,
key_length = 512비트
)
이것은 BIP-32 계층적 결정론적 키 도출의 입력으로 사용되는 512비트 시드를 생성합니다.
BIP-39에서 PBKDF2의 주요 특성
키 스트레칭 — 2,048회 PBKDF2 반복은 무차별 대입 공격에 계산 비용을 추가합니다. 현대 비밀번호 해싱 표준에 비해 2,048회 반복은 적은 편이지만, 주요 보안은 니모닉 자체의 엔트로피(128 또는 256비트)에서 비롯되며 키 스트레칭 계수에서 비롯되지 않습니다.
패스프레이즈 지원 — 솔트에 선택적 패스프레이즈("25번째 단어")가 포함됩니다. 패스프레이즈가 제공되지 않으면 솔트는 단순히 "mnemonic" 문자열입니다. 패스프레이즈가 제공되면 솔트는 "mnemonic" + 패스프레이즈가 됩니다. 이는 다른 패스프레이즈마다 같은 니모닉에서 완전히 다른 시드 — 따라서 완전히 다른 키와 주소 세트 — 를 생성함을 의미합니다.
패스프레이즈 검증 없음 — 니모닉 체크섬과 달리, 패스프레이즈에는 체크섬이 없습니다. 어떤 패스프레이즈든 유효합니다. 잘못된 패스프레이즈를 입력해도 오류가 발생하지 않으며, 조용히 다른 (비어 있는) 지갑을 생성합니다. 이는 그럴듯한 부인(Plausible Deniability)을 위한 기능이지만, 패스프레이즈를 잊어버린 사용자에게는 위험합니다.
유니코드 정규화 — 니모닉과 패스프레이즈는 PBKDF2에 전달되기 전에 UTF-8 NFKD(정규화 형식 호환성 분해)로 정규화됩니다. 이는 운영 체제가 내부적으로 문자를 표현하는 방식에 관계없이 구현 간에 일관된 시드 도출을 보장합니다.
단계 5: 시드에서 키로 (BIP-32)
PBKDF2에서 생성된 512비트 시드는 BIP-32(계층적 결정론적 지갑)의 입력으로 사용됩니다:
- 시드가 "Bitcoin seed"라는 키로 HMAC-SHA512를 통과합니다.
- 왼쪽 256비트가 마스터 개인 키가 됩니다.
- 오른쪽 256비트가 마스터 체인 코드가 됩니다.
- 이들이 함께 마스터 확장 개인 키(xprv)를 형성합니다.
여기서부터 BIP-44 도출 경로가 코인별 키와 주소를 도출하기 위한 표준화된 트리 구조를 정의합니다.
실습 예제
128비트 엔트로피(12단어 니모닉)를 사용한 간단한 예제로 BIP-39를 추적해 보겠습니다:
1. 128비트 엔트로피 생성
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
(이것은 모두 0인 엔트로피로 — 설명용입니다. 실제로는 절대 사용하지 마세요.)
2. SHA-256 해시 계산
SHA256(0x00000000000000000000000000000000) = 374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb
3. 해시의 처음 4비트를 체크섬으로 사용
첫 번째 바이트: 0x37 = 00110111. 처음 4비트: 0011.
4. 체크섬을 엔트로피에 추가
128비트의 0 + 0011 = 총 132비트.
5. 11비트 그룹으로 분할
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000011 → 3 → "about"
결과: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
이것은 모두 0인 엔트로피에 대한 잘 알려진 테스트 벡터입니다. 체크섬 비트 때문에 마지막 단어가 "abandon"이 아닌 "about"입니다.
6. PBKDF2로 시드 도출
PBKDF2("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "mnemonic", 2048, 64)
이것은 BIP-32 도출에 사용되는 512비트 시드를 생성합니다.
**SafeSeed 시드 문구 생성기**를 사용하여 BIP-39가 실제로 작동하는 것을 확인하세요. 시드 문구를 생성하고 엔트로피, 체크섬, 단어 매핑을 실시간으로 볼 수 있습니다. 최대 보안을 위해 오프라인에서 도구를 실행하세요.
BIP-39 보안 분석
엔트로피 보안
24단어 니모닉(256비트 엔트로피)의 경우:
- 검색 공간은 2^256, 약 1.16 x 10^77가지 가능성입니다.
- 초당 1조(10^12)회 시도 속도에서도 전수 검색은 약 3.67 x 10^57년이 걸립니다 — 우주의 나이(1.38 x 10^10년)보다 훨씬 깁니다.
12단어 니모닉(128비트 엔트로피)의 경우:
- 검색 공간은 2^128, 약 3.4 x 10^38가지 가능성입니다.
- 초당 1조회 시도 속도에서 전수 검색은 약 10^19년이 걸립니다.
둘 다 고전적 컴퓨팅으로는 계산적으로 불가능합니다.
PBKDF2 고려사항
2,048회 반복 PBKDF2는 무차별 대입 공격에 상수 계수를 추가하지만 주요 보안 장벽은 아닙니다. 일부 보안 연구자들은 2,048회 반복이 Argon2나 bcrypt 같은 현대 키 도출 함수에 비해 낮다고 지적했습니다. 그러나 니모닉 엔트로피(128 또는 256비트)가 지배적인 요소이므로, 이는 실제로 사소한 우려입니다.
체크섬 한계
체크섬은 대부분의 필사 오류를 감지하지만:
- 오류를 감지하지만 수정하지는 않습니다.
- 12단어 니모닉의 경우 체크섬 비트가 4비트뿐이므로, 약 16개 중 1개의 랜덤 수정이 체크섬을 통과합니다.
- 체크섬은 유효한 체크섬을 생성하는 단어 재배열은 방지하지 못합니다.
패스프레이즈 위험
패스프레이즈 기능은 강력하지만 위험을 수반합니다:
- 패스프레이즈를 잊어버리면 자금을 복구할 수 없습니다("재설정" 메커니즘이 없음).
- 패스프레이즈는 검증되지 않습니다 — 어떤 문자열이든 유효한 지갑을 생성합니다.
- 니모닉은 얻었지만 패스프레이즈는 얻지 못한 공격자는 패스프레이즈를 무차별 대입해야 하며, 이는 패스프레이즈의 엔트로피에 비례하는 추가 보안을 제공합니다.
BIP-39 비판
BIP-39는 비트코인 개발 커뮤니티 내에서 비판이 없는 것은 아닙니다.
버전 관리 없음
BIP-39는 버전 바이트를 포함하지 않으므로, 도출 과정이 영원히 고정됩니다. 미래 개선이 다른 키 도출 함수나 다른 매개변수를 필요로 하는 경우, 니모닉 형식 내에서 이를 신호할 수 없습니다. 이것이 일부 지갑(특히 Electrum)이 버전 관리가 있는 자체 니모닉 체계를 사용하는 이유입니다.
단어 목록에 대한 긴밀한 결합
니모닉은 정확한 단어 목록에 의존합니다. 단어 목록이 수정되면 기존 니모닉을 복구할 수 없습니다. 단어 목록은 표준화 이후 동결되었지만, 이 비유연성은 일부에서 설계 제한으로 간주됩니다.
약한 키 스트레칭
언급했듯이, PBKDF2의 2,048회 반복은 현대 표준으로는 약한 것으로 간주됩니다. 이는 높은 엔트로피 니모닉의 보안에 실질적으로 영향을 미치지 않지만, 더 짧거나 사용자가 선택한 패스프레이즈에 대해서는 보호가 덜합니다.
Electrum의 대안
Electrum 지갑은 버전 관리를 포함하고 고정된 단어 목록에 의존하지 않는 자체 니모닉 체계를 사용합니다. Electrum 니모닉은 BIP-39와 호환되지 않습니다. 이는 Electrum 시드 문구를 BIP-39 지갑에서 복원할 수 없고 그 반대도 마찬가지임을 의미합니다. 항상 여러분의 지갑이 어떤 표준을 사용하는지 확인하세요.
BIP-39 구현
BIP-39는 거의 모든 주요 지갑에서 구현됩니다:
| 지갑 | BIP-39 | 단어 수 | 비고 |
|---|---|---|---|
| Ledger | 예 | 24 | 하드웨어, 보안 요소 |
| Trezor | 예 | 12/24 | SLIP-39(샤미르)도 지원 |
| Coldcard | 예 | 24 | 비트코인 전용 하드웨어 |
| MetaMask | 예 | 12 | 브라우저 확장 |
| Trust Wallet | 예 | 12 | 모바일 |
| Exodus | 예 | 12 | 데스크톱/모바일 |
| Electrum | 아니오 | 12 | 자체 체계 사용 |
| BlueWallet | 예 | 12/24 | 비트코인 중심 모바일 |
테스트 및 검증
공식 테스트 벡터
BIP-39 사양에는 테스트 벡터 — 알려진 엔트로피 값과 해당하는 니모닉 단어 및 도출된 시드 — 가 포함되어 있습니다. 이것들은 구현이 올바른지 검증하는 데 사용됩니다.
다음에서 게시된 공식 테스트 벡터와 비교하여 지갑의 BIP-39 구현을 검증할 수 있습니다:
시드 문구 검증
시드 문구를 올바르게 기록했는지 검증하려면:
- 하드웨어 지갑에서 시드 문구를 생성합니다.
- 주의 깊게 적습니다.
- 하드웨어 지갑을 공장 설정으로 초기화합니다.
- 적어둔 시드 문구로 복원합니다.
- 같은 주소가 생성되는지 확인합니다.
- 지갑이 거래에 서명할 수 있는지 확인합니다.
이 과정은 백업이 올바르고 지갑의 BIP-39 구현이 예상대로 작동하는지 모두 확인합니다.
FAQ
BIP-39는 무엇을 의미하나요?
BIP는 Bitcoin Improvement Proposal(비트코인 개선 제안)을 의미합니다. BIP-39는 39번째 제안으로, 암호학적 엔트로피의 니모닉(사람이 읽을 수 있는) 표현을 생성하는 표준을 정의합니다. 2013년에 도입되었으며 거의 모든 주요 암호화폐 지갑에서 채택되었습니다.
모든 12단어 시드 문구가 BIP-39인가요?
아니요. 일부 지갑(특히 Electrum)은 BIP-39와 구별되는 자체 니모닉 체계를 사용합니다. 둘 다 단어 목록에서 12단어 문구를 생성하지만, 인코딩, 단어 목록, 도출 과정이 다릅니다. BIP-39 문구는 Electrum의 체계와 함께 사용할 수 없으며 그 반대도 마찬가지입니다. 항상 지갑 문서를 확인하세요.
단어를 직접 선택하여 BIP-39 시드 문구를 만들 수 있나요?
만들어서는 안 됩니다. 기술적으로 23개의 단어를 선택하고 유효한 24번째 단어(체크섬을 만족하는)를 계산하는 것은 가능하지만, 사람의 단어 선택은 충분한 엔트로피를 생성하지 못합니다. BIP-39의 보안은 단어가 사람의 선택이 아닌 고품질 랜덤 데이터에서 도출되는 것에 의존합니다. CSPRNG가 엔트로피를 생성하도록 하세요.
왜 "mnemonic"이라는 단어가 PBKDF2 솔트로 사용되나요?
"mnemonic" 문자열은 BIP-39에서 지정한 고정 솔트입니다. 패스프레이즈가 사용되면 이 솔트에 추가됩니다(예: "mnemonicMyPassphrase"). 고정된 알려진 솔트를 사용하면 니모닉과 선택적 패스프레이즈 외에 추가 정보 없이 모든 구현에서 일관된 시드 도출이 보장됩니다.
BIP-39는 비트코인에만 사용되나요?
아니요. BIP-39는 이더리움, 라이트코인, 카르다노, 솔라나 등 거의 모든 주요 암호화폐에서 사용됩니다. 니모닉 생성과 시드 도출 과정은 동일하며, 이후의 키 도출 경로(BIP-44 코인 유형으로 정의)만 체인마다 다릅니다.
BIP-39와 SLIP-39의 차이점은 무엇인가요?
BIP-39는 전체 비밀을 나타내는 단일 니모닉을 생성합니다. SLIP-39(Satoshi Labs Improvement Proposal 39)는 샤미르 비밀 공유를 구현하여 비밀을 여러 조각(예: 3-of-5)으로 나눕니다. 임계값 수의 조각이 비밀을 재구성할 수 있지만, 더 적은 조각은 아무 정보도 드러내지 않습니다. SLIP-39는 BIP-39와 다른 단어 목록과 인코딩을 사용합니다.
유효한 BIP-39 니모닉은 몇 개 존재하나요?
24단어 니모닉의 경우: 2^256(약 1.16 x 10^77). 12단어 니모닉의 경우: 2^128(약 3.4 x 10^38). 이 숫자들은 엔트로피 공간을 나타냅니다. 체크섬은 단어 조합을 제한하지만 엔트로피를 줄이지는 않습니다 — 단순히 24개의 BIP-39 단어의 무작위 시퀀스가 모두 유효한 니모닉을 형성하지는 않는다는 의미입니다.