암호화폐 보안의 ABC
암호화폐 보안의 ABC
  • 김형중(khj-@korea.ac.kr)
  • 승인 2022.08.22 14:04
  • 댓글 0
이 기사를 공유합니다

필자: 김형중 고려대 정보보호대학원 특임교수
김형중 고려대 정보보호대학원 특임교수
김형중 고려대 정보보호대학원 특임교수

블록체인 해킹이 불가능한 건 아니지만 정말 쉽지 않다. 비트코인 블록체인이 해킹되어 일시적으로라도 심각하게 그 기능을 상실했다는 소식을 들어본 적 있나? 그런 일이 있었다면 비트코인은 벌써 소멸되었을 것이다. 좋은 블록체인에 대한 해킹은 거의 소설 속에서나 가능하다. 그런데 해킹의 범위에 대한 인식의 차이가 커서 해킹이 가능하다고 주장하는 사람이 있을 때 아니라고 반론을 펴기가 쉽지 않다. 그렇지만 암호화폐가 탈취당했다는 보도는 심심치 않게 나온다. 암호화폐 탈취 뉴스를 넓은 의미에서 블록체인 해킹으로 오해할 수 있다.

암호화폐를 탈취하는 방법은 크게 두 가지가 있다. 하나는 해커가 코인 소유자의 코인을 옮길 수 있는 개인키를 탈취하는 방법이다. 다른 하나는 해커가 코인 소유자의 지갑을 열 수 있는 비밀번호를 탈취하는 방법이 있다.

여기서 독자들은 상식으로 개인키는 무엇이며 지갑의 비밀번호는 무엇인지 먼저 알아야 한다. 그러자면 먼저 개인키라는 걸 이해해야 한다. 은행 계정에서 돈을 송금할 사람은 자신이 그 돈의 주인임을 입증하기 위해 신분증을 보여주고 사전에 등록한 도장을 찍어야 한다. 이때 창구 직원이 도장의 진위여부를 판정한다. 도장 대신 서명을 이용했다면 직원이 서명을 대조할 것이다.

암호화폐는 중개기관 없이 코인을 이동할 수 있다. 암호화폐 생태계에는 중개기관인 은행이 없다. 따라서 창구 직원이 없고 서명을 대조하여 계좌의 주인임을 증명해 줄 제3자가 없다. 그래서 도장이나 서명 대신 사용하는 게 개인키라는 것이다. 개인키의 길이는 무려 256비트나 되는 숫자이다.

개인키를 외우는 게 힘들어 평범한 숫자를 선택하면 어떤 일이 벌어질까? 다른 사람들도 골치가 마찬가지로 아파프다며 평범한 개인키를 선택할 것이다. 그렇다면 같은 개인키를 지닌 사람들의 코인은 그들 사이에서 공유재산이나 마찬가지이니 그 중 나쁜 마음을 먹은 한 사람이 몽땅 털어갈 수 있다. 평범한 개인키를 선택하는 게 패스워드로 "12345"나 "QWERTY"를 선택하는 게 더 심각한 일이다.

그래서 평범한 개인키를 선택하는 자는 누구든 그 코인을 언제고 가져가도 좋다는 의사 표시를 한 것으로 봐도 한다. 그래서 같은 개인키가 생성되지 않도록 중복을 피하려면 난수를 발생시키는 게 제일 좋다. 256비트의 난수를 생성시키면 중복되는 난수가 발생할 확률이 무척 낮다. 지금은 정말 아주 엄청나게 낮다. 그렇지만 언젠가는 중복되는 난수가 많이 생길 때가 올텐데 그때는 개인키 길이를 384비트나 512비트로 늘리면 된다.

개인키의 중복 여부를 알아볼 방법이 있다. 우선 임의로 발생시킨 개인키로 공개키를 만들고 그것으로 지갑 주소를 만든다. 이어 지갑 주소를 검색해 보면 된다. 이더스캔 같은 게 한 지갑 주소에서 다른 지갑 주소로 이더를 옮긴 기록을 추적할 수 있게 도와준다. 검색했을 때 동일한 지갑 주소가 나온다면 그 개인키가 이미 누군가에 의해 선택되었을 가능성이 무척 높다. 단정적으로 “선택되었다”고 말하지 않고 “선택되었을 가능성이 무척 높다”고 약간 물러선 데는 이유가 있다. 개인키와 공개키는 모두 길이가 256비트이지만 지갑 주소 길이는 160비트이기 때문이다.

주어진 개인키로부터 공개키를 만드는 건 쉽다. 그런데 주어진 공개키로부터 역으로 비밀키를 찾아내는 것은 어렵다. 개인키의 길이가 256비트 정도의 길이라면 어려운 게 아니고 수학적으로 불가능하다. 그래서 비밀키로부터 공개키를 만드는 함수를 일방향 함수(one-way function)라고 부른다. 언젠가는 256비트 길이의 공개키로부터 비밀키를 찾아내는 게 쉬워지는 때가 올 것이다. 그때는 키 길이를 역시 384비트나 512비트로 늘리면 된다. 양자컴퓨터가 만들어지면 지금처럼 이산대수 공개키를 만드는 게 위험하다. 그래서 수학적으로 더 안전한 키 생성 방법을 과학자들이 만들고 있다

