블록체인

[블록체인 기술 1] 블록체인 지갑 (+ 영지식 증명)

dlwltn98 2023. 5. 5. 00:50

핫 월렛 (Hot Wallet) - 온라인

 - 네트워크에 연결되어 있어 실시간으로 거래 정보를 주고 받을 수 있음

 - 개인 키가 온라인에 노출되기에 해킹 등의 보안 문제에 취약함 

 - 암호화폐 거래를 자주 사용하는 경우 사용하는 것이 바람직

 

핫 월렛의 종류

1. 웹 월렛

  - 웹 기반으로 호스팅되는 지갑 

  - 인터넷 브라우저를 통해 접속하는 지갑으

    ** 브라우저 확장 프로그램이나 웹 사이트 형태로 제공됨

  - 항상 인터넷에 노출되어 있어 보안에 가장 취약 / 즉시 거래가 가능하기에 가장 실용적

  - 종류 : 메타마스크(MetaMask), 카이카스(Kaikas) 등

 

2. 데스크톱(PC) 월렛

  - OS에 다운로드하여 작동할 수 있는 앱

  - 인터넷 접속 여부에 따라 핫 월렛이나 콜드 월렛으로 작동함 

  - 웹 월렛보단 불편 / 필요시 인터넷에 연결하여 거래 가능 (콜드 월렛에 비해선 실용적)

 

3. 모바일 월렛

  - 데스크톱 & 웹 지갑의 모바일 형태 

  - 인터넷 접속 여부에 따라 핫 월렛이나 콜드 월렛으로 작동함 

  - 스마트폰 앱으로 다운로드해 사용 가능 / 어디서나 거래 가능하다는 점에서 편리

  - 종류 : 클립(Klip)

 

콜드 월렛 (Cold Wallet) - 오프라인

 - 지갑의 개인키를 오프라인으로 보관하는 지갑

 - 오프라인 상태에 있기때문에 보안 측면에서 안전

 - 오프라인이므로 실시간 거래 불가능 

 - 암호 화폐를 안전하게 보관하는 것이 목적인 경우 사용하는 것이 바람직

 

콜드 월렛의 종류

1. 페이퍼 월렛 (Paper Wallet)

  - 지갑 주소를 만들고 주소를 종이에 써서 보관하는 형식

    ** 암호화폐의 개인 키를 종이에 인쇄한 것 

  - 온라인 해킹등의 위협에선 안전하지만 종이를 잃어버릴 위험이 있음

 

2. 하드웨어 월렛 (Hardware Wallet)

  - 개인 키를 USB나 카드에 보관하는 방식

  - 하드웨어 지갑을 다른 장치에 연결 → SW를 통해 자신의 잔고를 확인하거나 트랜잭션 생성 가능 

 

 

Smart Contract Wallet 

 - 스마트 컨트랙트를 이용하는 지갑 

 - CA(Contract Account)를 이용하여 컨트랙트 코드로 자산을 관리하는 월렛

  ** CA에 있는 컨트랙트 코드를 이용해 누가 어떤 조건에서 자산에 접근할 수 있는지 프로그래밍화 가능 

 - 개인 키가 아닌 스마트 컨트랙트로 관리하기 때문에, 기존의 단일키를 사용하는 EOA 기반 월렛보다 더 높은 수준의 보안, 유연성, 편의성을 제공함 

 

* 이더리움 EOA (Externally Owned Account)

  - 이더리움 블록체인 상에서 사용되는 개인 지갑 계정

  - 이더리움 네트워크 상에서 트랜잭션을 생성하고 서명하여 블록체인 상의 계정으로 이동시키는 역할 

  - 이더리움에서 사용자는 EOA로 자신의 자산을 관리함 

  - 코드(스마트 컨트랙트)를 계정에 담을 수 없기 때문에 자산 관리 측면에서 기능이 제한적임 

 

* 사용자는 스마트 컨트랙트 코드를 통해 다른 dApp과 상호작용 가능 

 

 

멀티 시그 월렛 (Multi-Signature Wallet)

 - 여러개의 개인 키를 사용해 작동하는 지갑 

 - 이더리움과 같은 블록체인에서 자산을 보관하고 관리할 수 있음

 - 멀티 시그(Multi-Sig)를 통해서만 송금 가능 

 - 하나의 지갑에 N명의 사용자가 지갑에 대한 소유 권한을 가지고, 해당 지갑에서 트랜잭션을 만들기 위해서는 N명 중 k명이 트랜잭션에 서명해야 함

 - 일반 지갑에 비해 보안이 우수하고 송금 실수 방지 가능 

 - 스마트 컨트랙트 상에서 구현되기 때문에 사용성이 떨어짐, 오류로 인한 문제 발생 가능 

 - 종류 : ConsenSys, Gnosis, Argent, BitGo 등 

 

기존의 핫 월렛과 콜드 월렛은 하나의 개인 키를 사용함 → 키가 노출될 경우 탈취자가 자산에 접근하기 쉽다는 단점이 있음 이러한 단점을 보안한 것 멀티 시그 월렛

 

