검수요청.png검수요청.png

니모닉

위키원
shoot008 (토론 | 기여)님의 2019년 8월 19일 (월) 10:27 판 (니모닉 단어 생성)
이동: 둘러보기, 검색

니모닉(Mnemonic)이란 지갑을 복구하기 위한 12개의 단어이다. 개인키가 너무 복잡한 단어들로 구성되어 있기 때문에, 이를 쉽게 입력할 수 있도록 갖춰진 형식이다. 니모닉의 어원은 그리스 신화의 기억의 여신 므네모시네(Mnemosyne)에서 유래되었다. 므네모시네의 자녀인 뮤즈(Muses)는 올림포스 산의 신들의 축제에서 아폴론을 도와 음악을 연주 하였는데, 악보가 없는 세계라 기억력에 의존하여 연주할 수 있었다고 한다. 그래서 니모닉이라는 어원은 "기억"에 기반하고 있다. 니모닉은 개인키와 같이 유출될 경우 지갑 내 가상화폐를 모두 잃게될 수 있다. 컴퓨터 내 메모장과 같은 곳에 저장하면 악성코드에 노출되어 위험할 수 있다. 그렇기 때문에 암호화하여 저장하는 것을 추천한다. 보통 니모닉과 개인키의 경우 프린트하거나, 어딘가에 적어두고 금고 등 물리적으로 보관하는 것이 가장 안전한 방법이다.

개요

니모닉이란 가장 순수한 형식으로 정보를 쉽게 기억할 수 있는 문자, 단어 또는 연상어의 패턴이다. 니모닉은 단어 12개를 순서대로 맞추는 것으로 암호화된 보안 비밀번호 방식으로 이 니모닉의 문자배열을 초기대로 하지 못하면 어느 누구도 지갑을 열 수 없다. 처음 내 지갑 만들기를 실행했을때 지갑에서 영단어 그룹을 사용하여 고유의 지갑 문구를 생성하게 된다. 이 지갑 문구가 내 지갑의 니모닉이 된다. 니모닉은 12개 또는 24개의 랜덤한 영어 단어로 이루어져 있다. 일반 텍스트 단어로 표현되는 니모닉 코드는 암호화폐 지갑 사용자가 난해한 기술에 대한 이해 없이도 지갑을 편리하게 사용할 수 있도록 돕는다. BIP-39 형식으로 정리된 니모닉 코드는 임의의 값을 사전에 정의된 일상적 단어 리스트에 매핑한다. 니모닉 코드는 해시 함수를 재귀적으로 반복하는 키 스트레칭 과정을 거쳐 마스터 시드를 생성하고, 그 마스터 시드는 HD 지갑 동작의 바탕이 된다.

특징

니모닉 코드 단어는 결정적 지갑을 파생하기 위한 시드로 사용되는 난수를 인코딩한 단어 시퀀스다. 단어 시퀀스는 시드를 다시 만들 수 있고, 그것으로 지갑과 모든 파생된 키들을 다시 만들 수 있다. 니모닉 단어를 사용하는 결정적 지갑을 구현한 지갑 애플리케이션은 지갑을 처음 만들 때 12개에서 24개의 단어 시퀀스를 보여준다. 이 단어 시퀀스는 지갑 백업이고 같거나 호환되는 지갑 애플리케이션에서 모든 키를 복구하고 다시 만드는 데 사용된다.[1] 니모닉 단어 목록을 사용하면 사용자가 쉽게 읽을 수 있고 정확하게 바꿔 쓸 수 있으므로 지갑을 백업하기가 더 쉽다.

니모닉 단어를 브레인지갑(brainwallet)과 혼동하는데, 이들은 서로 같지 않다. 브레인지갑은 사람들이 비밀 키를 잘 관리할 수 있도록 만들어진 기술이다. 기억하기 쉬운 단어나 글자를 가지고 키를 생성해주는 방식이다.[2] 니모닉 단어와 브레인 지갑의 가장 큰 차이점은 니모닉 단어는 지갑이 랜덤하게 생성한 단어를 사용자한테 보여주고, 브레인 지갑은 사용자가 선택한 단어들로 구성된다는 것이다. 니모닉 단어는 난수 생성 소스로 만들어지기 때문에 이 중요한 차이점이 니모닉 단어를 더욱 더 안전하게 한다.[1]

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

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

