복구 문구 속 체크섬 단어: BIP-39가 실수를 잡아내는 방법

·5분 읽기·작성자: SSP Editorial Team
SSP Academy 표지: 복구 문구 속 체크섬 단어

복구 문구 속 체크섬 단어: BIP-39가 실수를 잡아내는 방법

복구 문구는 무작위로 고른 일상 단어 목록처럼 보입니다. 하지만 실제로는 인코딩된 숫자이며, 마지막 단어는 한 가지 일을 더 합니다. 문구를 잘못 옮겨 적었을 때 지갑 소프트웨어가 알아챌 수 있도록 체크섬을 담고 있습니다.

이 원리를 알면 오타가 대개 거부되는 이유, 문구를 직접 지어내면 안 되는 이유, 그리고 "시드 생성기" 웹사이트가 나쁜 생각인 이유를 이해할 수 있습니다.

문구는 변장한 숫자입니다

SSP를 포함한 대부분의 지갑은 BIP-39라는 표준을 따릅니다. 모든 것은 엔트로피, 즉 기기가 생성한 난수에서 시작합니다. 12단어 문구는 128비트, 24단어 문구는 256비트의 엔트로피를 인코딩합니다.

단어 목록에는 정확히 2,048개의 단어가 있고, 2,048은 2¹¹이므로 단어 하나가 11비트를 나타냅니다. 그런데 계산이 딱 맞지 않습니다. 12단어 × 11비트 = 132비트로 128이 아니고, 24단어 × 11비트 = 264비트로 256이 아닙니다.

남는 4비트 또는 8비트가 바로 체크섬입니다.

체크섬은 어디서 오나요

지갑은 엔트로피를 SHA-256에 통과시키고 결과의 앞부분 비트를 가져옵니다. 엔트로피 32비트마다 체크 비트 1개입니다. 즉 12단어는 4비트, 24단어는 8비트입니다. (SHA-256이 생소하다면 해시 함수 설명에서 기본을 확인할 수 있습니다.)

이 비트들은 엔트로피 끝에 덧붙여지고, 전체 비트열은 11비트씩 잘려 각각 하나의 단어에 대응됩니다. 그래서 마지막 단어는 섞여 있습니다.

  • 12단어: 엔트로피 7비트 + 체크섬 4비트.
  • 24단어: 엔트로피 3비트 + 체크섬 8비트.

그래서 특정 문구의 마지막 자리에 올 수 있는 단어는 일부뿐입니다. 임의의 앞 11개 단어에 대해, 2,048개 중 유효한 12번째 단어가 되는 것은 128개뿐입니다. 임의의 앞 23개 단어에 대해서는 단 8개입니다.

체크섬이 잡아내는 것과 놓치는 것

복구할 때 소프트웨어는 입력한 단어로 체크섬을 다시 계산해 비교합니다. 단어 하나가 무작위의 다른 단어로 바뀌었을 때, 잘못된 문구가 그래도 검사를 통과할 확률은 대략 다음과 같습니다.

  • 12단어: 약 16분의 1(2⁴)
  • 24단어: 약 256분의 1(2⁸)

따라서 단어 하나의 실수는 대부분 잡힙니다. SSP가 사용하는 것과 같은 라이브러리로 무작위 치환을 시험해 보니 통과율이 각각 약 6.4%와 0.4%로, 이론과 일치했습니다.

그래도 두 가지 한계가 남습니다. 체크섬은 문구가 잘못되었다는 것만 알려 줄 뿐, 어느 단어가 틀렸는지는 알려 주지 않습니다. 또 검사를 통과한 문구가 반드시 내 문구인 것도 아닙니다. 운 좋게 통과한 오타는 다른, 유효하지만 비어 있는 지갑을 복구합니다. 복구 후 잔액이 0으로 보인다면 무엇보다 먼저 단어를 다시 확인하세요.

앞 네 글자 규칙

영어 단어 목록은 모든 단어의 앞 네 글자가 고유하도록 선정되었고, act나 add 같은 짧은 단어는 그 자체로 고유합니다. 따라서 각 단어의 앞 네 글자만 금속판에 새겨도 잃는 정보가 없습니다. 이 사본을 보관하는 방법은 시드 문구 모범 사례에서 다룹니다.

문구를 절대 직접 지어내지 마세요

단어를 직접 고르는 것은 두 가지 이유로 위험합니다.

