키스토어
키스토어(Key Store)란 암호화폐 지갑을 사용하기 위한 프라이빗 키(private key)를 비밀번호로 암호화한 텍스트 또는 파일이다.
특징
- 키스토어는 텍스트나 파일을 보관하고 있다가, 다른 지갑에 불러올 때 이를 입력한 후 알맞은 비밀번호를 입력하면, 복호화되어 프라이빗 키를 도출할 수 있게 된다.
- 한 번 암호화된 파일이므로 키스토어 파일은 컴퓨터나 메모장 등에 보관하기 안전하다. 단, 비밀번호가 너무 쉬우면, 무차별대입 공격으로 쉽게 뚫릴 수 있다. 최소 8자, 권장 12자 이상의 어려운 비밀번호 사용을 권장한다.[1]
- 사용자 지정 키스토어
- 사용자 지정 키 스토어를 삭제하면 AWS KMS가 AWS CloudHSM 클러스터 연결에 대한 정보를 포함해 사용자 지정 키 스토어에 대한 모든 메타데이터를 KMS에서 삭제한다. 이 작업은 AWS CloudHSM 클러스터와 그 HSM, 또는 그 사용자에게 영향을 미치지 않으며, 사용자는 지정된 클러스터에 연결된 새로운 사용자 지정 키 스토어를 생성할 수 있지만, 삭제 작업의 실행을 취소할 수는 없다. AWS KMS에서 연결 해제되고 어떠한 고객 마스터 키(CMK)도 포함하고 있지 않은 사용자 지정 키 스토어만 삭제할 수 있고, 사용자 지정 키 스토어를 삭제하기 전에 수행한다. 모든 암호화 작업에서 키 스토어의 CMK를 전혀 사용할 필요가 없는지 확인한 다음, 키 스토어에서 모든 CMK의 삭제를 예약한다. 모든 CMK가 삭제되었는지 확인하면, AWS KMS에서 사용자 지정 키 스토어의 연결을 해제한다. 사용자 지정 키 스토어를 삭제하는 대신, 사용자 지정 키 스토어의 연결이 해제되어 있는 동안 사용자 지정 키 스토어와 그 고객 마스터 키(CMK)를 관리할 수 있으나 사용자 지정 키 스토어에서 CMK를 생성 또는 사용할 수 없으며, 언제든지 사용자 지정 키 스토어를 다시 연결할 수 있다. AWS 계정의 모든 리전에서 모든 사용자 지정 키 스토어를 삭제했고 추가로 생성할 계획이 없는 경우에는 AWS KMS가 사용자 지정 키 스토어에서 사용하는 서비스 연결 역할을 삭제해야 한다.
- 콘솔 : AWS Management 콘솔에서 사용자 지정 키 스토어를 삭제하려면 사용자 지정 키 스토어 페이지에서 사용자 지정 키 스토어를 선택하고, AWS Management 콘솔에 로그인한 후 https://console.aws.amazon.com/kms에서 AWS Key Management Service(AWS KMS) 콘솔을 연다. AWS 리전을 변경하려면 페이지의 오른쪽 위 모서리에 있는 리전 선택기를 사용하고, 탐색 창에서 사용자 지정 키 스토어를 선택했다면, 제거하고 싶은 사용자 지정 키 스토어를 나타내는 열을 찾는다. 사용자 지정 키 스토어의 상태가 연결 해제 됐으면 사용자 지정 키 스토어를 삭제하기 전에 사용자 지정 키 스토어의 연결 해제가 필요하다. 키 스토어 작업 메뉴에서 사용자 지정 키 스토어 삭제를 선택하면, 작업이 완료되면 성공 메시지가 나타나고, 사용자 지정 키스토어는 더 이상 사용자 지정 키스토어 목록에 나타나지 않는다. 작업이 실패하면 오류 메시지가 나타나서 문제를 설명하고 이를 수정할 수 있는 방법에 대한 도움말을 제공한다.
- API : 사용자 지정 키 스토어를 삭제하려면 DeleteCustomKeyStore 작업을 사용하여, 작업이 성공하지 않으면 AWS KMS가 HTTP 200 응답 및 속성을 포함하지 않는 JSON 객체를 반환하고, 시작하려면 사용자 지정 키 스토어에 어떤 AWS KMS 고객 마스터 키(CMK)도 포함되어 있지 않은지 확인해야 한다. CMK를 포함하는 사용자 지정 키 스토어를 삭제할 수 없으며, 첫 번째 예제 명령은 ListKeys 및 DescribeKey를 사용하여 가상 키스토어 ID가 cks-1234567890abcdef0인 사용자 지정 키 스토어에서 AWS KMS 고객 마스터 키를 검색한다. 이 경우, 명령은 어떤 CMK도 반환하지 않으며, ScheduleKeyDeletion 작업을 사용하여 각 CMK에 대한 삭제를 예약한다.
for key in $(aws kms list-keys --query 'Keys[*].KeyId' --output text) ; do aws kms describe-key --key-id $key | grep '"CustomKeyStoreId": "cks-1234567890abcdef0"' --context 100; done
- 그런 다음, 사용자 지정 키 스토어의 연결을 해제하면, 예제 명령은 DisconnectCustomKeyStore 작업을 사용하여 AWS CloudHSM 클러스터에서 사용자 지정 키 스토어의 연결을 해제하고, 이 명령을 실행하기 앞서 예제에 나온 사용자 지정 키 스토어 ID를 유효한 ID로 대체한다.
$ aws kms disconnect-custom-key-store --custom-key-store-id cks-1234567890abcdef0
- 사용자 지정 키 스토어가 연결 해제된 후에는 DeleteCustomKeyStore 작업을 사용하여 이를 삭제할 수 있다.
$ aws kms delete-custom-key-store --custom-key-store-id cks-1234567890abcdef0
프라이빗 키
- 암호화폐 지갑은 블록체인 네트워크에서 사용자들의 코인이 저장되는 공간이다. 모든 지갑은 고유한 주소가 존재하며, 이 주소와 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, 〈키스토어가 무엇인가요?〉, 《미디엄》
같이 보기