용어집 / 지갑과 수탁
BIP39
별칭은 BIP-39, 니모닉 코드, Mnemonic code입니다.
- BIP39란 무엇입니까?
- BIP39는 지갑의 엔트로피를 고정된 2,048개 단어 목록의 단어로 인코딩하고 이를 512비트 시드로 늘리는 2013년 명세입니다.
BIP-39에 명시되어 있습니다.
구매할 수 있는 거의 모든 지갑이 이를 구현하고 있으며, 그래서 한 브랜드의 기기에 적어 둔 문구가 다른 기기에서 복원됩니다. 이 문서는 2013년 9월 10일에 제출되었고 Bitcoin Core는 아직까지 이를 한 번도 구현하지 않았습니다. 이 문서가 사용자의 백업에 행사하는 권위는 표준화 절차가 아니라 업계의 채택에서 나옵니다.
작동 방식
SatoshiLabs의 Marek Palatinus와 Pavol Rusnak이 Aaron Voisine, Sean Bowe와 함께 BIP-39를 작성했습니다. 이 명세는 두 가지 변환만을 정의하고 그 밖의 것은 정의하지 않습니다.
첫 번째 변환은 무작위성을 단어로 바꿉니다. 지갑은 128, 160, 192, 224 또는 256비트의 엔트로피를 받아 SHA-256으로 해시하고, 그 해시의 앞부분에서 엔트로피 길이를 32로 나눈 만큼의 비트를 체크섬으로 덧붙입니다. 그다음 전체를 한 번에 11비트씩 읽고, 각 덩어리가 정확히 2,048개 단어로 된 목록에서 단어 하나를 선택합니다. 다섯 가지 엔트로피 크기는 각각 12, 15, 18, 21, 24개 단어를 만들며, 실제로 마주치게 되는 두 가지는 그 범위의 양 끝입니다.
체크섬이 작은 것은 의도된 것입니다. 12개 단어 문구에는 체크섬 비트가 4개 들어가므로, 유효한 단어 열두 개를 무작위로 조합한 목록은 약 16번에 한 번 검증을 통과합니다. 이는 손으로 옮겨 적는 거의 모든 실수를 잡아내기에 충분하지만, 지어낸 문구를 안전하게 만들기에는 턱없이 부족합니다.
두 번째 변환은 단어를 시드로 바꿉니다. 문구는 Unicode NFKD로 정규화된 뒤 PBKDF2에 입력되며, 여기에는 2,048회 반복의 HMAC-SHA512가 사용되고, 솔트는 리터럴 문자열 "mnemonic" 뒤에 선택적 사용자 패스프레이즈를 붙여 구성됩니다. 출력은 문구가 12개 단어였든 24개였든 항상 512비트입니다.
단어 목록은 장식이 아니라 표준의 일부입니다. 영어 목록은 어떤 두 단어도 처음 네 글자를 공유하지 않도록 만들어졌고, 시각적으로 혼동하기 쉬운 쌍은 제외되었습니다. 일본어, 한국어, 스페인어, 두 문자 체계의 중국어, 프랑스어, 이탈리아어, 체코어, 포르투갈어에 대해서도 공식 목록이 있습니다. 문구는 그것이 나온 목록에 대해서만 의미가 있으며, 그래서 스페인어 문구를 영어만 지원하는 지갑에 입력하면 즉시 실패합니다.
확인할 수 있는 곳
모든 하드웨어 지갑 설정 화면, "12개 또는 24개 단어로 복원" 대화 상자, 그리고 주류 소프트웨어의 모든 복구 절차는 그 밑바탕이 BIP-39입니다. 그로 인해 생기는 호환성은 실제이며 지킬 가치가 있습니다. 기기가 고장 나는 일이 손실이 아니라 불편으로 그치는 이유가 바로 이것입니다.
이 표준의 약점은 빠뜨린 것입니다. 문구는 어떤 파생 경로, 스크립트 유형, 지갑 소프트웨어가 그것을 만들었는지에 대해 아무것도 말하지 않으며, 나중에 버전 필드를 추가할 수 있는 여지도 없습니다. 두 지갑이 같은 단어를 올바르게 읽고도 서로 다른 주소와 서로 다른 잔액을 보여 줄 수 있습니다. 단어와 함께 경로를 기록하는 것이 표준적인 우회 방법이며, 이는 전적으로 관례일 뿐 명세가 도움을 주는 부분은 아닙니다.
PBKDF2의 2,048회 반복은 또 다른 비판 지점입니다. 그 횟수는 2013년에는 값싼 편이었고 지금은 하찮은 수준이므로, 늘리는 처리는 약한 선택적 패스프레이즈를 고른 사람에게 거의 아무런 보호도 제공하지 않습니다. 단어 자체에 대해서는 전혀 보호하지 않으며, 단어들은 기계가 만든 128 또는 256비트의 엔트로피에 의존합니다.
BIP39 vs HD 지갑
BIP-39는 단어를 시드로 바꾸고, BIP-32는 시드를 키의 트리로 바꿉니다. 이 둘은 저자가 다른 별개의 문서이며, 지갑은 한쪽을 다른 쪽 없이 구현할 수 있습니다. Bitcoin Core는 완전한 계층적 결정적(HD) 지갑이며 니모닉 지원이 전혀 없습니다. Electrum 역시 계층적 결정적 방식이며 버전 표시가 내장된 자체 문구 형식을 사용합니다. "BIP-39 호환"은 사용자의 단어를 읽는 것에 대한 약속으로 받아들여야 하며, 그 뒤에 어떤 주소가 나타나는지에 대한 약속이 아닙니다.