Home / Knowledge / 결정론적 지갑, 그 장점과 간과된 단점들

결정론적 지갑, 그 장점과 간과된 단점들

결정론적 지갑, 그 장점과 간과된 단점들 1

결정론적 지갑, 그 장점과 간과된 단점들 2

지난 1년 동안 비트코인 지갑 개발의 진전을 따라왔다면, 아마도 백엔드 디자인의 최신 트렌드 중 하나인 결정론적 지갑에 대해 들어봤을 것입니다. 필요에 따라 새로운 비트코인 주소와 개인 키를 무작위로 생성하는 구식 비트코인 지갑과 달리, 결정론적 지갑에서는 모든 데이터가 단일 시드에서 특정 알고리즘을 사용하여 생성됩니다. 즉, 결정론적 지갑의 시드를 적어두고, 6개월 후에 하드 드라이브가 손상되어 지갑을 복구할 수 없는 경우, 동일한 시드를 사용하여 새 지갑을 생성하면 이전 지갑의 모든 주소와 개인 키가 정확히 이전과 같이 돌아옵니다. 이러한 지갑 개발 트렌드는 거의 보편적인 찬사를 받았으며, 여러 주소를 처리할 의도가 있는 거의 모든 비트코인 클라이언트는 이미 결정론적 지갑을 구현했거나 만들 계획을 세우고 있습니다.

그러나 비트코인의 결정론적 지갑은 여기서 그치지 않습니다. 사실, 최신 결정론적 지갑은 위에서 설명한 간단한 디자인을 넘어 두 가지 주요 속성을 가지고 있으며, 이는 개발자들에 의해 크게 광고되고 있습니다. 첫 번째 속성은 “마스터 공개 키”의 개념입니다. 마스터 공개 키는 지갑의 마스터 개인 키(“시드”와 동일하거나 그 파생물)에서 생성될 수 있는 키로, 비트코인 지갑의 모든 주소를 생성할 수 있는 권한을 가지고 있지만, 개인 키는 생성할 수 없습니다. 따라서 마스터 공개 키에 접근할 수 있는 사람은 결정론적 지갑의 잔액을 확인할 수 있지만, 각 주소에 해당하는 개인 키를 생성할 수 없기 때문에 잔액을 실제로 사용할 수는 없습니다. 두 번째 속성은 계층 구조입니다: 마스터 개인 키에서 생성된 개인 키는 그 자체로 마스터 개인 키가 되며, 독립적인 결정론적 지갑으로 취급될 수 있습니다.

결정론적 지갑은 어떻게 작동하나요?

현재 사용 중인 결정론적 지갑의 두 가지 주요 유형이 있습니다: Electrum 지갑과 BIP32 지갑; 이들은 매우 유사한 알고리즘을 사용하여 모두 마스터 공개 키 속성을 가지지만, BIP32 지갑은 계층 구조 속성도 포함하여 더 나아갑니다 – Electrum 지갑은 한 수준만 내려가도록 설계되었지만, Electrum 프로토콜을 확장하여 계층 구조로 만들 수도 있습니다.

마스터 공개 키 속성은 아마도 결정론적 지갑의 가장 놀라운 기능일 것이며, 먼저 자세히 살펴보겠습니다. 그것이 작동하는 이유는 비트코인 공개 키가 – 비트코인 주소와는 약간 다르지만 밀접한 관련이 있는 형태 – 일반 정수처럼 더하고 빼는 것이 가능하기 때문입니다(물론 두 개의 공개 키를 곱할 수는 없습니다). 따라서 두 개의 “수준”에서 동일한 산술 연산을 수행할 수 있습니다 – 개인 키를 생성하기 위해서는 정수 수준에서 산술이 수행되고, 공개 키를 생성하기 위해서는 공개 키 수준에서 수행됩니다.

모든 결정론적 지갑 시스템에서 사용되는 정확한 알고리즘은 다음과 같습니다. 인덱스 i(예: i = 5)에서 개인 키를 계산하기 위해, 인덱스와 마스터 공개 키의 함수(기술적으로는 해시)를 사용하여 “오프셋” 매개변수를 계산합니다. 그런 다음, 마스터 개인 키와 오프셋을 단순히 더합니다. 인덱스 i에서 공개 키를 계산하기 위해서는 같은 방식으로 오프셋을 계산하고, 오프셋을 공개 키로 변환한 다음, 마스터 공개 키와 오프셋 공개 키를 더합니다.

