Coiner on Nostr: [에피소드] Sign/Verify Message 에피소드(1) 몇 년 전 BIP39/BIP32 ...
[에피소드] Sign/Verify Message 에피소드(1)
몇 년 전 BIP39/BIP32 알고리즘을 구현할 때의 일이었다.
개발 스펙에 따라 구현을 완료하고 여러 데이타를 테스트할 때, 아주 우연히 iancoleman 웹사이트의 BIP39 결과값 비트코인 주소와 내 프로그램의 결과가 다르게 나오는 것을 확인하였다. 좀 더 깊게 연구해 보니, iancoleman도 동일한 버그로 과거에 큰 문제(
https://github.com/iancoleman/bip39/issues/58)가
야기된 적이 있다는 것을 알게되었다. 즉, BIP32 derivation을 할 때 derived private key (혹은 chain code)가 32 바이트보다 작은 값 (보통 31 바이트)을 가질 수 있는데, 앞에 0을 붙여 정확히 32바이트로 보정해 주지 않으면 다른 주소를 생성하게 된다. 물론 현재는 버그가 수정되었고, 다른 지갑들/라이브러리들도 이러한 문제를 수정하였다.
Lesson learned: 모든 프로그램 혹은 Firmware 들은 버그를 가질 수 있다...
만약 당신이 1년동안 모은 비트코인을 하드월렛에 옮기거나 기존 웰렛에 있는 코인들을 새로 산 하드웰렛의 하나의 주소로 옮길 때, (잘못될 일은 절대 없겠지만^^) 혹시라도 그 주소에 대한 private key를 내가 제대로 가지고 있는지 검증해 보고 싶지 않을까?
일반적으로 하드웨어 웰렛은 특정 주소에 대한 private key를 보여주지 않는다 (보여준다 하더라도 그 주소와 private key 매핑을 확인하기 위해 다른 도구가 필요하다). 이러한 검증을 위해 사용할 수 있는 한 방법으로 "Sign/Verify Message"를 사용할 수 있다. 예를 들어, 콜드카드에서 특정 비트코인 주소에 대해 임의의 텍스트 메시지 파일을 Sign한 후, Sparrow 등과 같이 "Sign/Verify Message" 기능을 제공하는 툴에서
이를 검증해 보는 것이다. 만약 이러한 검증이 성공한다면, 기술적(?!)으로 당신은 그 비트코인 주소를 100% 소유했다고 말할 수 있다.
비트코이너 마인드: I trust you, but I want to verify...
Published at
2023-10-28 16:48:19Event JSON
{
"id": "2e73e3ba29e0a19ef14b1a1d2183f654559153c72d4d349f02155b2fd3b8d802",
"pubkey": "83a0bfc47e32242c5a3d9a9bc3982275f1b238c5d87e7cf5b44d72ab6f953db7",
"created_at": 1698511699,
"kind": 1,
"tags": [],
"content": "[에피소드] Sign/Verify Message 에피소드(1)\n\n몇 년 전 BIP39/BIP32 알고리즘을 구현할 때의 일이었다. \n개발 스펙에 따라 구현을 완료하고 여러 데이타를 테스트할 때, 아주 우연히 iancoleman 웹사이트의 BIP39 결과값 비트코인 주소와 내 프로그램의 결과가 다르게 나오는 것을 확인하였다. 좀 더 깊게 연구해 보니, iancoleman도 동일한 버그로 과거에 큰 문제(https://github.com/iancoleman/bip39/issues/58)가 \n야기된 적이 있다는 것을 알게되었다. 즉, BIP32 derivation을 할 때 derived private key (혹은 chain code)가 32 바이트보다 작은 값 (보통 31 바이트)을 가질 수 있는데, 앞에 0을 붙여 정확히 32바이트로 보정해 주지 않으면 다른 주소를 생성하게 된다. 물론 현재는 버그가 수정되었고, 다른 지갑들/라이브러리들도 이러한 문제를 수정하였다.\nLesson learned: 모든 프로그램 혹은 Firmware 들은 버그를 가질 수 있다...\n\n만약 당신이 1년동안 모은 비트코인을 하드월렛에 옮기거나 기존 웰렛에 있는 코인들을 새로 산 하드웰렛의 하나의 주소로 옮길 때, (잘못될 일은 절대 없겠지만^^) 혹시라도 그 주소에 대한 private key를 내가 제대로 가지고 있는지 검증해 보고 싶지 않을까? \n\n일반적으로 하드웨어 웰렛은 특정 주소에 대한 private key를 보여주지 않는다 (보여준다 하더라도 그 주소와 private key 매핑을 확인하기 위해 다른 도구가 필요하다). 이러한 검증을 위해 사용할 수 있는 한 방법으로 \"Sign/Verify Message\"를 사용할 수 있다. 예를 들어, 콜드카드에서 특정 비트코인 주소에 대해 임의의 텍스트 메시지 파일을 Sign한 후, Sparrow 등과 같이 \"Sign/Verify Message\" 기능을 제공하는 툴에서\n이를 검증해 보는 것이다. 만약 이러한 검증이 성공한다면, 기술적(?!)으로 당신은 그 비트코인 주소를 100% 소유했다고 말할 수 있다.\n \n비트코이너 마인드: I trust you, but I want to verify...",
"sig": "5177226982a6bad388c26fc389e50ce045df724bf2d7a66967118653f7c416795f15126c4e61e18c7c5f82b1e535fd8b6994378553422e01bb5786fcba63bab8"
}