* 이더리움상 구현 방법

  - 멀티 시그 월렛을 위한 스마트 컨트랙트 생성

  - N명 중 k명이 서명해야 컨트랙트를 이행한다는 서명 제한 룰 추가

  - 실제로 k명이 멀티 시그 월렛 컨트랙트에 트랜잭션을 보내야 함 

 

 

비결정적 월렛 

 - 매번 개인키를 무작위로 생성하는 방식의 지갑 

 - 데이터를 자주 백업해야 하므로 관리가 불편함 

  ** 실수로 지갑 데이터를 분실할 겨우 해당 비밀키를 통해 생성된 주소에 들어있던 코인과 해당 주소로 생성한 스마트 컨트랙트에 접근 못함 

 

결정적(시드) 월렛

 - 비결정적 월렛의 불편함을 해결하는 방식의 지갑 

 - 하나의 시드와 시드에서 파생된 시드키를 가지고 있음

  ** 시드키는 비밀키를 만들기 위한 난수로 사용됨 

  ** 비밀키는 시드키를 인덱스(또는 다른 데이터)와 결합하여 만듦

 - 생성될 비밀키의 인덱스와 시드키만 알고 있다면 새로운 비밀키가 어떤 값을 가질지 알 수 있음 

  ** 시드키를 통해 만들어지는 비밀키는 그 값이 미리 정해져 있다고 볼 수 있음 

  ** 하나의 시드키만 알고 있어도 시드키에서 파생된 모든 비밀키를 알 수 있음 

    → 모든 비밀키를 일일이 관리할 필요 없이 시드키 하나만 관리하면 됨 

 -  지갑 데이터가 훼손되어 비밀키를 비롯한 주소를 잃어버려도 시드키를 이용해 복구 가능 

 

 

HD Wallet (Hierarchical Deterministic Wallet, 계층적 결정 지갑)

 - 결정적 지갑의 한 종류 

 - BIP - 32 에서 제안되고 BIP - 44에서 개선된 비트코인 표준 

 - 단일 시드(seed)로부터 파생되는 계층적인 개인 키를 생성하며, 이를 통해 사용자는 단일 시드(seed)만으로 다수의 계정과 개인 키를 관리 가능 

 

** BIP - 32 : HD 지갑을 처음 제안한 비트코인 표준 

** BIP - 44 : 여러 계정이 여러 목적에 맞게 지갑을 사용할 수 있는 HD 지갑 구조 제안 

 

계층적 지갑

 - 시드에서 시드키를 거쳐 비밀키 생성, 비밀키로부터 주소를 생성 

  ⇒ 트리구조로 이루어져 있음 

 - HD 월렛이 주소를 만들고 관리할 떼 트리 구조를 사용함 

 

* 계층적 + 결정적 

  → 트리구조에서 부모키는 인덱스에 따라 연속된 자식키를 유도할 수 있음

  → 각각의 자식키는 손자키를 유도할 수 있음

    ** 인덱스 - 트리구조의 루트부터 현재 노드까지의 경로 

 

* 트리구조

  - 대표적인 계층적 자료 구조

  - 상위 노드에서 하위 노드로 마치 나무의 모양처럼 뻗어져 나감

 

 

HD Wallet 계정 생성 주요 개념

1. Seed

  - 암호학적으로 안전한 무작위 숫자에서 니모닉 연상 단어를 생성

  - 니모닉 연상 단어에서 HD 지갑의 시드 생성 

    ⇒ 모든 키는 루트 시드에서 결정적으로 파생되었음 

  - 니모닉 연상 단어만 알고 있다면 언제 어디서든 HD 지갑들을 백업하거나 복원 가능 

 

2. Path

  - HD Wallet 키의 경로(path)에는 규칙을 사용하여 식별함 

  - 각 트리 레벨은 슬래시(/) 문자로 구분 

  - 마스터 비밀키로부터 파생된 키 = m 으로 시작

  - 마스터 공개키로부터 파생된 키 = M 으로 시작

    ** m/0 : 마스터 비밀키의 첫 번째 자식 비밀키

    ** M/0 : 첫 번째 자식 공개키

    ** m/0/1 : 마스터 비밀키의 첫번째 자식의 두번째 자식 비밀키 (마스터키의 손자키)

 

 

* DRBG (Deterministic Random Bits Generate)

 - 컴퓨터로 만든 난수를 해시 함수를 통해 진짜 난수로 만드는 알고리즘 

    ** 컴퓨터가 만들어낸 난수는 예측이 가능한 가짜 난수라 안전하지 않기 때문에컴퓨터가 만들어낸 난수를 해싱한 값을 사용함

 - HD 지갑에서는 시드키를 생성할 때 DRBG를 사용함

 

