티스토리 뷰

잘 만들어진? 비트코인 개인지갑은 세상에서 가장 안전한 나만의 비밀금고가 됩니다. 스위스 은행보다도 튼튼하며 세상 그 누구도 나의 허락없이 나의 자산을 가져갈 수 없습니다. 개인지갑을 안전하게 만드는 것은 나의 평생동안 모은 자산을 담아도 걱정이 없는 든든한 개인금고를 만드는 일입니다.

 

그럼 이제 세상에서 가장 안전하고 실용적으로 비트코인 비밀키를 생성하고 보관하는 방법을 공유합니다.

(비밀키를 이용해 비트코인 주소를 생성하는 방법은 다른 영상을 참고해 주시기 바랍니다)

 

Brain wallet

먼저 브레인 월렛은 기억하기 쉽고 간편해서 좋습니다.

>>> from bitcoin import *
>>>
>>> priv = sha256('apple')
>>> priv
'3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b'
>>>

 

sha256 을 100번 돌릴 수도 있습니다

>>> from bitcoin import *
>>>
>>> reduce(lambda a, c: sha256(a), range(100), 'apple')
'ad532629852723851939da312a38dd95cf09de9df46b6ddeba2b64df49191a71'
>>>

 

하지만 씨드가 짧고 간단할 수록 예상하기 쉽고, 길고 어려울 수록 까먹기 쉬운 단점이 있습니다.

 

하지만 무엇보다도 브레인월렛의 씨드는 보통 예상 및 예측이 가능할 수 있기 때문에 위험할 수 있습니다.

 

그렇기 때문에 추천하지 않습니다.

 

우리의 비밀키는 결코 예측할 수도 예상할 수도 없어야 하고요. 그리고 누군가에 의해 결코 다시 생성될 수도 없어야 합니다. 인류의 멸망이 올때까지 나에 의해 단 한번만 생성될 수 있는 그런 수 이어야 합니다.

 

그러므로 순수하게 랜덤으로 선택된 어떤 값이어야 합니다

 

 

Random number

랜덤값을 생성하는 방법은 두가지로 나눌 수 있습니다.

PRNG(Psudeo Random Number Generator) 와 TRNG(True Random Number Generator)

 

PRNG 는 컴퓨터 소프트웨어에 의해 생성되는 값입니다. random_key() 와 같은 함수를 이용해서 얻은 값이죠. 하지만 컴퓨터 시스템은 복잡해 보여도 단순한 계산기일 뿐입니다. 반드시 어떤 입력조건에 따라서 동일한 결과를 뱉을 수 밖에 없습니다.

 

결국 그 어떤 난수를 만들어내는 방법도 최초 씨드를 필요로 하며 해당 씨드값에 따라 결과값은 결정되게 됩니다. 일반적으로 난수를 생성하는 알고리즘은 현재시간을 씨드로 사용합니다. 그렇기 때문에 매번 씨드는 다를 수 밖에 없고 매번 다른 숫자가 나올 수 밖에 없습니다.

 

그렇다는 얘기는 결국 다른 누군가도 나와 동일한 시간에 randon_key() 함수를 사용한다면 나와 동일한 결과값을 가질 가능성도 있을 것 입니다.

 

결론적으로 컴퓨터가 만들어내는 랜덤값은 순수하게 랜덤값이라고 할 수 없기 때문에 유사 난수 즉 Psudeo Random Number 라고 합니다.

 

그렇다면 TRNG(True Random Number Generator) 는 무엇일까요? 이것은 물리적으로 전혀 예측할 수 없는 환경에서 선택되어지는 난수를 를 말합니다. 예를 들자면 로또번호 같은 것이지요. 로또번호는 그 누구도 예측하거나 예상할 수 없기 때문입니다.

 

우리의 비밀키는 로또와 같이 이상적인 TRNG 로서 선택된 값이어야 합니다. 그렇게 생성된 난수값은 영원이란 시간속에서 정말 단 한번 발생할 수 밖에 없는 수가 될 것입니다. 그만큼 안전하다는 것이지요.

 

그렇다면 실제로 우리는 어떻게 True Random Number (이하 TRN)를 얻을 수 있을까요? 동전을 던지는 일도 좋고요 주사위를 던지는 일도 좋습니다. 하지만 이는 조금 번거롭죠.

 

https://bitaddress.org 는 TRN을 얻기 위해 사용자 마우스포인터의 궤적을 씨드로 사용합니다. 상당히 괜찮은 방법이라고 생각합니다. 물론 bitaddress.org 사이트는 오프라인 환경에서도 이용이 가능합니다. 그럼 이 사이트를 오프라인 상태로 이용하면 간단하게 TRN을 얻을 수 있을까요?

 

저는 이를 신뢰하지 않습니다. 아이디어는 훌륭하지만 내부 코드가 정말로 계획대로 잘 구현되었는 지 여부는 제가 검증할 수 없기 때문입니다. 그래서 저는 이마저도 추천하고 싶지는 않습니다.

 

