3 분 소요

핫 월렛 & 콜드 월렛


암호화폐 지갑은 크게, 핫 월렛, 콜드 월렛으로 구분가능하다.

  • 핫 월렛 : 온라인
  • 콜드 월렛 : 오프라인

핫 월렛

핫 월렛은 인터넷 주소가 네트워크에 연결되어 있어 온라인 상태에서 실시간으로 거래 정보를 주고 받을 수 있다는 장점이 있지만, 개인키가 온라인에 노출되기 때문에 해킹 등 보안 문제에 취약하다. 대표적으로 웹 월렛, 데스크탑 월렛, 모바일 월렛이 있다.

  • Ex. 이더리움의 메타마스크, 클레이튼의 카이카스, 클립

콜드 월렛

콜드 월렛은 지갑의 개인 키를 오프라인으로 보관하는 지갑을 의미하며, 이 때문에 보안 측면에서 안전하다. 하지만 인터넷이 차단되어 있기 때문에 실시간 거래가 불가능하다는 단점이 있다. 거래소에서는 전체 자산의 70%는 콜드 월렛에 안전하게 보관하며, 30%는 핫 월렛에 보관한다. 거래소에서 출금하는 경우, 거래소 데이터베이스에 저장된 개인키를 이용해 트랜잭션을 생성하는 방식으로 출금이 이루어진다.

  • Ex. 페이퍼 월렛(지갑 주소를 만들고 종이에 써서 보관), 하드웨어 월렛(개인 키를 USB나 카드에 보관)

스마트 컨트랙트 월렛


스마트 컨트랙트 월렛은 스마트 컨트랙트를 이용하는 월렛이다. 이더리움에서는 사용자는 EOA로 자신의 자산을 관리하지만, 이는 코드(스마트 컨트랙트)를 담을 수 없다. 하지만 CA를 사용해 자산을 관리하는 경우, 코드를 담을 수 있어 프로그래밍화 가능하다. 또한 스마트 컨트랙트 월렛은 개인 키가 아닌 스마트 컨트랙트로 관리하기 때문에 EOA 월렛보다 더 높은 수준의 보안, 유연성, 편의성을 제공한다.

기능 및 특징

기능


  • 멀티 시그 트랜잭션
  • 일일 송금 제한
  • 긴급 계정 동결
  • 안전한 계정 복구
  • DApp과 상호작용

특징


  • 2단계 인증
    • 인증 앱 및 기본 지갑 솔루션을 통해 추가 보안 기능을 제공한다.
  • ATM과 같은 인출 제한
    • 트랜잭션 금액 제한을 설정할 수 있다.
  • 화이트리스트 및 블랙리스트
    • 사용자는 자신이 지정한 주소(화이트리스트)로만 전송할 수 있고, 차단한 주소(블랙리스트)에는 전송을 제한한다.
  • 사기 경보 및 긴급 잠금
    • 장치를 분실하거나 도난당한 경우 계정을 잠그거나 손상된 장치에서 계정에 대한 액세스를 비활성화할 수 있다.

종류

웹 월렛


웹 월렛은 웹 기반으로 호스팅되는 지갑으로 사용자가 계정을 생성하고 보관할 수 있다. 인터넷 브라우저를 통해 접속하고, 인터넷에 노출되어 보안에 가장 취약하지만, 즉시 거래가 가능하다는 점이 가장 실용적이다.

데스크탑(PC) 월렛


데스크탑 월렛은 OS에 다운로드하여 작동가능하며, 인터넷 접속 여부에 따라 핫 월렛 or 콜드 월렛으로 작동 가능하다. 웹 월렛보다는 불편하지만, 필요시 인터넷에 연결하여 거래 가능하다는 점이 하드웨어 월렛에 비해 실용적이다.

모바일 월렛


모바일 월렛은 데스크톱 & 웹 지갑의 모바일 형태이며, 인터넷 접속 여부에 따라 핫 월렛 or 콜드 월렛으로 작동 가능하다. 스마트폰 앱으로 다운로드 받아 사용 가능하며, 언제 어디서나 거래가 가능하다는 점이 편리하다.

하드웨어 월렛


하드웨어 월렛은 거래에 서명할 때 개인 키를 인터넷에 노출하지 않기 때문에 온라인 상태에서 자산에 엑세스하는 가장 안전한 방법이다.

멀티시그 월렛


