개인 키(Private Key)와 공개 키(Public Key)
블록체인에서는 PKI(Public Key Infrastructure, 공개 키 기반 구조)를 이용해 사용자를 식별합니다. PKI는 개인 키(Private Key)와 공개 키(Public Key)를 쌍(Pair)으로 생성해 암호화 및 전자 서명에 사용하는 기술인데요, 개인 키를 이용해 암호화하면 대응하는 공개 키를 이용해서만 복호화할 수 있고 공개 키를 이용해 암호화하면 대응하는 개인 키를 이용해서만 복호화할 수 있는 것이 특징입니다. 이때 공개 키는 아무에게나 공개되는데, 개인 키로 암호화(서명)한 것을 누구든 공개 키로 복호화(서명 검증)하여 특정 트랜잭션(Transaction, TX)이 누구에 의해 서명 및 실행되었는지 확인할 수 있습니다. PKI는 이러한 특성에 기반해 블록체인의 사용자 식별 방법으로 사용되고 있습니다.
트랜잭션을 개인 키로 서명하면 블록체인은 쌍으로 생성된 공개 키를 이용해 이를 검증하며, 공개 키로부터 생성한 지갑 주소의 잔액을 변화시킬 수 있는 권한을 부여합니다. 즉, 개인 키를 소유하고 있으면 해당하는 지갑 주소의 자산을 관리할 수 있게 되는 것이죠.
PKI(Public Key Infrastructure)와 블록체인
PKI의 또 다른 특징은 개인 키에서 공개 키를 생성해 낼 수는 있지만 공개 키에서 개인 키를 생성하거나 유추할 수는 없다는 것입니다. 이에 공개 키가 공개되더라도 개인 키를 알 수 없어, 안전한 암호 통신 또는 서명 검증이 가능한 구조입니다.
최초 생성 시를 제외하고 개인 키를 다시 생성하거나 어떤 식으로도 복원할 수 없다는 점은 보안상 굉장히 유리한 특징인 동시에 큰 단점이기도 합니다. 살면서 무언가를 전혀 잃어버리지 않는다는 것은 현실적으로 불가능하기 때문이죠. 따라서 개인 키의 분실에 대비한 백업 및 복구 시스템은 매우 중요합니다.
블록체인 이전부터 사용되어 온 PKI 기술의 가장 유명한 적용 사례는 바로 공동인증서(구 공인인증서)입니다. 공동인증서는 공개 키를 포함하고 있는 인증서로, 해당 공개 키에 대응하는 개인 키를 USB 메모리, 외장하드 등 별도의 안전한 저장 장치에 보관하라는 권고가 이루어지고 있습니다. PKI 기술 자체는 안전하지만 개인 키 저장소에 대한 보안을 위해 가상 키보드, 백신, 위변조 탐지와 같은 보안 솔루션 설치를 의무화하고 있으며, 이 때문에 공동인증서 사용을 위해 여러 프로그램을 설치해야만 하는 번거로움을 누구나 한 번쯤은 경험한 바 있을 것입니다. 이처럼 개인 키를 저장해 추후 복원하는 것은 단순한 일이 아닙니다.
특히 제3의 신뢰 기관 제거가 궁극의 목표인 블록체인에서 PKI의 개인 키 관리를 위해 별도의 신뢰 기관을 두는 것은 앞뒤가 맞지 않습니다. 어떤 식으로든 개인이 자신의 개인 키를 관리할 수 있도록 함은 물론, 항상 가용한 상태여야 하겠죠. 일반적으로 블록체인에서는 개인 키의 관리를 개인에게 일임하며, 종이나 USB 메모리에 개인 키 또는 *니모닉(Mnemonic)을 기록해 두거나 HSM(Hardware Security Module, 암호화 키를 안전하게 보관하기 위한 전용 하드웨어 모듈)을 사용하도록 권고하고 있습니다. 하지만 이러한 방법들에도 종이나 HSM 등의 분실 위험이 존재하므로 항상 가용하다고 보기는 어렵습니다. 최선은 개인 키를 클라우드에 안전하게 보관하는 방법일 텐데요, 클라우드 역시 항상 해킹의 위협에 노출되어 있어 위험이 따르기는 마찬가지입니다.
* 니모닉(Mnemonic)
개인 키 분실 시 지갑 복구를 위해 기억하기 어려운 개인 키를 사람이 인지할 수 있는 수준의 단어로 표현하게 한 것으로, 12개의 단어로 이루어진 문자열. 해당 12개의 단어로부터 개인 키를 생성해 낼 수 있기 때문에 니모닉의 보안은 개인 키와 동일한 수준으로 지켜져야 함.
비밀 공유(*Secret Sharing) 기술
그렇다면 클라우드를 사용하되 개인 키를 여러 개로 분해하여 여러 곳에 보관하면 어떨까요? 가령 현실 세계에서 열쇠 하나를 여러 개로 조각내어 각각을 여러 은행 금고에 나눠 넣어 두면, 도둑이 몇몇 은행 금고에서 열쇠 조각을 훔치더라도 열쇠 전체를 복원할 수는 없어 조금 더 안전한 보관이 가능할 것입니다. 이때 열쇠의 소유자인 개인은 각 은행 금고에서 모든 열쇠 조각을 찾을 수 있으므로 은행이 문을 닫지 않는 한 열쇠를 복원할 수 있습니다. 그러나 이 방법의 단점은 은행이 문을 닫을 경우 영원히 열쇠를 복원할 수 없게 된다는 것입니다. 따라서 일부 은행이 문을 닫더라도 열쇠를 복원할 수 있는 방안에 대해 추가적인 고민이 필요합니다.
이러한 아이디어에서 출발한 것이 바로 비밀 공유(Secret Sharing) 기술입니다. 비밀 공유 기술은 기본적으로 비밀 정보(개인 키)를 여러 개의 조각으로 나눌 수 있도록 하고, 모은 조각이 임계치를 넘어서면 해당 비밀 정보를 복원할 수 있도록 하는 기술입니다. 이것이 가능한 이유는 열쇠를 단순히 조각내는 것이 아니라 열쇠의 형상을 다시 만들 수 있는 여러 개의 단서(Shared Clues)를 생성하는 것이기 때문입니다. ‘열쇠의 길이는 3㎝이다.’, ‘열쇠의 홈은 4개이다.’ 등과 같이 열쇠 복원 시 필요한 단서를 여러 개 만들고, 이 중 몇 가지 이상을 알고 있을 시 열쇠를 다시 만들 수 있도록 하는 것이죠.
비밀 공유(Secret Sharing) 알고리즘
다행히 분산 저장이 필요한 비밀 정보는 디지털 정보로서, 컴퓨터를 통해 다양한 연산이 가능하기에 이러한 단서의 생성을 수식으로 일반화할 수 있습니다. 우선 비밀 정보(S)를 포함한 임의의 t(Threshold)차 방정식을 만들고, n개의 값(Sn)을 생성해 각기 다른 저장소에 저장합니다. t차 방정식이므로, t개의 값(Sn)을 저장소로부터 받아올 수 있으면 해당 방정식의 해를 구할 수 있어 비밀 정보(S) 계산이 가능해집니다.
조금 더 자세히 설명하자면 비밀 정보(S)를 n개로 나누어(=n개의 단서를 만들어) n개의 저장소에 저장하고, 그중 t개를 획득하면 비밀 정보(S)를 복원할 수 있다는 것입니다. 일단 여러 저장소에 나누어 저장하기 때문에 그만큼 해킹 난이도가 높아집니다. 또한 n개로 나뉜 조각은 비밀 정보(S)를 물리적으로 조각낸 데이터가 아니라 t차 방정식 계산을 가능하게 하는 값(단서)이기에, t개가 아닌 몇몇 조각으로부터 비밀 정보(S)를 유추하는 것은 불가능합니다. 즉, 일부 클라우드 저장소가 해킹되거나 장애를 일으키는 상황이라도 t개의 저장소가 정상적으로 동작한다면 비밀 정보(S)를 복원할 수 있다는 것이죠. 이를 통해 높은 보안성과 가용성이 동시에 보장됩니다.
* 참고: https://en.wikipedia.org/wiki/Secret_sharing
아이콘루프 볼트(Vault)
아이콘루프는 비밀 공유 기술을 이용한 개인 키 백업 시스템 볼트(Vault)를 제공하고 있습니다. 볼트는 사용자 인증, 암호화 키(Recovery Key) 관리, 저장소(Storage) 등록 및 관리 등을 담당하는 Vault Manager, 비밀 정보 조각들을 보관하는 저장소들, 그리고 Vault Manager 및 저장소 정보를 공유하는 스마트 컨트랙트(Smart Contract)로 구성되며, 이를 클라이언트(Client)에서 잘 활용할 수 있도록 SDK(Software Development Kit, 소프트웨어 개발 키트)를 함께 제공합니다. 저장소는 각기 다른 주체에 의해 운영되며, 개별적인 사용자 인증 방식을 도입할 수 있습니다. 따라서, 저장소 개수가 많아지고 인증 방식이 다양해질수록 보안성은 높아집니다.
아이콘루프 볼트(Vault) 구조
볼트 비밀 정보를 위한 단서들을 생성하는 비밀 공유 기술은 SDK를 통해 제공합니다. 이는 비밀 공유 기술을 이용해 비밀 정보를 n개의 단서들로 나누고 반대로 t개의 단서들로부터 비밀 정보를 복원하는 기능인데요, 비밀 정보와 이를 위한 단서들이 한꺼번에 외부 서버로 전송되지는 않습니다. 볼트의 클라이언트(e.g. 블록체인 지갑)는 이렇게 생성된 단서들을 각각의 저장소로 전달, 사용자 인증 후 보관할 수 있도록 합니다.
기존 비밀 공유 기술에서의 이슈
볼트에서는 n개로 나뉜 단서들을 암호화하여 저장소에 보관하기를 권고합니다. n개로 나뉜 단서들이 저장소 서버로 전송되는 순간 네트워크상에서 유출될 수도 있고, 저장소 모두가 담합할 가능성도 존재하기 때문이죠. 이때 사용되는 암호화 키 역시 별도 백업이 필요한 비밀 정보이므로 관리의 대상이 되어야 합니다. 볼트에서는 암호화 키를 Vault Manager에 저장하도록 하되, Vault Manager의 장애에 대비하고자 암호화 키에도 비밀 공유 기술을 적용하여 각 저장소에 분산 저장되도록 하고 있습니다.
볼트는 n-t Threshold Secret Sharing 알고리즘을 기반으로, 개인 키를 n개로 나누어 저장한 뒤 이 중 t개를 획득하면 개인 키 복원이 가능하도록 지원합니다. 몇 개의 저장소가 장애를 일으켜도 t개 이상의 저장소만 운영 중이면 개인 키를 복원할 수 있어 가용성이 높으며, t개 이상의 저장소를 해킹해 단서들을 획득해야만 개인 키 탈취가 가능하므로 보안성 또한 우수합니다. 뿐만 아니라 저장소에 저장된 단서들이 암호화 키의 형태로 저장되기 때문에, 모든 저장소가 담합하더라도 개인 키 복원은 사실상 불가능합니다.
암호화 키를 관리하는 Vault Manager의 중앙화에 대한 문제 제기 가능성이 있기는 하나, Vault Manager는 암호화 키만 다룰 뿐 비밀 정보를 다루지는 않기 때문에 스스로는 개인 키를 복원할 수 없습니다. 암호화 키 역시 분산되어 각 저장소에 보관되므로 Vault Manager 장애 시에도 대응이 가능합니다.
출처: https://blog.naver.com/hello_iconloop/222845727611