본문 바로가기

[BLOCKCHAIN]

Mnemonic Wallet - 개발이론

니모닉(Mnemonic)이란?

 

니모닉(Mnemonic)이란 지갑을 복구하기 위한 12개의 단어이다. 개인 키가 너무 복잡한 단어들로 구성되어 있기 때문에, 이를 쉽게 입력할 수 잇도록 갖춰진 형식이다. 니모닉의 어원은 그리스 신화의 기억의 여신 므네모시네(Mnemosyne)에서 유래되었다. 므네모시네의 자녀인 뮤즈(Muses)는 올림포스 신들의 축제에서 아폴론을 도와 음악을 연주 하였는데, 악보가 없는 세계라 기억력에 의존하여 연주할 수 있었다고 한다. 그래서 니모닉이라는 어원은 "기억"에 기반하고 있다.

 

니모닉은 단어 12개를 순서대로 맞추는 것으로 암호화된 보안 비밀번호 방식으로 이 니모닉의 문자 배열을 초기대로 하지 못하면 어느 누구도 지갑을 열 수 없다. 처음 내 지갑 만들기를 실행했을 때 지갑에서 영단어 그룹을 사용하여 고유의 지갑 문구를 생성하게 된다. 이 지갑 문구가 내 지갑의 니모닉이 된다. 니모닉은 12개 또는 24개의 랜덤한 영어 단어로 이루어져 있다. 일반 텍스트 단어로 표현되는 니모닉 코드는 암호화폐 지갑 사용자가 난해한 기술에 대한 이해 없이도 지갑을 편리하게 사용할 수 있도록 돕는다. 

  • 16진수 표현 (개인키)
FCCF1AB3329FD5DA3DA9577511F8F137
  • 니모닉 단어 12개 표현
wolf juice proud gown wool unfair
wall cliff insect more detail hub

 

특징

니모닉 코드 단어는 결정적 지갑을 파생하기 위한 시드로 사용되는 난수를 인코딩한 단어 시퀸스다. 단어 시퀸스는 시드를 다시 만들 수 있고, 그것으로 지갑과 모든 파생된 키들을 다시 만들 수 있다. 

니모닉 단어를 사용하는 결정적 지갑을 구현한 지갑 어플리케이션은 지갑을 처음 만들 때 12개~ 24개의 단어 시퀸스를 보여준다. 이 단어 시퀸스는 호환되는 지갑 어플리케이션에서 모든 키를 복구하고 다시 만드는데 사용된다. 니모닉 단어 를 사용하면 사용자가 쉽게 읽을 수 있고 정확하게 바꿔 쓸 수 있으므로 지갑을 백업하기가 더 쉽다.

 

니모닉 단어 목록은 다음과 같은 특성이 있다. 단어 목록은 고유 문자를 포함할 수 있지만 NFKD(Normalization Form Compatibility Decomposition)를 사용하여 UTF-8으로 인코딩해야 한다.

 

  • 단어의 현명한 선택 : 단어 목록은 처음 네 글자를 입력하여 명확하게 식별할 수 있는 방식으로 작성된다.
  • 유사한 단어 회피 : "build"와 "built", "woman"와 "women" 과 "quick"과 "quickly"와 같은 단어 쌍은 문장을 기억하지 어려울 뿐만 아니라, 오류가 더 많고 추측하기 더 어렵다.
  • 정렬된 단어 목록 : 코드 단어를 보다 효율적으로 검색할 수 있도록 단어 목록이 정렬된다. (즉, 구현 시 선형 검색 대신 이진 검색 사용 가능) 또한 이를 위해 trie(접두사 트리)를 사용할 수 있다.

니모닉 코드는 BIP-39에 정의되어 있다. BIP-39가 니모닉 코드 표준의 한 가지뿐임을 기억할 필요가 있다. 일렉트럼 비트코인(Electrum Bitcoin) 지갑에서 BIP-39 이전에 사용한 다른 단어 세트인 다른 표준도 있다. BIP-39는 트래저(Trezor) 하드웨어 지갑을 지원하는 회사가 제안했으며, 일렉트럼 구현과는 호환되지 않는다.

 

그러나 BIP-39는 현재 수십 개의 상호운용이 가능한 구현으로 광범위하게 산업계 절반에 걸쳐 지원받고 있으며, 사실상 업계 표준으로 고려되어야 한다. 더욱이 BIP-39는 일렉트럼 시드와는 달리 이더리움을 지원하는 복수화폐 지갑을 생산하는데 사용할 수 있다. BIP-39는 니모닉 코드와 시드의 생성을 정의하는데, BIP-39에 정의된 니모닉 코드와 시드 생성을 9단계에 걸쳐 설명할 수 있다.

 

  1. 128~256 비트의 random 값 (A) 생성
  2. A의 SHA-256 해시값 중에서 앞쪽에서 A의 길이 / 32비트만큼을 체크섬으로 만든다
  3. 2번에서 만든 체크섬을 A의 끝에 추가한다.
  4. A + 체크섬의 연결을 11비트로 나누어 12개의 세그먼트를 생성
  5. 각 11비트 값을 미리 정의된 2048개(2^11)단어로 치환한다.
  6. 순서를 유지하면서 니모닉 코드를 생성한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

니모닉 코드는 길이가 128~256 비트인 엔트로피를 나타낸다. 그런 다음 엔트로피는 키 스트레칭(연장) 기능 함수 PBKDF2를 사용하여 512비트 시드를 만드는데 사용된다.

 

 

7. PBKDF2 함수의 첫번째 매개 변수는 6단계에서 생성된 니모닉

 

8. PBKDF2 함수의 두번째 매개 변수는 'SALT'. SALT는 니모닉 + 사용자에게 암호(passphrase)가 연결된 문자열 상수이다

 

9. PBKDF2는 HMAC-SHA512 해시 알고리즘으로 2048회 해싱하여 512비트값을 만들어내는데, 이 값이 시드이다

 

 

키 스트레칭 함수는 니모닉과 솔트(Salt)라는 두개의 파라미터를 사용한다. 솔트의 목적은 무차별 대입 공격(Brute-Force Attack)을 가능하게 하는 조회 테이블(Lookup Table) 생성을 힘들게 하는 것이다. BIP-39 표준에서 솔트는 또 다른 목적을 갖는데, 솔트의 추가적인 보안 요소 역할을 하는 암호문 추가를 사용할 수 있게 해준다.

 

 

이론을 알아봤으니 실제로 개발을 해보자.

개발링크

'[BLOCKCHAIN]' 카테고리의 다른 글

solidity 패턴 분석 - Guard Check  (0) 2022.06.04
Opensea 클론코딩  (0) 2022.02.19
Truffle을 이용한 ERC-721 개발  (0) 2022.02.09
Mnemonic Wallet - 개발  (0) 2022.02.09
블록체인과 암호화폐  (1) 2021.12.30