멀티시그 월렛은 멀티시그를 통해서만 송금이 가능하다. 이더리움에서는 멀티시그 월렛을 위한 스마트 컨트랙트를 만들어 N명 중 k명이 서명해야 컨트랙트를 이행한다는 서명 제한 룰을 추가하고, 실제로 k명이 멀트시그 월렛에 트랜잭션을 보내야 해당 지갑에서 트랜잭션이 생성된다. 이러한 점은 보안이 우수하며, 실수로 송금이 일어나는 경우를 방지가능할 수 있어 좋지만, 스마트 컨트랙트 상에서 구현되기 때문에 코드의 오류나 거래소에서 일반 지갑 간에 이루어진 트랜잭션만 처리 등의 문제로 사용성이 부족하다.

  • Ex. ConsenSys, Gnosis, Argent, BitGo

비결정적 월렛 & 결정적 월렛


비결정적 월렛

비결정적 월렛은 매번 비밀 키를 무작위로 생성하는 방식의 지갑이다. 매 트랜잭션마다 새로운 주소를 위한 새로운 지갑 파일을 만들어야 하는 특징이 있으며, 관리의 측면에서 불편하다.

결정적(시드) 월렛

결정적 월렛은 하나의 시드에서 하나의 시드 키를 가지고 있으며, 이 시드 키는 비밀키를 만들기 위한 난수이다.

  • Ex. 니모닉 코드 단어(mnemonic code words)
    • 하나의 시드 키만 알고 있어도 시드키에서 파생된 모든 비밀키를 알 수 있어 편리하다.
  • Ex. HD Wallet(Hierarchical Deterministic Wallet)
    • 하나의 시드 값만 가지고 잇으면 여러 개의 주소를 쉽게 생성할 수 있는 암호화폐 지갑
    • 계층적 트리 구조로 부모 키가 연속된 자식 키를 유도할 수 있다.
      • 시드와 경로로 구성되며, BIP-32에서 제안되어 BIP-44에서 개선되었다.

니모닉(Mnemonic)

니모닉이란 결정적 지갑에서 난수르 12개의 영단어로 인코딩한 영단어 그룹으로 BIP-39에서 제안되었다. 기존의 시드 키는 숫자와 문자로 구성된 난수되어 기억하기 어려운 문제를 해결하였다.

니모닉 Wallet

니모닉 Wallet은 니모닉을 사용하여 비밀키 관리를 용이하게 해주는 암호화폐 지갑으로, 모든 비밀키를 니모닉으로 관리하기 때문에 비밀키 복구시 사용하게 된다.

니모닉 코드와 시드 생성 9단계(BIP-39)

img1

  1. 128bit 또는 256bit 길이의 난수를 생성한다.
  2. 난수를 SHA-256 알고리즘으로 해싱하고, 해시값에서 (시드 키의 길이)/32만큼을 떼어낸다. 떼어낸 값은 체크섬(오류 검사 데이터)이 된다.
  3. 체크섬을 난수의 뒤에 붙인다.
  4. 체크섬을 붙인 난수를 11bit 단위로 잘라낸다.
  5. 각 11bit의 단어를 사전에 정의된 단어로 치환한다.
  6. 각 11bit의 순서를 유지하여 일련의 니모닉 코드를 만든다. - 128~256bit

img2

  1. 6에서 생성한 엔트로피와 키 스트레칭 함수 PBKDF2를 사용하여 더 긴(512bit) 시드를 파생시키 위해 키 스트레칭 첫번째 인자는 니모닉 코드로,
  2. 두번째 인자는 솔트로, 니모닉과 선택적으로 사용자가 지정한 암호문을 연결하여 구성한다.
  3. PBKDF2는 최종 출력으로 512비트 값을 만드는 HMAC-SHA512알고리즘으로, 2048해시 라운드를 사용하여 니모닉과 솔트 파라미터를 확장하여, 512bit의 Seed값을 만든다.

솔팅과 키 스트레칭


솔팅(Salting)

  • 해싱 진행 시, 동일한 입력에 대해 항상 같은 값을 출력하기 때문에 레인보우 테이블(자주 쓰이는 입력값 - 출력값 매칭 테이블)로 레인보우 공격을 당할 수 있고, 해시 함수는 연산 속도가 빠르기 때문에 무차별 대입 공격을 당할 수 있다.
  • 이에 원본 데이터에 임의의 문자열인 솔트(Salt)를 추가하여 해싱함으로써, 솔트값 또한 알아내지 못하면 해킹 우려가 없다.

키 스트레칭

  • 솔팅 방식을 여러 번 반복하는 과정으로, 솔팅의 결과값을 다시 솔트 함수의 입력값으로 하여 다시 솔팅하고, 이 과정을 반복한다.

eth-lightwallet을 활용한 mnemonic wallet 예제

본 포스팅은 코드스테이츠 BEB 과정을 수강하며 작성한 글입니다.