니모닉 단어 코드란 결정적 지갑에서 난수를 12개의 단어로 인코딩한 단어 그룹입니다. BIP-39에서 제안된 기술입니다. 기존에 사용하던 시드키는 숫자+문자로 구성된 난수로 기억하기가 힘들었습니다. 니모닉 코드 단어를 사용할 경우 사용자가 기억하고 있는 쉬운 형태로 구성할 수 있습니다.
시드키 | 8979644bfb6b6206792sk32k171b3a00daebfbdf3de3d81fa8c87a8012b04be060765762d4540ff10788959a84dec51667f34b0380e66be373d0ab2c62f8f94 |
니모닉 코드 | convince patrol scene client jungle fitness blind grass apology calm pause endless |
암호화폐 지갑에서 니모닉은 지갑을 복구하기 위한 단어 조합으로 사용됩니다. 사람이 만들어내는 단어 조합은 난수의 성질을 띄기 힘듭니다. 전혀 다른 종류의 단어들을 연결해서 지갑을 복구합니다. 결정적 특성을 가지기 때문에 니모닉 단어 코드만 있으면 여러개의 비밀키를 한번에 알 수 있습니다.
니모닉 지갑(Mnemonic Wallet)
니모닉 코드 단어를 사용해서 손쉽게 비밀키 관리를 할수 있는 암호화폐 지갑종류입니다. 비밀키를 잃어버리면 지갑 접속이 안되기 때문에 비밀키 관리는 지갑 사용에 아주 중요한 요소입니다. 이 때 니모닉 코드 단어를 사용하면 비밀번호를 잃어버려도 지갑을 복구할 수 있습니다. 여러개의 비밀키를 니모닉 코드 단어로 관리할 수 있습니다.
지갑에 대해 이해가 잘 안되신다면 아래 글을 참고해주세요
암호화폐 지갑은 현실의 지갑처럼 화폐를 저장하지 않습니다. 블록체인 상에 연결된 블록에 적힌 자산에 대한 소유권을 주장할 수 있는 개인키/공개키를 보관하는 소프트웨어입니다. 암호화폐 지갑을 통해 비밀키와 공개키를 관리하고 트랜잭션을 발생시킬 수 있습니다.
니모닉을 사용하는 이유?
블록체인 네트워크에서 소유권을 주장하기 위해서는 디지털 서명을 하게 됩니다. 다른 사람에게 데이터를 노출시키지 않은 상태에서 나의 소유권을 주장하기 위해서는 공개키와 비밀키를 사용한 비대칭 키 암호방식을 사용하게 됩니다. 은행에서 공인인증서로 거래를 하는 것처럼 분산 장부에서는 디지털 서명을 통해 신원을 확인하고 거래를 할 수 있게 됩니다.
공개키는 비밀키로 부터 생성됩니다. SHA 알고리즘이나 타원곡선 알고리즘을 통해 비밀키를 가지고 공개키를 만듭니다. 하지만 공개키를 가지고 비밀키를 유추할 수는 없습니다. 따라서 비밀키만 가지고 있으면 공개키는 public 하게 관리할 수 있습니다. 따라서 지갑 주소로 공개키를 사용하게 됩니다.
비밀키의 보안성능은 2^256입니다. 사람이 사용하기에는 긴 데이터기 때문에 64글자의 16진수를 사용합니다. 임의로 구성된 문자열이기 때문에 비밀키를 사람이 기억하는건 불가능에 가깝습니다. 아래 문자열을 지갑을 사용할 때 마다 기억해서 입력할 수 있을까요?
5KRQ7XK5oU48pqABR2bkiwqP6oZj2W1Fb6stJgjdoNhBZsVYK7m
니모닉(Mnemonic)은 순서대로 생성된 단어를 가지고 비밀키를 생성하는 난수를 생성하게 됩니다. 결정적 지갑방식에 사용되는 방식으로 니모닉 단어 코드만 가지고 있으면 여러개의 비밀키를 한번에 관리할 수 있습니다. 니모닉 단어 코드에서 생성되는 루트 시드를 가지고 시드키를 생성한 후 비밀키가 생성됩니다.
대표적으로 MetaMask 지갑을 생성할 때 12개의 니모닉 단어 코드가 생성됩니다. 이 단어들만 기억하고 있으면 결정적인 방식으로 비밀키를 알아낼 수 있게 됩니다. 따라서 어떤 사용자에게도 이 니모닉 코드는 알려주면 안됩니다. 1개의 지갑 뿐만 아니랑 여러개의 지갑이 한번에 털릴 수 있습니다.
니모닉 코드는 12개 혹은 24개의 랜덤 단어로 구성됩니다. 실생활에 사용되는 단어들로 니모닉 단어 코드가 구성되기 때문에 복잡한 비밀키를 일일이 기억하는 것보다 효율적으로 지갑에 사용되는 비밀키를 관리할 수 있게 됩니다.
니모닉 코드로 시드 생성하는 과정
니모닉 코드를 사용해 HD 월렛의 주소를 생성할 수 있습니다. 니모닉 코드는 키 스트레칭 과정을 거쳐 마스터 시드와 시드 키, 비밀키를 순차적으로 생성합니다. 니모닉 코드는 BIP-39에서 제안되었습니다. BIP-39에서 제안된 니모닉코드, 시드 생성 단계는 총 7단계로 나뉩니다.
키 스트레칭(Key Stretching)?
해시 함수를 여러번 겹쳐 실행하는 것입니다. 만약 운나쁘게 해시 결과값을 해커가 찾아버리면 원본 데이터가 털릴 수 있기 때문에 여러번에 걸쳐 진행된 해시 함수 결과값을 찾는 것은 훨씬 어려워 질 것입니다. 키 스트레칭 과정에 통상 솔트(salt)라는 문자열 상수를 조합하게 됩니다. 해시 함수는 속도가 빠르기 때문에 오버헤드를 유지하면서 보안성을 올릴 수 있습니다.
① 128 Bit 혹은 256 Bit 길이의 난수를 생성합니다.
② 생성된 난수를 SHA-256 알고리즘으로 해싱합니다. 해싱 결과값에서 앞에서부터 (난수의 길이 / 32) 만큼의 bit를 떼어내 체크섬(checksum)으로 만듭니다. 예를 들어 난수의 길이가 128bit면 4( = 128/32 )bit를 떼어냅니다.
③ 생성되었던 난수 뒤에 체크섬을 붙입니다.
④ 체크섬을 붙인 난수를 11bit 단위로 잘라냅니다.
⑤ 각 11bit 단어를 사전에 정의된 영단어로 치환합니다.
⑥ 각 11bit의 순서를 유지해 순서를 가진 니모닉 단어 코드를 생성합니다. 만약 난수의 길이가 128bit면 4bit의 체크섬이 부터 총 12개의 니모닉 단어코드가 생성되고, 난수가 256bit면 8bit 의 체크섬이 붙어 총 24개의 니모닉 단어 코드가 생성됩니다.
⑦ 생성된 니모닉 단어 코드와 솔트(salt)를 조합하여 PBKDF2 해시 함수를 사용해 512bit의 시드를 파생시킵니다. PBKDF2 해시 함수는 HMAC-SHA512 알고리즘을 사용합니다. 2048 해시 라운드를 사용합니다. 여기서 솔트는 사용자가 임의로 지정할 수 있습니다.
생성된 시드를 가지고 비밀키를 결정적인 방식으로 생성하게 됩니다.
'Blockchain' 카테고리의 다른 글
[Blockchain] 블록체인 트릴레마란? (0) | 2022.06.23 |
---|---|
[Blockchain] CeFi vs DeFi 차이점(DEX란?) (0) | 2022.06.22 |
[Blockchain] Geth Wallet 설치/사용법(Ubuntu 20.04 LTS) (0) | 2022.06.22 |
[Blockchain] 마이이더월렛(MEW) 사용법 (암호화폐 지갑 만들기) (0) | 2022.06.22 |
[Blockchain] 메타마스크 지갑 만드는 방법 (0) | 2022.06.22 |
댓글