486 / 736SEED-GEN

Seed Generation

지갑 시드 생성

새 지갑을 만들 때 백업 단어는 다른 사람이 예측할 수 없는 난수에서 나와야 합니다. Seed Generation은 이 비밀 출발점을 만들고 처리하는 과정입니다. 지갑이 단어 수가 맞는 구문을 받아들인다고 해서 안전하게 사용할 수 있다는 뜻은 아닙니다.

널리 쓰이는 BIP39 방식은 무작위 데이터를 백업 단어인 Seed Phrase로 바꿉니다. 이 단어들과 선택 사항인 passphrase, 즉 추가 암호로 시드를 만듭니다. 시드는 BIP32가 지갑의 키 트리를 도출하는 데 쓰는 비밀 데이터입니다. 무작위 데이터, 단어, 시드, 키는 같은 과정의 서로 다른 단계이며 다른 백업 형식은 절차가 다를 수 있습니다.

백업을 쉽게 외우려고 좋아하는 책에서 단어를 고른다고 생각해 보세요. 자신에게는 독특해 보여도 공격자는 인용문이나 사람들이 자주 고르는 패턴을 집중적으로 시도할 수 있습니다. 그래서 BIP39는 컴퓨터가 생성한 난수로 시작해 나중에 이를 단어로 표현합니다. 이 예측 불가능성을 설명하는 개념이 엔트로피입니다. 단어는 비밀 데이터를 읽기 쉽게 기록한 것이지, 자신만의 문장을 만들라는 뜻이 아닙니다. [1]

지갑은 이름이 적절한 함수를 호출하는 데 그치지 않고 실제 난수 데이터를 받아야 합니다. 예를 들어 Linux의 getrandom()은 기본 설정에서 시스템 소스가 준비될 때까지 기다립니다. GRND_NONBLOCK을 지정하면 기다리는 대신 EAGAIN을 반환할 수 있습니다. 데이터가 아직 없다는 뜻입니다. 프로그램은 결과와 받은 데이터 단위인 바이트 수를 확인해야 합니다. 실패했는데도 비밀 입력이 만들어진 것처럼 계속 진행하면 겉보기에는 작동하지만 안전하지 않은 지갑이 생길 수 있습니다. [2]

브라우저도 안전한 난수 데이터를 얻는 인터페이스를 제공합니다. Web Crypto getRandomValues()는 정수 배열을 암호학적으로 안전한 바이트로 채우며, 65536 바이트를 넘게 요청하면 QuotaExceededError로 실패합니다. 하지만 이는 함수 하나의 성질이지 웹사이트 전체의 안전성에 대한 보증이 아닙니다. 페이지가 좋은 난수를 얻은 뒤 백업 단어를 유출할 수도 있습니다. 따라서 불러온 코드와 그 코드가 결과를 처리하는 방식도 살펴야 합니다. [3]

단어를 잘못 옮겨 적으면 지갑이 체크섬으로 오류를 발견할 수도 있습니다. 체크섬은 원래 데이터에서 계산한 짧은 확인 값입니다. BIP39는 128 비트 입력에 체크섬 4 비트를 붙여 12 단어를 만들고, 256 비트에 8 비트를 붙여 24 단어를 만듭니다. 비트는 정보의 기본 단위입니다. 확인용 비트는 SHA256이 계산한 데이터 지문에서 나오며 새로운 독립 엔트로피가 아닙니다. 따라서 유효한 체크섬은 단어가 비밀인지, 안전하게 생성되었는지 증명하지 못합니다. [1]

단어는 백업하기 편하지만 소프트웨어는 이를 정확히 정해진 데이터로 바꿔야 합니다. BIP39는 도출 함수 PBKDF2-HMAC-SHA512를 2048회 반복해 512비트 시드를 만듭니다. 구문과 함께 salt라는 매개변수를 사용합니다. 여기서는 고정 문자열 mnemonic 뒤에 passphrase를 붙이고, 사용하지 않으면 빈 문자열을 붙입니다. 구문과 이 매개변수는 문자 표현을 통일하는 UTF-8 NFKD로 처리합니다. 출력이 길어진다고 부족한 난수가 생기지는 않습니다. 출력 길이는 입력 엔트로피가 512비트임을 증명하지 못합니다. [1]

다음 단계는 BIP32가 설명합니다. 시드에서 마스터 개인키와 chain code를 도출하며, 후자는 다른 키를 도출하는 데 필요한 보조 데이터입니다. 이를 통해 지갑은 공통 출발점에서 새 주소를 만들 수 있습니다. 기술적으로는 고정 문자열 Bitcoin seed를 HMAC-SHA512 함수의 키로 사용한 뒤 결과를 나눕니다. 이 공개 문자열은 사용자의 비밀이 아닙니다. 도출된 개인키가 0이거나 허용 범위 밖이면 무효입니다. 따라서 시드의 이름만 개인키로 바꾸는 과정이 아닙니다. [4]

개발자는 프로그램이 계산을 올바르게 수행하는지 확인해야 합니다. 테스트 벡터는 알려진 입력과 예상 결과의 묶음입니다. BIP39는 엔트로피, 단어, 시드를 담은 묶음을 공개하며 테스트 passphrase로 TREZOR를 사용합니다. 결과가 일치하면 해당 입력의 변환을 확인할 수 있지만, 실제 생성기가 예측 불가능한 비밀을 만드는지까지 알 수는 없습니다. 테스트 데이터는 공개되어 있으므로 실제 자금을 위한 비밀 백업으로 사용해서는 안 됩니다. [1]

난수 소스부터 단어와 백업 보관까지 여러 단계가 이어집니다. NIST SP 800-90C는 엔트로피 소스를 난수 데이터 생성 메커니즘과 결합하는 방법을 설명합니다. 지갑을 평가할 때는 구체적인 소프트웨어 버전, 오류 처리, 단계 간 데이터 전달도 확인해야 합니다. 충분히 검증된 구성 요소 하나가 다른 부분에서 비밀을 잃거나 유출하지 않을 것까지 보장하지는 못합니다. 중요한 것은 믿음직한 이름 하나를 찾는 일이 아니라 전체 과정을 따라가며 확인하는 일입니다. [5]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Random Number Generator, BIP 39, HD Wallet, Seed Phrase. 다음 항목에서도 이 글을 참조합니다 Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.

DOC · 001BIP39 — Mnemonic generation and seed conversion명세 DOC · 002Linux getrandom — Initialization and return values문서 DOC · 003W3C Web Crypto — getRandomValues contract명세 DOC · 004BIP32 — Master key generation명세 DOC · 005NIST SP 800-90C — Random bit generator constructions명세
개정일: 1차 출처 우선 · 투자 조언이 아닙니다