용어집 / 지갑과 수탁
시드 유도
- 시드 유도란 무엇입니까?
- 시드 유도는 니모닉 문장과 선택적 패스프레이즈를 지갑이 실제로 키를 만드는 데 사용하는 512비트 시드로 변환하는 단방향 함수입니다.
BIP-39에 명시되어 있습니다.
이 함수는 HMAC-SHA512를 사용하는 PBKDF2이며, 그 뒤의 무작위성이 아니라 단어 자체를 대상으로 실행됩니다. BIP-39는 반복 횟수를 2,048로, 출력을 64바이트로 고정하며, 패스프레이즈가 있으면 고정된 단어 "mnemonic" 뒤에 붙여 솔트를 구성합니다. 그 단계에서는 단어가 유효했는지 전혀 확인하지 않으므로, 잘못 입력한 문구도 정상적인 시드를 만들어 내고 지갑은 비어 있게 됩니다.
작동 방식
시드 유도는 두 개의 입력을 받아 하나의 출력을 반환하며, 상태도 없고 단어를 만들어 낸 무엇에 대한 기억도 없는 한 번의 호출로 이루어집니다. 니모닉 문장이 비밀번호입니다. 솔트는 텍스트 "mnemonic"에 패스프레이즈가 있으면 끝에 붙인 것이고, 패스프레이즈를 설정하지 않았다면 빈 문자열이 대신합니다. 둘 다 먼저 유니코드 NFKD 정규화를 거치므로, 프랑스어나 스페인어 문구의 악센트 문자는 어떤 키보드로 입력했든 동일하게 해시됩니다.
BIP-39는 표준의 이 절반이 문구를 생성하는 절반과 "completely independent"라고 밝히며, 그것을 긍정적으로 말합니다: 문장 구조에 대한 제약이 없고, 클라이언트는 자체 단어 목록이나 심지어 전체 문장 생성기를 작성할 수 있습니다. 실무적으로 읽으면 더 노골적입니다. 함수에 의미 없는 12개 단어를 넣으면 완벽하게 사용 가능한 64바이트가 반환됩니다. BIP-39는 소프트웨어가 이 단계 밖에서 체크섬을 계산하고 "issue a warning if it is invalid", 즉 거부가 아닌 경고를 하도록 요구하며, 그래서 일부 도구는 방금 깨졌다고 알려 준 문구도 복원합니다.
그 뒤의 엔트로피가 아니라 문장을 해시한다는 데서 두 가지 결과가 따릅니다. 문구를 단어 하나하나 다른 언어로 번역하면 완전히 다른 시드가 나옵니다. 기반이 되는 무작위성은 그대로여도 입력 바이트가 바뀌었기 때문입니다. 그리고 방향은 결코 되돌아가지 않습니다: 임의의 BIP-32 시드를 BIP-39 문구로 다시 쓸 수 없으며, 그래서 "시드를 내보내기"와 "단어를 내보내기"는 서로 다른 요청입니다.
확인할 수 있는 곳
시드 유도는 두 소프트웨어가 어떤 함수를 실행할지에 대해 의견이 갈리는 순간 드러납니다. 이 사이트에서 리뷰한 Trezor Safe 3과 Safe 5의 다중 분할 백업은 BIP-39가 아니라 SLIP-39입니다: 1,024개 단어 목록을 한 번에 10비트씩 읽어, 128비트 비밀에는 분할당 20개 단어, 256비트 비밀에는 33개 단어가 됩니다. 그 분할은 BIP-39의 PBKDF2 단계를 전혀 거치지 않습니다. SLIP-39는 BIP-39의 저자들이 대체안으로 발표했으며, 분할을 되돌려 변환할 수 없는 이유로는 "the overly coupled design of BIP-0039 and its use of a one-way derivation function"을 지목합니다. 반대 방향은 작동하지만, 시작한 길이와 관계없이 결과 분할마다 59개 단어를 강제합니다.
이 사이트의 Coldcard 리뷰는 유도가 해 줄 수 없는 일을 보여 줍니다. 2021년 3월의 펌웨어 이전으로 시드 생성이 하드웨어 난수 생성기가 아니라 소프트웨어 의사 난수 생성기에서 값을 가져오게 되었고, Coinkite는 2026년 8월 1일에 권고를 갱신했습니다. 유도 자체는 결코 흔들리지 않았습니다. 약한 비밀을 유효한 체크섬 뒤에 있는 정상적인 64바이트 시드로 바꾸었고, 하위의 어떤 지갑도 그것을 알아챌 방법이 없었습니다.
아무것도 위험에 빠뜨리지 않고 함수가 실행되는 모습을 보려면, BIP-39가 엔트로피, 니모닉, 결과 시드를 나란히 정리한 테스트 벡터를 공개하며, 모든 벡터에 패스프레이즈 "TREZOR"를 사용합니다.
시드 유도 vs 유도 경로
시드 유도는 키가 하나도 존재하기 전에 한 번 일어납니다. 유도 경로는 그 뒤 주소가 필요할 때마다 참조됩니다. 그 차이가 비어 보이는 복원이 얼마나 심각한지를 결정합니다. 잘못된 경로는 설정 문제입니다: 스크립트 유형을 바꾸고 다시 스캔하면 잔액이 나타납니다. 잘못된 패스프레이즈는 시드를 바꾸고, 그러면 그 아래의 트리 전체가 바뀌며, 어디의 어떤 설정도 예전 것을 되돌리지 못합니다.