다음은 Electrum 지갑을 사용한 몇 가지 예입니다. 제 pybitcointools 라이브러리를 사용하여 수행했습니다. 먼저, 시드에서 마스터 개인 키와 마스터 공개 키를 생성합니다:

> seed = random_electrum_seed()’afc3eef71d96c468ca52b437c385a621′> mprivkey = electrum_stretch(seed)’5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5′> mpubkey = ’04’+electrum_mpk(mprivkey)’04fd6d91db1bdfc231116fd7d44c61a02e032b38b90aad419ecf75acf501eebdc7a0b7818e16a97a6c87693c723106e6fe17d4da743fae991139b05e6d1fe5c8a8′

이제, 개인 키 인덱스 0을 생성합니다:

> offset = dbl_sha256(‘0:0:’+mpubkey[2:].decode(‘hex’))’429251ad9607fd39040072d23f53d54fc3b1ea526310fa45ca2a2df0629e2db2′> priv0 = add_privkeys(mprivkey,offset)’a0835e3fc02475c1b9c418794fc247a732bbabd16ca4ef38983923bd3dcd8177′

이제 공개 키:

> pub0 = add_pubkeys(mpubkey,privkey_to_pubkey(offset))’04d96f3a8ebb0de48a98a5d77003c1d3ed5a36aae3eb20ee138a233e0c644becf77263c6e56cca6cfe064eb87582dcf92e9066d567ae0ffa67b0a5a4fda2bd7d68′> addr = pubkey_to_address(pub0)’14EkQ9qsKxWKiBJm5f7mT7ozSKKZbQoZGS’

그리고 수학이 맞는지 보여주기 위해:

> privkey_to_pubkey(priv0)’04d96f3a8ebb0de48a98a5d77003c1d3ed5a36aae3eb20ee138a233e0c644becf77263c6e56cca6cfe064eb87582dcf92e9066d567ae0ffa67b0a5a4fda2bd7d68′

이 과정을 인덱스 1, 인덱스 2 등으로 반복할 수 있습니다; Electrum 지갑이 있다면 직접 시도해볼 수 있습니다. 요점은 이렇습니다: 마스터 공개 키를 안전하지 않은 장소에 두거나 감사인과 같은 제3자에게 제공해도 안전하며, 단지 마스터 개인 키(및 시드)는 자신만 알고 있어야 합니다.

계층 구조

이제 계층 지갑 속성으로 넘어갑니다. 이 속성은 다시 한 번, 단순히 작동하는 모습을 보여주는 것이 가장 좋습니다:

> w = bip32_master_key(‘qweqweqweqweqwe’)’xprv9s21ZrQH143K2KhRQVuMqhz798mvW89J1aJMWEKNfZzv3BPAgBc4TH59K8ZcLt8RrNJvbUzA72A92Grm3MorG2FnFaoZ7B8SDTYXgUBALoi’> w0 = bip32_ckd(w,0)’xprv9uyTuGongdyZAMxZ2euUBbpsAdtE2nxFBmcQn89UT4ZyzrMg5TXD7azCnsnpH9Q7yrYgG7nVakE6BTxJUarLrDA28VxS3ZWDsgYWZUxtNiH’> w000 = bip32_ckd(bip32_ckd(bip32_ckd(w,0),0),0)’xprv9zL8JVf2Us8VKFYoi3A8F3LSFuHnxNhAdVyrWuECgcbW13WcSrAZt9QxbbMvrFZsvUtrktVpNJ5iN1JhgUYDZoeXC5qtGfLuLw3reVWSRir’

이 기능이 광고되는 주요 사용 사례는 계층 조직에서입니다: 회사의 재무 담당자는 BIP0032 지갑의 루트 개인 키에 대한 제어권을 가질 수 있으며, 각 부서에 “자식” 시드를 전달하여 각 부서가 자신의 지갑을 운영할 수 있도록 합니다. 재무 담당자는 모든 것에 대한 마스터 키를 가지지만, 각 부서는 자신의 자금 부분에 대한 키만 가집니다.