제가 생각하는 현실 세게에서 가장 손쉽게 TRN을 생성하는 방법은 아무 웹페이지나 방문해서 일정량의 텍스트를 긁어와서 sha256 해시값을 얻는 것입니다.

 

저는 이 방법이 꾀나 직관적이고 손쉽고 괜찮은 방법이라고 생각합니다.

 

아무튼 어떤 식으로 TRN 을 얻을 지는 전적으로 여러분의 선택입니다. 당신이 생성한 TRN 을 누구보다 당신이 신뢰할 수 있으면 충분합니다. 세상의 그 무엇도 신뢰하지 마십시오.

 

Don't trust, verify.

 

이는 비트코인 커뮤니티의 근간을 이루는 철학입니다.

 

 

그럼 비밀키 관리는?

 

비밀키 관리는 니모닉을 활용하기를 권장합니다. 256비트의 비밀키는 사람이 핸들링하기에 너무나 불편합니다. 오타가 들어가 실수를 범하기라도 하면 영원히 나의 자산을 찾을 수 없게 될 것입니다. WIF 포맷도 충분치는 않습니다.

 

그나마 니모닉이 가장 안전하고 좋은 방법이라고 생각합니다.

 

24단어보다는 12단어를 권장합니다. 복잡할 수록 관리의 어려움이 있기 때문입니다. 12단어를 사용한다고 보안에 취약하지는 않습니다. 12단어의 니모닉일지라도 암호학적으로는 충분히 안전한 것으로 알려져 있습니다.

 

니모닉은 관리하기 어려운 비밀키를 사람이 관리하기 쉬운 형태로 변환하는 방법입니다. 니모닉에 대한 자세한 내용은 제가 앞서 작성한 "니모닉, 조금 더 깊게 들어가 보자" 글을 참고해 주시기 바랍니다.

 

니모닉에 조금 익숙하시다면, 12단어의 니모닉이 128비트 밖에 표현하지 못한다는 사실을 알고 계실 것입니다. 우리의 비밀키는 256비트인데 128비트로 어떻게 우리 비밀키를 담을 수 있나요? 라는 질문이 예상됩니다.

 

좋은 질문입니다.

 

하지만 니모닉 값이 곧 바로 비밀키와 같을 필요는 없습니다. 128비트의 엔트로피(랜덤값)를 입력으로 사용한 sha256 값을 우리의 비밀키로 사용하면 됩니다.

 

sha256 해시를 10번 하든 100번 하든 그것은 여러분의 자유입니다. 어째튼 우리는 우리의 니모닉으로 비밀키를 얻을 수 만 있으면 되는 것이니까요. 하지만 sha256 을 몇번 수행했는 지는 본인이 반드시 기억을 하셔야 할 것 입니다.

 

아래는 엔트로피와 니모닉간의 변환을 지원하는 코드입니다.

 

엔트로피로부터 니모닉을 얻을 때, 그리고 해당 니모닉으로부터 정말로 본래의 엔트로피를 얻을 수 있는 지 검증하는데에 필요한 코드입니다.

 


Mnemonic <=> Entropy

 

먼저 mnemonic 라이브러리 설치

pip install mnemonic

 

128비트 엔트로피를 니모닉으로 그리고 니모닉을 엔트로피로 변환 예제

>>> from mnemonic import Mnemonic
>>> m = Mnemonic('english')
>>>
>>> # entropy to mnemonic
>>> ent = 'ac0c3a2ab53d8933a60a4cfa75902424'
>>> words = m.to_mnemonic(bytes.fromhex(ent))
>>> words
'project gift melt heavy sudden oil oblige end whip prosper animal embrace'
>>>
>>> # mnemonic to entropy
>>> bytearray.hex(m.to_entropy(words))
'ac0c3a2ab53d8933a60a4cfa75902424'
>>>

 

 

 


여기까지 제가 혼자 고민하고 연구했던 비밀키 관리의 모든 비법을 공유드렸습니다.

 

이제 우리는 평생토록 12단어의 니모닉만 안전하게 보관하면 됩니다. 이건 또 어떻게 보관을 할까요? 여기부터는 각자의 상황과 환경에 맞게 최선을 찾아 보시기 바랍니다.

 

정답이 있지는 않을 것입니다.

 

아.. 니모닉을 안전하게 보관할 수 있도록 이런 제품들도 있으니 참고 바랍니다^^

 

 

 

 

 

지금까지 제가 안내드린 방법이 완벽하거나 또는 최선이 아닐 수도 있습니다. 중간에 어떤 위험과 오류가 있을 지도 모르겠습니다. 쉽게 신뢰하지는 마십시오. 스스로 충분히 검증하시고 활용하시기 바랍니다.

 

그리고 혹시 더 나은 방법이 있다면 저에게도 알려 주세요. 저 또한 알려주신 내용에 오류는 없는 지 충분히 검증해 보겠습니다.

 

감사합니다.

 


https://www.youtube.com/watch?v=eC3L8IM7-Xw 

 

728x90
반응형
댓글
250x250
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함