--- title: Crypto wallet tags: security, wallet --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Crypto wallet ## 지갑 유형 1. 비결정적 방식 지갑 : 개인키를 랜덤하게 생성 -> 보안 측면에서는 안전한 방식이지만 백업이 복잡하다. 2. 결정적 방식 지갑 : 개인키를 공통시드로부터 생성 -> 초기 시드값만 있으면 다른 키들은 얼마든지 만들 수 있다. 반대로 하나라도 털리면 나머지가 다 털릴 수 있다. ## 니모닉 코드 ![엔트로피와 단어 길이](https://i.imgur.com/ewsRNl5.png) 1. Mnemonic Code의 단어 수에 해당하는 비트수만큼의 난수(random number)를 생성한다. 2. 엔트로피를 SHA-256함수에 통과시켜 첫 4bits를 checksum code로 설정한다. 3. 엔트로피 + checksum code 의 총 132bits 수를 만든다. 4. 132bits를 11bits씩 12개로 나눈다. 5. 각 11bits를 BIP-39 wordlist( 2048 [2^11]개 )에 대응하는 단어로 치환한다. 6. 순서는 엔트로피 그대로. 7. PBKDF2 라는 key-stretching 함수를 통해 512비트의 시드를 만들수있다. 8. salt 는 보통 사용자가 입력하는 암호문이다. 9. mnemonic + salt 를 PBKDF2 함수에 2048번 넣어서 512bits의 결과를 얻는데 이것이 seed이다. ![엔트로피 생성 & 니모닉 단어로 인코딩](https://i.imgur.com/GuM7k6v.png) ![니모닉 코드 시드 추출](https://i.imgur.com/mfpsXQP.png) ``` 위 seed 구문을 HMAC-SHA512로 해싱하면 HD wallet에서 사용하는 마스터 키를 생성할 수 있다. 마스터키를 반으로 쪼개면 앞부분을 private key, 뒷부분을 chain code 라고 한다. private key 를 타원 곡선 암호를 통해 public key를 얻어낼 수 있다.` 공개키는 타원 곡선 함수의 특정 점을 가리켜서 (x,y) 의 512it 형태로 나오지만 보통 압축형식으로 x값만 사용한다. ``` ## HD wallet(Hierarchical Deterministic) 하나의 시드 값만 가지고 있으면 여러 개의 주소를 쉽게 생성할 수 있는 지갑 (BIP-32에서 제안 & BIP-44에서 개선됨) -> 여러 개의 키를 하나로 관리할 수 있다. ![BIP-32](https://i.imgur.com/9KXRBMV.png) > 각 tree level은 / 로 구분 > > `m/0 : 마스터 비밀키의 첫번째 자식 비밀 키` > `m/0/1 : 마스터 비밀키의 첫번째 자식의 두번째 자식 비밀키` ## 지갑 주소 생성 방법 네트워크에 따라 주소 생성방법이 다르며 이더리움의 경우 ``` A = Keccak-256(public key) address = '0x' + last_20bytes_of_A ``` ## 키 서명 방식에 따른 지갑의 분류 1. Hot wallet 어플이나 브라우저 플러그인 형태의 지갑, 서명을 온라인 상에서 하기때문에 아주 편리하지만 해킹의 위험성이 존재함 2. Cold wallet 거래내역 생성과 개인키 서명을 오프라인(HW)에서 하는 형태의 지갑, 인터넷과 분리되어 개인키를 관리하기 때문에 안전한 방식의 지갑이다. > `결국 니모닉을 통해 공개키와 개인키를 백업해야하기 때문에 니모닉 관리를 잘하는 것이 제일 중요하다.` ## 참조 문서 [0] [Mnemonic의 자세한 설명](http://cryptostudy.xyz/crypto/article/8-Mnemonic-Code) [1] [BIP-39 wordlist](https://www.blockplate.com/pages/bip-39-wordlist) [2] [Mnemonic Wallet 개발 코드](https://velog.io/@mjlee0326/Mnemonic-Wallet-%EA%B0%9C%EB%B0%9C)