그리고 물론, BIP32는 Electrum과 동일한 마스터 공개 키 속성을 가지지만, 더 강력합니다:

> wp = bip32_privtopub(w)’xpub661MyMwAqRbcEomtWXSNCqvqhAcQuas9NoDxJcizDuXtuyiKDivK15PdAPVkPwVXT9rFbjAnE9P3sLh6xnDawXF1uUXrruH1UvALHF89qdP’> wp000 = bip32_ckd(bip32_ckd(bip32_ckd(wp,0),0),0)’xpub6DKUi1BvKEgnXjdGp4h8cBHAow8HMqR1ziuTKHdpEx8UsqqkzPUpRwjSStDzFc5ALo93wyYXmRr9rvXWcrfw5MPFKCET11KFg3kNrESyWZ6′> wp000_2 = bip32_privtopub(w000)’xpub6DKUi1BvKEgnXjdGp4h8cBHAow8HMqR1ziuTKHdpEx8UsqqkzPUpRwjSStDzFc5ALo93wyYXmRr9rvXWcrfw5MPFKCET11KFg3kNrESyWZ6′

따라서 BIP32 마스터 개인 키는 무한히 하강하는 트리의 정점에 있다고 생각할 수 있으며, 그 아래의 모든 개인 키를 복구할 수 있습니다. BIP32 마스터 공개 키도 마찬가지이며, 단지 공개 키와 주소만 복구할 수 있습니다. 또 다른 비유적인 방법은 개인 키가 열대 우림의 캐노피 수준에 있고, 공개 키가 그 아래에 있는 것으로 생각하는 것입니다. 개인 키와 공개 키 수준에서 동일한 경로를 탐색할 수 있으며, 어디서 뛰어내리든 목적지는 동일하지만, 일단 땅에 닿으면 다시 올라갈 수는 없습니다(현재로서는 공개 키 지면에서 개인 키 캐노피로 올라갈 수 있는 나무를 타는 원숭이는 순전히 이론적입니다).

간과된 문제

위에서 본 설명들로부터, 결정론적 지갑이 두 가지 속성을 가지고 있음을 이해했을 것입니다. 첫째, 부모 키에서 자식 키로 이동할 수 있지만, 그 반대는 불가능합니다. 둘째, 자금에 대한 위험 없이 마스터 공개 키를 제공할 수 있습니다 – 오직 개인 정보만 위험에 처하게 됩니다. 그리고 이것이 오늘날 거의 모든 사람들이, 적어도 결정론적 지갑이 무엇인지 알 만큼 기술적으로 숙련된 사람들, BIP0032 지갑을 바라보는 방식입니다. 부서에 자식 개인 키를 제공하고 회계사 및 감사인에게 마스터 공개 키를 제공하는 회사 모델은 BIP0032 지갑이 잠재적으로 지니고 있는 약속에 대한 신화에서 중심적인 위치를 차지하게 되었습니다. 그러나 아래에서 볼 수 있듯이, 이러한 계층 지갑에 대한 설명은 치명적인 결함이 있습니다.

문제는 다음과 같습니다: 부모 키에 대한 위험 없이 자식 키를 안전하게 제공할 수 있고, 마스터 개인 키에 대한 위험 없이 마스터 공개 키를 제공할 수 있지만, 두 가지를 동시에 수행할 수는 없습니다. 이러한 상황이 발생할 때의 악용 방법은 실제로 매우 간단하며, 두 줄의 pybitcointools 코드로 수행할 수 있습니다. 이 예에서는 Electrum을 사용할 것이며, Electrum 지갑이 더 투명하기 때문입니다. 위에서 생성한 동일한 마스터 공개 키와 자식 개인 키입니다:

> mpubkey’04fd6d91db1bdfc231116fd7d44c61a02e032b38b90aad419ecf75acf501eebdc7a0b7818e16a97a6c87693c723106e6fe17d4da743fae991139b05e6d1fe5c8a8′> priv0’a0835e3fc02475c1b9c418794fc247a732bbabd16ca4ef38983923bd3dcd8177′

