키스토어
키스토어(Key Store)란 암호화폐 지갑을 사용하기 위한 프라이빗 키(private key)를 비밀번호로 암호화한 텍스트 또는 파일이다.
특징
- 키스토어는 텍스트나 파일을 보관하고 있다가, 다른 지갑에 불러올 때 이를 입력한 후 알맞은 비밀번호를 입력하면, 복호화되어 프라이빗 키를 도출할 수 있게 된다.
- 한 번 암호화된 파일이므로 키스토어 파일은 컴퓨터나 메모장 등에 보관하기 안전하다. 단, 비밀번호가 너무 쉬우면, 무차별대입 공격으로 쉽게 뚫릴 수 있다. 최소 8자, 권장 12자 이상의 어려운 비밀번호 사용을 권장한다.[1]
프라이빗 키
- 암호화폐 지갑은 블록체인 네트워크에서 사용자들의 코인이 저장되는 공간이다. 모든 지갑은 고유한 주소가 존재하며, 이 주소와 1:1 대응되는 비밀번호와 같은 역할을 하는 프라이빗 키가 존재한다.
- 프라이빗 키를 사용하면 해당 지갑에 접근할 수 있다. 따라서 프라이빗 키를 잘 보관해야 한다. 그런 면에서 비밀번호와 비슷하다고 생각할 수 있지만, 비밀번호와 달리 변경/복구 등이 불가능하다.
- 분실한 프라이빗 키는 어디에서도 찾을 수 없다. 하나의 지갑에는 단 하나의 프라이빗 키만이 존재한다. 프라이빗 키와 이 안의 코인 정보는 전 세계에 퍼져 있는 블록체인 네트워크에 암호화되어 저장된다.
- 암호화폐 지갑이란 이 블록체인 장부를 간편하게 보고, 프라이빗 키를 저장해 두어 입출금을 하기 위한 도구이다. 즉 은행과 다르며 코인매니저가 CM지갑을 운영하지만, 사용자의 돈과, 보유 코인정보들은 코인매니저 회사에 보관되는 것이 아닌 블록체인 네트워크에 저장되어 있고 CM 지갑은 이를 간편하게 관리할 수 있게 도와줄 뿐이다.[1]
이그드라시 키스토어
- 알고리즘
- 키 알고리즘은 ECDSA secp256k1 알고리즘을 사용하고, 개인키는 32바이트, 공개키는 65바이트, 서명값은 65바이트로 해시 알고리즘은 SHA3(KECCAK-256)을 사용하며, 32바이트 데이터를 출력한다. 주소는 공개키를 SHA3 해쉬한 값의에서 뒤로부터 20바이트를 사용하며, 주소 표기는 0x로 시작하고 20바이트 주소값을 핵사값으로 표기한다. ex) 0x056a8143fdc7416a9b8d59cb4196930588731e9b
- 키 암호화 비밀번호
- 개인키를 암호화하는 알고리즘은 AES/CBC/PKCS7Padding로 패스워드 기반 유도 알고리즘은 PBKDF2 이고, 32바이트의 대칭키(AES)가 유도된다. 패스워드 길이는 12 ~ 32자리 이고, 1자 이상의 대문자/소문자/숫자/특수기호를 각각 포함해야하며, 특수기호는 아스키(ASCII) 코드표에서 출력가능한 문자(0x21-0x2F, 0x3A-0x40, 0x5B-0x60, 0x7B-0x7E)만 허용된다.
- 키 파일 : 키파일은 IV(Initialization Vector)16바이트 와 암호화된키값 48바이트로 구성되며, 설정파일에 지정된 디렉토리와 파일명으로 저장된다.
- 암호화 구조
- 클라이언트 키스토어 : 클라이언트에서 KDF는 스크립트, Encryption은 aes-256-cbc를 기본으로 사용하며, PBKDF2의 옵션을 제공한다. 노드와 차이점 으로는 다음과 같다.
노드와 차이점 이름 클라이언트 노드 kd PBKDF2, SCRYPT(option) PBKDF2 encrypte aes - 128 - cbc, aes -256 cbc(option) aes - 128 - cbc
- KDF 알고리즘 비교
- 비크립트(bcrypt) : 비크립트는 애초부터 패스워드 저장을 목적으로 설계되었으며, 닐스 프로보스(Niels Provos)와 데이비드 마지 에르(David Mazières)가 1999년 발표했고 현재까지 사용되는 가장 강력한 해시 메커니즘 중 하나이며, 비크립트는 보안에 집착하기로 유명한 OpenBSD에서 기본 암호 인증 메커니즘으로 사용되고 있고, PBKDF2보다 더 경쟁력이 있다.
- PBKDF2 : 가장 많이 사용되는 키 도출 기능은 PBKDF2(Password-Based Key Derivation Function)이다. 해시 함수의 컨테이너인 PBKDF2는 솔트를 적용한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있고, PBKDF2는 아주 가볍고 구현하기 쉬우며, SHA와 같이 검증된 해시 함수만을 사용한다.
- 키 암호화
DIGEST = PBKDF2(PRF, Password, Salt, c, DLen) PRF: hmac-sha256 Password Salt: keccak256(password) c: 262144 DLen: 32B AES(128b), CBC, PKCS7 Padding
- 클라이언트 DB 구조
{ "accounts": [ { "address": "97995C6B3067764F1Fa3972814331df80004c9d7", "encryptedKey": "6a30d30e2d4fb11f9524214bf98d5648d888f1280b624b6148bf02f0866039e7b5c636410e960f97589a5da703c9a264", "iv": "f96fedb017c9e51f1056e6ee1a526711", "kdfParams": { "dklen": 32, "salt": "fa3a56b2c27740bd1b22a107288bcd989261b7f88e16051e4e5f043e21440524", "c": 4000, "prf": "hmac-sha256" } } ] }
- 클라이언트 키 파일 사양구조
{ "address": "d21307c7c57320dfd21fb805f18c70a1a8b2f1c5", "crypto": { "cipher": "aes-128-cbc", "cipherparams": { "iv": "2a8908f116079b804f1bc4e46181db92" }, "ciphertext": "35f62f87336d51a63047230074de88d00ab334684cbb5909a9d1c0ee37a34ac5e40e0da858f0b7d021d85e67c4066e55", "kdf": "pbkdf2", "kdfparams": { "c": 262144, "dklen": 32, "prf": "hmac-sha256", "salt": "3c1c0475ae162df514856769f0050c0a879013c31c6dff871d86d21111050298" }, "mac": "60d2321155dab16e1d73753669fdbb21ea9b65030996994559a52dcd653f51b1" } }
- 스크립트(scrypt) : 스크립트는 PBKDF2와 유사한 적응 형 키 도출 기능 이며 콜린 퍼시발(Colin Percival)이 2012년 9월 17일 설계했다. 스크립트는 다이제스트를 생성할 때 메모리 오버헤드를 갖도록 설계되어, 억지 기법 공격(brute-force attack)을 시도할 때 병렬화 처리가 매우 어렵워 PBKDF2보다 안전하다고 평가되며 비크립트에 비해 더 경쟁력이 있다. 스크립트는 보안에 아주 민감한 사용자들을 위한 백업 솔루션을 제공하는 타스냅(Tarsnap)에서도 사용하고 있으며, 여러 프로그래밍 언어의 라이브러리로 제공받을 수 있다. PBKDF2와의 차이점이라면, PBKDF2는 가벼운 알고리즘으로써 모든 기기에 구현 가능하다는 장점이 있지만, 이 장점이 역으로 공격자가 가볍게 수백, 수천개의 병렬 연산으로 무차별 대입 공격을 가능하게 할 수 있다.[2]
- 키 암호화
DIGEST = scrypt(Password, Salt, N, r, p, DLen) Password Salt: randomBytes(32B) N: 262144 r: 8 p: 1 DLen: 32B AES(512b), CBC, PKCS7 Padding
- 클라이언트 DB 구조
{ "accounts": [ { "address": "8370416C75C48f4e26B84CDD79D57f7b629E861E", "encryptedKey": "efb8a91edbd2518a64774f9074781b6d8f8bfa2ff47bba8bd31faf437f87b8f3442cdb24b80d79fca6bdb2ff1497d2fc", "iv": "8b135a3c533aeffff4babbc3052c9120", "kdfParams": { "dklen": 32, "salt": "37e9b309d6ff35df9745386df5979353541e41a1ccc84ebf5b0b78bda7e336bc", "n": 4096, "r": 8, "p": 1 } } ] }
- 클라이언트 키 파일 사양구조
{ "address": "d21307c7c57320dfd21fb805f18c70a1a8b2f1c5", "crypto": { "cipher": "aes-128-cbc", "cipherparams": { "iv": "2a8908f116079b804f1bc4e46181db92" }, "ciphertext": "35f62f87336d51a63047230074de88d00ab334684cbb5909a9d1c0ee37a34ac5e40e0da858f0b7d021d85e67c4066e55", "kdf": "pbkdf2", "kdfparams": { "n": 4086, "r": "8" "p": 1, }, "mac": "60d2321155dab16e1d73753669fdbb21ea9b65030996994559a52dcd653f51b1" } }
각주
- ↑ 1.0 1.1 〈키스토어가 무엇인가요?〉, 《미디엄》
- ↑ 이그드라시 공식 홈페이지 - https://www.notion.so/Key-store-f2a72659951940769756185be7f7aba9
참고자료
- 이그드라시 공식 홈페이지 - https://www.notion.so/Key-store-f2a72659951940769756185be7f7aba9
- CoinManager Dev Team, 〈키스토어가 무엇인가요?〉, 《미디엄》
같이 보기