* HMAC-SHA512

 - 부모의 키 값을 패딩하여 XOR연산을 하고, 그 결과를 해싱함

 - 마스터 키는 시드키에 HMAC-SHA512를 연산한 결과값

 -  HD 지갑에서는 부모키를 통해 자식키를 확인할 수 있어야 하므로 HMAC 방식을 사용하여 자식키를 만듦

 

 

니모닉 (Mnemonic)

 - 결정적 지갑에서 난수를 12개의 영단어로 인코딩한 그룹 

 - 난수를 시드키로 변환할 때, 중간 과정에 12개 혹은 24개의 랜덤한 영단어로 변환하여 사용자가 지갑을 관리하기 쉽게 도와주는 것 

 - 지갑을 사용하는 사람 관점에서 지갑을 관리하기 편하게 해주는 기능 

 

시드키를 생성하기 위해서 

1. 난수를 해싱하여 니모닉 코드 단어 생성

2. 니모닉 코드 단어를 다시 암호화하여 시드 키 생성

  ⇒ 니모닉 단어만 알고 있으면 시드 키를 도출해 낼 수 있음 

  ⇒ 니모닉 단어로 키를 관리함 

 

 

니모닉 월렛

 - 니모닉 연상 단어를 사용한 지갑 

 - 시드 키를 생성하는 데 사용하는 니모닉 연상 단어를 사용해 지갑 관리 

 - 비밀 키를 더 쉽게 관리할 수 있게 해줌 

 

* 암호화폐 지갑 

  - 코인/토큰을 사용할 수 있는 비밀키를 관리하는 일종의 키 관리 시스템

  - 암호화폐 지갑 자체에 코인/토큰이 들어 있는게 아님 

 

니모닉 코드는 해시 함수를 재귀적으로 반복하는 키 스트레칭 과정을 거쳐 마스터 시드를 생성함

  ⇒ 마스터 시드는 HD 지갑 주소 생성의 바탕이 됨 

 

 

Salting

 - 원본 데이터에 임의의 문자열인 솔트(Salt)를 추가하여 해싱하는 방식

 - 솔팅 방식으로 비밀번호를 암호화하여 DB에 보관하면, 해커가 솔트가 뭔지 알지 못하는 이상 레인보우 테이블의 해시값과 DB의 해시값을 비교해도 원본 비밀번호를 알 수 없음 

 

** 해시함수는 동일한 입력에 대해서 항상 같은 값을 출력 → 다른 사용자와 비밀번호가 같을 경우 해시값도 같음 

** 해커들은 자주 쓰이는 비밀번호와 비밀번호의 해시값을 가지고 있다가, 가진 값과 DB에 저장된 해싱된 비밀번호를 비교하는 레인보우 테이블 공격을 할 수 있음 

    ⇒ 해시값을 비교해도 원본 비밀번호를 알 수 없도록 솔트를 사용 

 

Key Stretching

 - Salting 방식을 여러번 반복 하는 것 

 - 솔팅의 결과값을 다시 솔트 함수의 입력값으로 하여 다시 솔팅 하는 과정을 반복 

 - 사용자가 입력한 비밀번호는 예측하기 쉬운 경우가 많은데, 키 스트레칭은 이러한 예측을 어렵게 함

 

 

 

영지식증명 (Zero-knowledge Proof)

 - 거래 상대방에게 어떠한 정보도 제공하지 않은 채, 자신이 해당 정보를 가지고 있다는 사실을 증명하는 방법

 - 고객의 신원정보를 확인해야 하는 의무와 동시에 개인정보보호법에 위반되지 않도록 처리 및 관리를 해야하는 기업 사이에서 새롭게 대두되고 있는 기술 

  ** Wifi 무선랜 보안 방식인 WPA-3에 활용

  ** 블록체인에서 레이어2 솔루션인 zk 롤업에서 유효성 증명에 활용

 

* 암호화폐의 익명성을 악용해 범죄에 악용하는 사례가 다양함 

  - 비트코인은 기본적으로 거래 내역이 지갑에 남음

  - 익명성 코인은 영지식 증명을 통해 거래내역 자체를 숨길 수 있음

 

* 익명성 코인(프라이버시 코인, 다크 코인)

  - 개인 정보를 보호해 주며, 거래내역이 남는 것이 아니라 잔고가 증가하고 줄어든 흔적만 찾을 수 있음 

 

영지식 증명의 3가지 조건

1. 완전성 (Completeness)

  - 어떤 조건이 참이라면 신뢰할 수 있는 검증자는 신뢰할 수 있는 증명자에 의해 이 사실을 납득할 수 있어야 함 

2. 건전성 (Soundness)

  - 어떤 조건이 거짓이라면 신뢰할 수 없는 증명자는 거짓말을 통해 검증자에게 조건이 참임을 절대 납득시킬 수 없음

3. 영지식성 (Zero-knowledge)

  - 어떤 조건이 참일 때, 검증자는 이 조건이 참이라는 사실 이외의 아무 정보를 알 수 없음

 

 

 

출처 : 코드스테이츠 BEB