연구 . 지갑 포렌식
Blockchain.info의 구형 지갑 형식 설명
구형 Blockchain.info 지갑은 단일 형식이 아닌 여러 형식으로 구성된 계열입니다. 암호화와 백업 방식 모두 시간이 지남에 따라 변경되었습니다. 자신이 어떤 버전을 사용하고 있는지 파악하는 것이 복구의 핵심입니다.
Blockchain.info(현재 Blockchain.com)는 초기부터 가장 인기 있는 웹 지갑 중 하나를 운영해 왔으며, 그 형식은 2011년부터 수차례에 걸쳐 진화해 왔습니다. 이러한 역사적 배경 때문에 오래된 지갑이 작동하지 않게 되기도 하고, 최신 도구들이 이를 인식하지 못하기도 합니다. 이 페이지에서는 형식 버전, 암호화 방식의 변경 사항, 그리고 특이한 15~21단어 백업 방식을 기록하고 있습니다. 이는 지갑 복구에 필수적인 포렌식 지식입니다.
포맷 버전 (v0–v3+)
Blockchain.info 지갑은 사용자의 비밀번호로 보호되는 암호화된 JSON 블롭(wallet.aes.json)입니다. 버전에 따라 암호화 매개변수가 변경되었는데, 주로 비밀번호를 키로 변환하는 데 사용되는 PBKDF2 반복 횟수가 달라졌습니다. 초기 지갑(v0)은 최신 도구에서 전혀 지원하지 않는 방식을 사용했으며, v2~v3에서는 더 높은 반복 횟수로 표준화되었습니다. 올바른 비밀번호를 입력하더라도 잘못된 매개변수를 사용하면 복호화가 전혀 이루어지지 않으므로, 버전을 확인하는 것이 첫 번째 단계입니다.
hashcat 모드와 v1 트랩
복구를 위해, 암호화된 블롭은 해시 값을 생성하며, 비밀번호 해독 도구는 이 해시 값을 기준으로 테스트를 수행합니다. 모드 15200은 Blockchain.info v2–v4를 지원하며, 초기 v1 버전은 모드 12700을 사용합니다. 여기에는 잘 알려진 함정이 있습니다. 초기 v1 지갑은 반복 횟수가 제각각이었기 때문에, 표준 hashcat은 일부 지갑에서 올바른 비밀번호를 찾지 못해도 아무런 오류 메시지 없이 실패할 수 있습니다. 즉, 비밀번호가 목록에 포함되어 있어도 도구가 실행되고 완료된 후 아무런 결과도 보고하지 않는 것입니다. v1 비밀번호가 확실한데도 도구가 아무것도 찾지 못한다면, 대개 이러한 반복 횟수 불일치가 원인이며, 이 경우 맞춤형 접근 방식이 필요합니다.
첫 번째 및 두 번째 비밀번호
이러한 지갑에는 대개 두 가지 비밀번호가 있습니다. 하나는 지갑을 잠금 해제하는 ‘주 비밀번호’이고, 다른 하나는 자금을 인출할 때 필요한 ‘선택적 보조 비밀번호’입니다. 보조 비밀번호는 거의 입력할 일이 없어 자주 잊어버리기 마련입니다. 잔액은 확인할 수 있지만 자금을 이동할 수는 없기 때문입니다. 이 비밀번호는 주 비밀번호와 별도로 추출 및 검색되므로(별도의 스크립트와 해시), 어떤 비밀번호를 잃어버렸는지 파악하는 것에 따라 복구 방법이 완전히 달라집니다.
15~21단어 기억법
사람들을 가장 놀라게 하는 사실은, 업계가 BIP39의 12단어 시드를 표준으로 채택하기 전까지 Blockchain.info는 15, 17, 19 또는 21단어로 구성된 자체 단어 구문 백업 방식을 사용했다는 점입니다. 이 방식은 BIP39처럼 원시 개인 키를 인코딩하지 않고, 사용자의 지갑 ID와 비밀번호를 인코딩했습니다. 또한 이 서비스는 익숙한 2,048단어 목록을 사용하지 않았으며, 50,000단어 규모의 훨씬 더 방대한 사전을 활용했고, 일부 버전에서는 두 개의 단어 목록(하나는 체크섬을 계산하기 위한 것이고, 다른 하나는 식별자와 비밀번호를 인코딩하기 위한 것)을 사용하기도 했습니다. 바로 이 때문에 이러한 문구 중 하나를 최신 BIP39 도구에 입력하면 오류만 발생합니다. 해당 단어들이 도구가 인식하는 목록에 아예 포함되어 있지 않은 경우가 많기 때문입니다.
회복 과정은 어떻게 이루어지나요?
가장 초기의 로직과 단어 목록은 더 이상 공개되지 않기 때문에, 이러한 지갑을 복구하는 것은 진정한 역공학 작업입니다. 웹 아카이브에서 Blockchain.info 사이트의 과거 스냅샷과 해당 자바스크립트를 추출하여 단어 목록과 도출 과정을 복원한 뒤, 지갑이나 문구가 어느 버전에 속하는지 파악하고, 그 정확한 방식을 재현한 다음, 체크섬이 일치하고 지갑이 복호화될 때까지 알려진 주소를 기준으로 모든 후보를 검증해야 합니다. 주소가 올바른 재구성을 확실하게 확인해 주기 때문에, 불완전하거나 불확실하거나 순서가 뒤바뀐 문구라도 복원이 가능합니다.
지갑이 어느 시대의 것인지 알아보는 법
식별자와 백업 형식은 대개 해당 지갑이 만들어진 시기를 드러냅니다. 현대식 지갑 ID (GUID 형식의 코드)는 ‘지갑 ID 시대’를 가리키며, 이 시기에는 ID와 비밀번호 힌트만 있으면 복구가 현실적으로 가능합니다. 지갑 ID가 도입되기 전인 2011~2012년 시기의 가장 초창기 지갑들은 전화번호나 사용자 이름을 식별자로 사용했는데, 이 지갑들은 복구가 가장 어렵고 때로는 사실상 복구 불가능하기도 합니다. 15~21단어로 구성된 단어 구문 백업은 구형 니모닉 체계에 해당합니다. 먼저 해당 시기를 파악해 두면, 잘못된 버전의 논리를 적용하여 헛수고를 하는 것을 방지할 수 있습니다. 이는 기술적으로 복구 가능한 지갑이 포기되는 가장 흔한 이유입니다.
왜 최신 사이트에서 “무효”라는 메시지가 표시되는가
Blockchain.com은 오래전부터 이러한 구형 형식의 가져오기 지원을 중단했기 때문에, 해당 사이트에서는 사용자에게 문구나 지갑이 유효하지 않다고 안내합니다. 당연히 사용자들은 자금이 사라진 것으로 오해하게 됩니다. 하지만 사실은 그렇지 않습니다. 지갑은 여전히 블록체인 상에 존재하며, 원래의 방식을 재현할 수 있다면 문구나 암호화된 블롭(blob)을 통해 키를 도출할 수 있습니다. “웹사이트에서 무효라고 표시된다”는 사실과 “실제로 복구 가능하다”는 사실 사이의 간극은 바로 여기에 기록된 역사적 지식, 즉 어떤 버전이 어떤 암호화 방식, 어떤 단어 목록, 어떤 반복 횟수를 사용했는지에 대한 정보입니다. 이러한 지식은 사후에 아카이브를 통해 보존되고 재구성되었기 때문에 비로소 존재할 수 있는 것입니다.
당사의 문서
KeychainX는 현재 어떤 도구나 최신 사이트에서도 이를 지원하지 않기 때문에, 다양한 클라이언트 사례를 통해 지갑의 여러 버전에 걸쳐 보관된 소스 자료를 바탕으로 이러한 형식과 단어 목록을 재구성했습니다. 저희는 이 정보를 공개함으로써, 구형 Blockchain.info 지갑 소유자분들이 “유효하지 않은” 문구나 잠긴 v1 비밀번호 문제가 해결 가능한 문제일 뿐, 막다른 길은 아니라는 점을 이해하시길 바랍니다. 클라이언트용 단계별 안내를 보시려면 Blockchain.com 복구 페이지를 참조해 주세요.
자주 묻는 질문
왜 현재 사이트에서 Blockchain.info 지갑이 열리지 않나요?
버전마다 형식이 달라졌기 때문입니다. 초기(v0/v1) 형식과 15~21단어짜리 니모닉은 최신 사이트나 표준 도구에서 지원되지 않지만, 지갑은 여전히 온체인에 존재하며 원래의 논리를 통해 복구할 수 있습니다.
블록체인 지갑은 어떤 해시캣 모드를 사용하나요?
v2–v1.4는 모드 15200을 사용하며, 초기 v1은 12700을 사용합니다. 표준 hashcat이 올바른 비밀번호를 감지하지 못하고도 아무런 오류 메시지 없이 넘어갈 수 있는 v1 반복 처리의 함정에 주의하십시오.
왜 15/17/19/21단어 구문이 가져오기가 안 되나요?
이는 BIP39 이전 방식의 암호화 방식으로, 2,048단어로 구성된 BIP39 목록이 아닌 약 50,000단어로 구성된 사용자 정의 목록을 사용하여 지갑 ID와 비밀번호를 암호화하므로, 최신 도구에서는 이를 인식하지 못합니다.
두 번째 비밀번호를 잊어버렸는데, 복구할 수 있나요?
네. 선택 사항인 두 번째 비밀번호(지출 시 필요)는 가장 자주 잊어버리는 항목 중 하나이지만, 힌트를 통해 복구하기가 매우 쉽습니다. 이 비밀번호는 주 비밀번호와는 별도로 검색됩니다.
회복 비용은 얼마인가요?
성과 기반: 지갑을 열었을 경우에만 회수된 금액의 일정 비율을 수수료로 받으며, 선불 수수료는 없습니다.
오래된 Blockchain.info 지갑에 갇혀 계신가요?
어떤 버전이나 문구가든, 가지고 계신 내용을 알려주시고, 주소를 알고 계시다면 함께 알려주세요. 24시간 이내에 정직한 평가를 드리며, 성공 시에만 수수료를 받습니다.