무작위가 아닙니다. 보안은 전적으로 엔트로피에 달려 있습니다. 좋아하는 것이나 노래 가사처럼 사람이 고른 단어에는 공격자가 탐색할 수 있는 패턴이 있고, 봇들이 이런 "브레인 월렛" 문구를 끊임없이 훑고 다닙니다.

아마 유효하지도 않을 것입니다. 손으로 고른 12개 단어가 체크섬을 통과할 확률은 약 16번에 1번뿐입니다. 그래서 사람들은 마지막 단어를 "고치고" 싶어지거나, 앞 단어들은 주사위로 정한 뒤 유효한 마지막 단어를 찾아보려 합니다.

마지막 단어를 직접 고르는 것 자체는 위험이 크지 않습니다. 그 단어에는 엔트로피가 7비트 또는 3비트밖에 없기 때문입니다. 위험은 유효한 후보를 찾는 방법에 있습니다. SHA-256을 손으로 계산하는 것은 현실적이지 않으니, 사람들은 단어를 "체크섬 계산기" 웹사이트에 붙여 넣습니다. 바로 그 순간 문구는 여러분의 통제를 벗어납니다. 페이지가 그것을 기록할 수도, 사이트가 가짜일 수도, 브라우저 확장 프로그램이 읽어 갈 수도 있습니다.

안전한 방법은 충분히 검증된 지갑 소프트웨어가 여러분의 기기에서 직접 문구를 생성하게 하는 것입니다.

SSP는 이렇게 처리합니다

SSP Wallet과 SSP Key는 모두 오픈 소스 라이브러리 @scure/bip39와 영어 단어 목록을 사용합니다. 두 앱 모두 새 지갑에 24단어 문구(256비트) 를 생성하므로, 모든 문구가 8비트 체크섬을 온전히 갖추고 있습니다.

복구할 때 두 앱은 다음 단계로 넘어가기 전에 문구를 확인합니다. 확인을 통과하지 못했지만 길이가 표준(12, 15, 18, 21, 24단어)이라면, 단순한 오류 대신 표준이 아닌 시드 문구라는 경고가 표시됩니다. 경고는 영어 단어 목록에 없는 단어를 알려 주거나 문구가 BIP-39 체크섬을 통과하지 못한다고 알려 주며, SSP는 이런 문구를 절대 만들지 않는다는 점도 상기시킵니다. 명시적으로 확인하면 그래도 복구를 계속할 수 있습니다. 이 선택지는 다른 언어의 단어 목록으로 된 문구처럼 다른 지갑에서 가져온 문구를 위한 것입니다. SSP가 만들어 준 문구에서 이 경고가 뜬다면 멈추고 다시 확인하세요. 거의 확실히 틀린 단어나 자리가 바뀐 단어가 있고, 그대로 복구하면 다른 빈 지갑이 열립니다.

SSP는 2-of-2 방식이므로 SSP Wallet과 SSP Key는 각자 자신의 문구를 가집니다. 각 요소로 무엇을 할 수 있는지는 시드 문구, 개인 키, 확장 공개 키에서 설명합니다.

SSP Key에는 설정 → 보안에 시드 백업 확인 기능도 있으며, "백업 점검" 카드가 30일마다 이를 권합니다. 생체 인증이나 비밀번호로 잠금을 해제한 뒤, 같은 목록에서 뽑은 미끼 단어들 사이에서 무작위 위치에 있는 시드 단어 세 개를 찾아냅니다. SSP Wallet에도 단어 하나로 하는 비슷한 확인이 있습니다. 둘 다 문구를 화면에 보여 주지 않습니다. 그래도 가장 확실한 확인은 전체 복구 테스트이며, 백업 테스트하기에서 단계별로 안내합니다.

솔직한 요약

복구 문구는 11비트 단어로 적힌 난수입니다. 마지막 단어에는 SHA-256 체크섬이 들어 있으며, 12단어는 4비트, 24단어는 8비트입니다. 옮겨 적기 실수의 대부분을 잡아내지만 전부는 아니며, 어느 단어가 틀렸는지는 결코 알려 주지 않습니다.

문구는 지갑이 생성하게 하고, 꼼꼼히 적어 두고(단어마다 네 글자면 충분합니다), "완성"하거나 "확인"하려고 웹사이트에 입력하는 일은 절대 하지 마세요. SSP는 24단어 문구를 생성하고, 표준이 아닌 문구를 복구하기 전에는 경고하며, 화면에 표시하지 않고도 백업을 확인할 수 있게 해 줍니다.

이 글 공유하기

관련 글