난수를 발생시켜 만든 256비트 길이의 개인키를 기억하라는 것은 너무 가혹하다. 32비트 길이의 인터넷 주소도 기억하기 힘들어서 우리는 도메인 주소를 사용하고 있지 않은가. 다행이 도메인 네임을 입력하면 인터넷 주소를 알려주는 앱이 있다. 그래서 인터넷 주소를 잊어버려도 도메인 네임만 알면 된다. 그렇지만 인터넷 주소를 꼭 알아야만 하는 중차대한 일은 없으니 굳이 그걸 기억하려고 애를 쓸 필요가 없다.

그런데 코인을 옮기려면 반드시 개인키를 기억해야 한다. 그래서 그 복잡한 265비트의 숫자를 기억하지 않아도 되도록 도메인 네임 같은 역할을 하는 게 있다. 그게 소위 말하는 12개의 영어 단어로 구성된 니모닉(mnemonic)이란 거다. 개인키 생성기가 먼저 128비트의 난수를 생성하고 거기에 4비트의 패리티를 붙여 132비트의 난수를 만든 후 이 숫자를 근거로 12개의 영어 단어를 만들어 지갑 소유자에게 주면서 그거 반드시 기억하라고 주문한다. 지갑을 만들어 본 사람들은 영문도 모르고 12개의 영어 단어를 어딘가에 적어 두었을 것이다.

그 니모닉을 이용해 개인키가 만들어진다. 따라서 12개의 단어를 잘 보관해야 하지만 동시에 그 순서도 잘 기억해야 한다. 물론 12개의 단어만 기억하고 그 순서를 모른다 해도 비밀키를 알아낼 수 있지만 최악의 경우 무려 479,001,600번의 계산을 해야 한다. 여기서 중요한 사실 하나는 이 니모닉이 유출되면 해당 코인은 즉시 남의 손에 넘어갈 수 있다는 것이다.

아무튼 니모닉으로부터 시드(seed)가 만들어지고 그 이후 개인키가 만들어지고 개인키로부터 공개키가 생성된다. 그 공개키도 길이가 256비트인자라 길이를 좀 줄이고 보안을 높이려고 160비트 길이의 지갑 주소를 만든다. 여기서 지갑 주소는 은행의 계좌번호 같은 역할을 한다. 코인을 보낼 사람 A에게 코인을 받을 사람 B가 B의 지갑 주소를 보내면 A는 A의 비밀키로 A의 코인을 B의 지갑으로 옮긴다. C가 B에게 코인을 보내 달라며 C의 지갑 주소를 보내면 B는 B의 개인키로 B의 코인을 풀어 C의 지갑으로 보낸다. 그래서 개인키가 털리면 안된다. 개인키를 잘 지켜야 하는 이유가 여기 있다.

여기까지의 이야기는 많이 들었을 것이다. 이번에는 지갑의 비밀번호에 대해 알아보자. 그 전에 오해를 하나 풀고 넘어가야 한다. 지갑에는 코인이 들어있지 않다. 지갑에는 개인키가 들어있을 뿐이다. 코인은 만질 수도 없고 볼 수도 없는 디지털 숫자에 불과한데다 블록체인에 기록으로만 존재한다. 은행 창구 직원이 없는 암호화폐 세상에서는 지갑이 은행이고 본인이 창구 직원인 셈이다. 지갑이 중요한 이유는 거기에 개인키가 있기 때문이고 지갑이 은행인지라 지갑을 열 수 있으면 지갑 주소와 관련된 코인은 해커의 것이 되고 만다.

그런데 지갑을 열려면 지갑의 비밀번호, 즉 패스워드를 알아야 한다. 지갑 패스워드는 일반적으로 짧은데다 지갑 소유자의 주변정보를 알면 대부분 쉽게 유추할 수 있다. 그러니 어렵게 개인키를 알아내려고 용쓰지 않고 지갑 패스워드를 알아내는 게 더 빠를 수 있다. 그래서 지갑 보안을 강화하려면 패스워드를 어렵게 만들도록 해야 한다. 그런데 패스워드를 어렵게 만들면 기억하기 힘들다.

그래서 골치가 아프고 불안해서 코인을 암호화폐 거래소에 맡기는 사람들이 많다. 사실은 고객이 거래소에서 코인을 처음 구매한 후 자신의 지갑으로 그걸 옮겨야 하지만 자신의 지갑을 따로 만들어야 한다는 걸 대부분 모른다. 고객이 최초로 거래소에서 코인을 구매하려면 거래소가 먼저 고객의 개인키를 거래소가 만들고 그걸 이용해 지갑을 만든 후 그 개인키를 거래소가 보관한다. 그러니 그 코인의 주인은 고객인데 실제로는 거래소가 고객의 개인키를 보관한다.