위에서 보았듯이, 첫 번째 개인 키는 mprivkey + calc_offset(mpubkey,index)라는 공식을 사용하여 계산됩니다. 그렇다면 우리는 무엇을 해야 할까요? 자세히 살펴보면, 답은 놀라울 정도로 명백합니다:

> offset = dbl_sha256(‘0:0:’+mpubkey[2:].decode(‘hex’))’429251ad9607fd39040072d23f53d54fc3b1ea526310fa45ca2a2df0629e2db2′> mprivkey_2 = subtract_privkeys(priv0,offset)’5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5′

그리고 짜잔, 우리는 마스터 개인 키를 다시 얻습니다. 이제 우리는 지갑의 다른 모든 주소를 훔칠 수 있으며, 심지어 지갑 소유자가 절대 건드릴 생각조차 하지 않았던 주소들까지도 가능합니다. 이 과정을 더 편리하게 만들기 위해 pybitcointools에 명령어를 포함했습니다:

> crack_electrum_wallet(mpubkey,priv0,0)’5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5′

BIP32도 동일한 취약점을 가지고 있습니다:

> wp = bip32_privtopub(w)> w0 = bip32_ckd(w,0)> crack_bip32_privkey(wp,w0)’xprv9s21ZrQH143K2KhRQVuMqhz798mvW89J1aJMWEKNfZzv3BPAgBc4TH59K8ZcLt8RrNJvbUzA72A92Grm3MorG2FnFaoZ7B8SDTYXgUBALoi’

공정성을 위해, 이것이 갑작스러운 새로운 제로데이 취약점 발견이 아니라는 점을 언급하는 것이 중요합니다; 많은 비트코인 개발자들은 이미 한동안 이 사실을 알고 있었습니다. 그러나 많은 사람들이 암묵적으로 홍보하는 계층적 결정론적 지갑에 대한 직관적인 이해, 즉 조직 부서에 자식 개인 키를 제공하고 감사인에게 마스터 공개 키를 제공하는 아이디어를 고려할 때, 이는 보안 위반으로 이어질 가능성이 큽니다. 대규모 조직이 실제로 비트코인 자금을 보호하기 위해 계층적 결정론적 지갑을 채택하기로 결정하고, 갑자기 한 부서의 책임자와 감사인이 회사 자금을 모두 가지고 도망치는 사건이 발생하는 것은 시간 문제일 수 있습니다. 따라서 명백한 질문은: 이것을 수정할 수 있을까요? 답은 아니라고 보입니다; 공개 키로 수행할 수 있는 유일한 작업은 더하고 빼는 것이기 때문에, 마스터 공개 키 속성을 가진 결정론적 지갑을 구현하는 유일한 방법은 여기서 설명한 “오프셋” 메커니즘을 사용하는 것입니다. 만약 이것이 사실이라면, 인식을 높이는 것이 유일한 해결책이 될 것이며, BIP32 표현과 클라이언트에서 마스터 공개 키와 계층 지갑이 혼합되지 않는다는 것을 명확히 하는 변화가 필요합니다.

이 문제를 우회할 수 있는 영리한 방법이 하나 있습니다: 세 개의 계층적 BIP32 지갑을 만들고, 모든 주소가 특정 자식 키 파생 경로를 따라 세 개의 지갑 간의 2-of-3 다중 서명 주소가 되도록 하는 것입니다. 그러면 감사인은 세 개의 마스터 공개 키 중 하나를 가지고, 해당 마스터 공개 키에서 생성된 공개 키가 포함된 트랜잭션을 블록체인에서 검색할 수 있습니다. 이 솔루션은 복잡하고 기존 클라이언트에서 지원되지 않으며 완벽하지 않지만, 이 문제를 해결할 수 있는 유일한 방법처럼 보입니다. 그러나 대부분의 경우, 단순히 마스터 공개 키를 제공하지 않는 것이 더 나은 접근 방식일 수 있습니다.