니모닉 코드는 BIP-39에 정의되어 있다. BIP39가 니모닉 코드 표준의 한 가지뿐임을 기억할 필요가 있다. 일렉트럼 비트코인(Electrum Bitcoin) 지갑에서 BIP39 이전에 사용한 다른 단어 세트인 다른 표준도 있다. BIP39는 트래저(Trezor) 하드웨어 지갑을 지원하는 회사가 제안했으며, 일렉트럼 구현과 호환되지 않는다. 그러나 BIP39는 현재 수십 개의 상호운용이 가능한 구현으로 광범위하게 산업계 절반에 걸쳐 지원받고 있으며, 사실상 업계 표준으로 고려되어야 한다. 더욱이 BIP39는 일렉트럼 시드와 달리 이더리움을 지원하는 복수화폐 지갑을 생산하는 데 사용할 수 있다.[4] BIP39는 니모닉 코드와 시드의 생성을 정의하는데, BIP39에 정의된 니모닉 코드와 시드 생성을 9단계에 걸쳐 설명할 수 있다.[1]

니모닉 단어 생성

엔트로피 생성과 니모닉 단어로 인코딩
니모닉 코드 시드 추출
  1. 암호학적으로 랜덤한 128~256 bits의 시퀀스 S를 만든다.
  2. S의 SHA-256 해시값 중에서 앞(왼쪽)에서 S의 길이 / 32비트만큼을 체크섬으로 만든다.
  3. 2번에서 만든 체크섬을 S의 끝에 추가한다.
  4. 3번에서 만든 시퀀스와 체크섬의 연결을 11 bits 단위로 자른다.
  5. 각 각의 11비트를 2048(2^11)개의 미리 정의된 단어로 치환한다.
  6. 단어 시퀀스로부터 순서를 유지하면서 니모닉 코드를 생성한다.[1]
  • 니모닉 코드 : 엔트로피와 단어 길이
엔트로피(비트) 체크섬(비트) 엔트로피 + 체크섬(비트) 니모닉 길이(단어)
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24

시드 생성

니모닉 단어는 128~256비트 길이의 엔트로피를 표현한다. 엔트로피는 키 스트레칭(key-stretching) 함수 PBKDF2를 통해서 512비트의 시드를 만드는 데 사용되며, 생성된 시드는 결정론적 지갑을 구축하고 키를 파생하는 데 사용된다. 키 스트레칭 함수는 니모닉과 솔트(salt)라는 두 개의 파라미터를 사용한다. 솔트의 목적은 무차별 대입 공격(brute-force attack)을 가능하게 하는 조회 테이블(lookup table) 생성을 힘들게 하는 것이다. BIP39 표준에서 솔트는 또 다른 목적을 갖는데, 솔트의 추가적인 보안 요소 역할을 하는 암호문 추가를 사용할 수 있게 해준다.

  1. PBKDF2 키 스트레칭 함수의 첫 번째 파라미터는 6번 단계에서 만든 니모닉이다.
  2. 두 번째 파라미터는 솔트이다. 솔트는 상수 문자열 "mnemonic"에 사용자가 지정한 암호문을 붙인 것이다.
  3. PBKDF2는 니모닉과 솔트를 HMAC-SHA512로 2048번의 해싱해서 512 bits 값을 만들어 내는데, 이 값이 시드이다.[1]

선택적 암호문

BIP39는 시드 생성에서 선택적 암호문(passphrase) 사용이 가능하다. 만약 암호문을 설정하지 않았다면 니모닉은 상수 문자열 'mnemonic'과 함께 솔트를 구성하여 연장되고, 주어진 니모닉으로부터 특정한 512비트 시드를 생성한다. 만약 암호문을 사용한다면 스트래칭 함수는 동일한 니모닉으로부터 다른 시드를 생성한다. 실제로, 단일 니모닉이 주어졌을 때 암호문이 다르면 다른 시드를 만들어낸다. 본질적으로 잘못된 암호문은 없다. 모든 암호문은 유효하며 각각 다른 시드를 만들어내고 가능한 한 초기화되지 않은 많은 지갑을 형성한다. 암호문이 충분히 복잡하고 길어서 실제로 무차별 대입 혹은 우연히 사용 중인 것을 추측해낼 가능성은 없다.[4]

선택적 암호문은 두 가지 중요한 특징을 가지고 있다.

  • 니모닉 자체만으로는 의미가 없도록 만들어서 니모닉 백업이 도난으로부터 보호될 수 있도록 하는 2차 팩터로 기능한다.
  • 공격자의 협박 때문에 암호문을 가르쳐 줘야 할 경우는 진짜 암호문 대신 그럴 듯한 가짜 암호문을 제공한다. 그러면 대부분의 자금을 담고 있는 진짜 지갑 대신 적은 양의 자금이 있는 지갑으로 공격자의 주의를 돌릴 수 있다.