고객이 코인을 구매하면 블록체인에서 블록체인으로 코인이 이동해야 맞다. 그런데 거래소가 그 고객의 코인을 이동시키지 않는다. 코인 주소를 바꾸려면 가스 비용이라고 하는 수수료를 지불해야 하므로 그 비용을 아끼려고 거래소 내부에서 장부상으로만 코인을 옮길 뿐 실제로는 블록체인에서 블록체인으로 코인을 옮기지 않는다. 그런데도 고객의 지갑에는 장부상으로 코인이 들어있는 것처럼 보인다.

믿을만한 거래소라면 고객의 개인키를 그 거래소가 보관한다 해서 걱정할 필요가 없다. 좋은 거래소는 코인을 착복하지는 않는다. 왜냐하면 첫째, 그 거래소는 믿을만한 거래소이고 둘째, 그 거래소가 횡령하면 그 벌이 무겁기 때문이다. 그런데 거래소 내부 직원이 거래소가 보관하고 있는 고객들의 비밀키를 이용해 불법으로 많은 코인을 탈취하는 사고는 가끔 일어난다. 이게 블록체인이 해킹을 당했다고 오해하는 근거가 된다.

법인이 많은 코인을 보유하고 있을 경우 코인 수탁(custody)서비스를 이용하는 게 바람직하다. 굳이 보관비용을 주면서까지 수탁 서비스를 이용해야 하냐는 반론이 존재할 수 있다. 그래서 수탁서비스의 필요성을 잠시 설명하고자 한다.

법인의 회계나 내부통제 관점에서 수탁서비스가 유리할 수 있다. 법인은 외부감사 또는 회계감사를 받아야 한다. 현금이라면 금고를 열어 보여주면 되지만 코인은 형체가 없으니 눈으로 직접 확인하게 할 방법이 없다. 개인키랍시고 이상한 숫자가 담긴 문서를 보여준다고 해서 그게 법인의 코인인지 확인할 길이 없기 때문이다. 코인 보유 여부를 입증하려면 감사에게 법인의 개인키로 코인을 다른 주소로 옮기는 시범을 보이는 뻘짓을 해야 한다. 그런데 수탁서비스업체로부터 수량증명서를 받아 코인 보유 여부는 물론 종류나 수량까지 간단하게 입증할 수 있다. 물론, 비용을 아끼기 위해 법인 내부에서 개인키를 관리할 수 있지만 여전히 담당직원의 비리를 감시하고 방지하는 게 쉽지 않고 앞서 설명한 뻘짓을 자주 해야 한다.

법인이 코인을 투자의 대상으로 삼아 사고 팔기를 해야 할 경우 수탁서비스를 이용하는 게 유리하다. 물론 법인이 투자 업무를 직접 수행해도 되지만 전문성이 낮고 본업과 동떨어진 인력을 투입해야 한다. 물론 한국에서는 수탁서비스업체들이 수탁 이외의 투자 영업에 선뜻 나서지 못하고 금융당국의 눈치를 보고 있다. 그런데 수탁만으로 이 업체들이 수익을 올리기 어렵고 손발이 묶인 국내 기업이 외국의 업체들과 경쟁하기 힘들다. 법인들도 보관료를 내면서 코인을 보관하는 데 주저할 수 있다. 따라서 수탁서비스업체는 법인의 코인 예치에 대한 이자를 주고 예치된 그 코인을 이용해 투자나 대출을 할 수 있어야 한다.

결론적으로 코인과 관련해서는 니모닉이나 개인키를 잘 보관해야 한다. 지갑 패스워드도 마찬가지이다. 인터넷에 가입할 때 패스워드를 복잡하게 만들어야 하는 것처럼 지갑 패스워드도 그래야 한다. 법인의 경우 수탁서비스 이용을 고려할 필요가 있다. 수탁서비스사업자는 수익성이 낮은 보관업에 그치지 말고 암호화폐를 담보로 잡고 암호화폐를 빌려주는 델리오와 같은 업종으로 가상자산사업자 신고를 하는 것도 고려할 필요가 있다.


댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 0
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.

  • ABOUT
  • CONTACT US
  • SIGN UP MEMBERSHIP
  • RSS
  • 2-D 678, National Assembly-daero, 36-gil, Yeongdeungpo-gu, Seoul, Korea (Postal code: 07257)
  • URL: www.koreaittimes.com | Editorial Div: 82-2-578- 0434 / 82-10-2442-9446 | North America Dept: 070-7008-0005 | Email: info@koreaittimes.com
  • Publisher and Editor in Chief: Monica Younsoo Chung | Chief Editorial Writer: Hyoung Joong Kim | Editor: Yeon Jin Jung
  • Juvenile Protection Manager: Choul Woong Yeon
  • Masthead: Korea IT Times. Copyright(C) Korea IT Times, All rights reserved.
ND소프트