결정론적 지갑의 미래는 무엇일까요? 현재로서는 BIP0032가 우리가 갈 수 있는 한계일 가능성이 높습니다; 아직 활용되지 않은 타원 곡선 수학의 알려진 요령은 없습니다. 한 가지 명백한 업그레이드는 BIP0032 다중 서명 지갑일 수 있으며, 이는 BIP0032의 계층적 결정론적 마법과 비트코인에서 자금을 사용하기 위해 세 개의 주어진 개인 키 중 두 개가 필요한 주소로 비트코인을 전송할 수 있는 고급 기능을 결합합니다. 또 다른 방향은 브레인 월렛입니다. 비트코인 지갑을 기억하는 현재의 두 가지 경쟁자는 (1) 비밀번호를 선택하고 비밀번호 또는 비밀번호의 해시를 시드로 사용하는 것과 (2) 무작위로 시드를 생성하고 시드를 되돌릴 수 있는 방식으로 암호구로 변환하는 것입니다. 두 가지 접근 방식 모두 현재 구현 방식이 다소 결함이 있습니다 – 첫 번째 접근 방식의 표준 구현은 무차별 대입 공격에 대해 너무 적게 방어하며, 두 번째 접근 방식의 표준(Electrum) 구현은 암기하기 너무 어렵습니다 – 연구에 따르면 “빛나는 날짜 비용 피비린내 나는 곡선 바퀴 사촌 그림 링 마침내 거품 압착”과 같은 암호구는 동일한 보안 수준의 무작위 문자열보다 암기하기 더 쉽지 않으며, 한두 단어를 잊어버리는 것에 대한 보호를 제공하지 않습니다. 이러한 문제들은 해결해야 할 문제입니다 – 비트코인 개발자라면, 해결책을 고안하고 표준화할 기회를 가질 수 있습니다.

관련 기사

마이애미 IT 직원, 전 상사로부터 190만 달러 비트코인 절도 혐의로 체포 1

마이애미 비트코인 절도, IT 직원 체포

마이애미의 한 남성이 경찰에 따르면 전 직장에서 거의 200만 달러 상당의 비트코인을 훔친 혐의로 여러 중범죄 혐의에 직면해 있습니다. 이

카사, 비트코인 보유자를 겨냥한 증가하는 사회 공학 공격에 대응하기 위해 네 가지 보안 기능 출시 1

사회 공학 공격에 대응하는 카사 기능

비트코인 보안 회사 카사는 2025년 암호화폐 도난의 대부분을 차지하는 공격 벡터인 사회 공학을 겨냥한 네 가지 기능을 출시했습니다. 이 기능은

마스터카드, 디지털 자산 전략을 강화하기 위해 뉴욕 비트라이센스 확보 1

마스터카드, 비트라이센스 획득

마스터카드는 뉴욕주 금융 서비스국(NYDFS)으로부터 비트라이센스를 받았으며, 이는 이 결제 거대 기업이 미국에서 가장 엄격한 암호화 규제 프레임워크 중 하나 아래에서

크라켄, 비트코인 보관소 출시 - BTC 보유에 대한 수익 제공 1

비트코인 보관소 | 크라켄의 새로운 금융 솔루션

크라켄은 고객이 자산을 판매하지 않고도 비트코인 보유량에 대해 BTC 기준 보상을 받을 수 있는 새로운 제품인 비트코인 볼트를 크라켄 어

폴드, 비트코인 신용 카드 성장을 위한 1억 5천만 달러 유치 1

비트코인 신용 카드, Fold의 성장 동력

Fold Holdings, Inc., 최초의 상장된 비트코인 금융 서비스 회사가 Encina Lender Finance, LLC와 4년간의 고정 담보 회전 신용 시설에 진입했습니다.

DDC, 한 주에 비트코인을 두 번 구매하며 자산을 14% 증가시켜 희석 없이 재무를 성장시킵니다. 1

비트코인으로 DDC 자산 14% 증가

DDC Enterprise Limited (NYSE American: DDC)는 수요일에 131 비트코인을 구매하여 기업 비트코인 금고를 2,714 BTC로 확장했다고 발표했습니다. 뉴욕에 본사를 둔