그러나 암호문의 사용은 손실의 위험 또한 가져온다는 점을 주목해야 한다.

  • 만약 지갑의 주인이 의식을 잃었거나 사망했고 암호문을 알고 있는 사람이 없다면, 시드는 쓸모없어지고 지갑에 저장된 모든 자금을 영원히 잃게 된다.
  • 반대로 소유자가 암호문을 시드와 동일한 위치에 백업하는 것은 2차 팩터를 사용하는 목적에 어긋난다.

암호는 매우 유용하지만 상속인이 암호화폐를 복구할 수 있는 가능성을 고려해야 하므로 신중하게 계획된 백업 및 복구 프로세스와 함께 사용해야 한다.

각주

  1. 1.0 1.1 1.2 1.3 1.4 modolee, 〈4장 지갑〉, 《steemit》, 2018-10
  2. 문가용 기자, 〈블록체인, 이미 수많은 공격에 노출되어 있다〉, 《보안뉴스》, 2018-06-14
  3. lanhaoxiang, 〈BIP39〉, 《깃허브》, 2019-02-15
  4. 4.0 4.1 박성훈, 류길성, 강동욱, Mastering Ethereum, J-Pub, 2019



안전하게 보관하는 방법

니모닉이 유출되면 내 지갑을 통째로 남에게 주는 것과 마찬가지이기 때문에 니모닉 보안에 신경을 써야 한다. 그래서 대부분의 지갑에서는 니모닉을 절대 다른 사람에게 보여줘서는 안된다고 경고를 하며, 직접 종이에 적어서 잘 보관하라고 한다. 하지만 플레이월렛은 클라우드 백업을 제공합니다. 클라우드 백업의 보안은 인터넷 암호화 통신에 사용하는 SSL 통신만큼 안전합니다.

  1. 절대 암호화하지 않은 니모닉이 클라이언트에서 서버로 전달되지 않게 한다.
  2. 서버 보안에 문제가 생겨서 서버 데이터베이스가 공격자에게 노출이 되더라도 사용자의 니모닉을 공격자가 알 수 없게 한다.
  3. 서버가 안전하더라도 클라이언트가 고객이 아닌 다른 사람의 손에 넘어갔을 때 니모닉 복구가 불가능하게 한다.

첫번 째는 당연하게 보안을 생각하면 지켜야 한다. 두번 째와 세번 째는 기존 암호 통신에서 "키 교환(Key Exchange)"라는 방식을 활용해 해결할 수 있다. 키 교환 방식을 활용하면 서버클라이언트는 각자의 비밀 정보(타원곡선 비대칭 키)를 가지고 안전한 방식으로 키(대칭키)를 공유할 수 있다. 이때 특히 클라이언트에서는 비밀정보를 생성할 때 PIN(Personal Identification Number)을 사용해 한번 더 비밀정보를 보호한다. 그 후, 클라이언트는 AES(미국 표준 암호 알고리즘)과 대칭키를 사용해서 니모닉을 암호화하고, HTTPS를 사용해 암호화한 니모닉을 서버에 전달한다. 서버는 데이터베이스에 서버 자신의 비밀 정보와 암호화한 니모닉만을 저장한다. 클라이언트는 니모닉 암호화가 끝나고 나면 즉시 메모리에서 자체 비밀정보를 제거하며, 아무 정보도 남기지 않는다. 이 상황에서 서버가 공격자의 손에 넘어가더라도, 공격자는 암호화한 니모닉과 서버만의 비밀정보를 얻을 뿐이다. 이 상황에서는 암호화한 니모닉을 복구할 수 없다. 이때 암호화한 니모닉을 깰 수 있는 확률은 극히 낮다. 마찬가지로 지갑이 설치된 핸드폰을 잃어버렸다고 해도 니모닉 복구를 위해서는 서버 인증(이메일, 비밀번호)을 거쳐야 하며, 혹시 서버 인증을 통과했더라도 PIN을 제대로 입력해야 한다. PIN 입력 횟수 제한을 두면 몇번 시도에 실패하면 서버에서는 해당 계정을 잠그고 즉시 사용자 이메일이나 SMS로 통보할 수 있다.

각주

참고자료

같이 보기


  검수요청.png검수요청.png 이 니모닉 문서는 보안에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.