암호화폐 보안(1) — 왜 암호화폐 지갑이라고 하나요?

Liam
StealthSolution
Published in
5 min readMay 13, 2022

안녕하세요 리암입니다. 오랜만에 돌아왔습니다.

(아 물론 그동안에 올라온 글들을 전부 검토하긴 했습니다^^)

오랜만에 직접 작성하는 포스팅인만큼 알찬 내용을 준비했는데요 항상 논쟁의 중심에 있는 블록체인과 암호화폐의 보안에 대해서 알아보도록 하죠!

본격적인 블록체인에서의 보안을 얘기하기 전에… 물론 이 글을 읽고 계신분들은 전부 알고 계시겠지만 혹시 진짜 혹시 모르시는 분들이 계실 수도 있어 해킹의 주된 목표가 되는 암호화폐 지갑에 대하 설명만 하고 넘어가겠습니다.

| 암호화폐에서의 지갑의 의미

‘지갑’하면 어떤 느낌이 드시나요? 우리가 일상생활에서 사용하는 ‘지갑’이란 화폐, 신용카드, 신분증 등을 넣어 다니는 물건입니다. 블록체인에서도 지갑이 있습니다. ‘암호화폐 지갑’이죠.. 원래 지갑의 의미에 따르면 ‘암호화폐 지갑’이란, 암호화폐를 보관하고 넣어 다니는 지갑이라고 생각할 수 있습니다. 하지만, 실제로 블록체인에서 사용하는 ‘암호화폐 지갑’은 블록체인 분산 원장에 기록되는 거래 트랜잭션 데이터를 생성하고 서명하는 일에 사용되는 개인키(비밀키, 비공개키)를 보관하고 관리하기 위한 도구이며 이 지갑 안에는 암호화폐가 1도 들어있지 않습니다.

| 왜 지갑이 중요하나요?

암호화폐가 실제로 들어있지도 않은데 왜 맨날 블록체인 보안 하면은 지갑을 보호해라! 라고 할까요? 그 이유는 개인키를 가지고 있기 때문입니다. 이 개인키는 블록체인에 기록되어 있는 내 자산(비트코인의 경우 내 키와 연결된 주소의 UTXO 합, 이더리움이라면 내 키와 연결된 계좌 잔고 등)의 소유권을 주장할 수 있는 유일한 수단입니다! 아마 많이들 들어보셨을거에요,, 비밀번호를 까먹어서 수백억 이상의 비트코인을 찾을 수가 없다!! 이게 다 개인키 사용에 필요한 비밀번호를 까먹어서 그렇습니다.

| 개인키, 공개키 그리고 주소

일반적으로 우리가 흔히 말하는 개인키, 공개키의 의미는 아래와 같습니다.

▶ 공개키(Public Key) : 누구에게나 공개가 가능한 공개키

▶ 개인키(Private Key) : 자신만이 갖고 있는 비공개키

공개키로 암호화를 하면 데이터 보안(공개키 암호화)에 중점을 두고, 개인키로 암호화(전자서명)를 하면 인증 과정에 중점을 둔다라고 쉽게 말할 수 있겠네요!!

그런데 오늘 우리는 블록체인과 암호화폐에 대해서 말하고 있죠? 사실, 블록체인과 암호화폐에서도 의미는 다르지 않습니다. 단지 기존에 사용하던 알고리즘과 다른 방식으로 생성합니다.

▶ 공개키

비트코인과 이더리움에서는 ECDSA(Elliptic Curve Digital Signature Algorithm)의 타원 곡선 함수에 개인키 값을 대입하여 공개 키를 얻습니다. 이 때, 생성되는 공개키의 형식은 비압축형, 압축형으로 나눌 수 있죠.

  • 비압축형 : 타원 곡선 상 한 쌍의 좌표 (x,y)로 생성된 공개키에서 각 좌표의 값은 각각 256비트의 숫자로 표현합니다. 이 좌표의 x값과 y값을 이어 붙인 형식을 비압축형 공개키라고 하며 이 경우 다른 형식의 공개키와 구분하기 위해 값 앞에 0x04를 추가합니다.
  • 압축형 : 키를 표현하기 위해 총 520비트의 저장 공간이 필요한 비압축형의 저장 공간을 줄이기 위해 사용하는 방식입니다. 압축형 공개키는 x값으로만 공개키를 표현합니다. y값은 생략하는데, y값은 특정한 수식을 통해 도출할 수 있기 때문입니다. 단, 수식에 값을 대입하면 2개의 y값이 도출되는데 y가 양수일 경우 K 값 앞에 0x02를, 음수일 경우 0x03을 추가하여 구분합니다.

▶ 개인키

개인키는 256비트의 난수로 구성된 값입니다. 키 생성을 요청하면, 거대한 난수 표에서 무작위로 값이 선정되어 개인키를 만듭니다. 이 난수를 선정하는 알고리즘이 매우 중요한데요, 난수 생성의 복잡도가 낮고 단순하면 해커의 공격에 취약하여 해커가 개인키를 예측하고 사용할 수 있는 환경을 만들어줍니다.

비트코인은 WIF(Wallet Import Format) 방식으로 키를 변환하여 사용하며, 이 방식은 256비트의 공개키를 Base58Check 인코딩 체계를 통해 표 현합니다. 이더리움의 경우 생성한 개인키의 64개 헥사 값을 그대로 사용합니다.

| 지갑 주소

그러면 지갑 주소는 무엇이냐? 소프트웨어가 블록 체인에서 실행되는 동안 개인 블록 체인 지갑은 지갑 주소라고 하는 무작위로 생성된 32개의 영문, 숫자, 문자로 정의된 녀석을 생성합니다. 쉽게 말해 은행 계좌를 생성하는 것과 비슷합니다. 지갑 주소는 공개 키에서 생성됩니다. 예를 들어 모든 비트 코인 지갑은 P2PKH(Pay To Public Key Has) 주소를 생성할 수 있습니다. 예전에는 비트코인을 IP 주소로 직접 보내거나 지불하는 것이 가능했지만 이러한 방식은 중간자 공격(MitM)에 취약하기 때문에 비활성화 되었습니다.

블록 체인 지갑은 지갑의 기능을 확장하기 위해 둘 이상의 지갑 주소를 지원할 수 있습니다. P2PKH 이외에 P2SH(Pay to Script Hash) 주소를 지원할 수 있죠. 이러한 지원을 통해 공개 키의 해시가 아닌 스크립트의 해시로 트랜잭션을 보낼 수 있습니다. P2SH의 경우 트랜잭션 발신자는 스크립트로 트랜잭션에 서명해야하며 수신자는 전송된 스크립트가 스크립트에 대한 해시와 일치하는지 확인해야 합니다.

자 오늘은 암호화폐 지갑에 대해 간단하게 알아봤는데요 어느정도 감이 잡히시나요?

오늘은 글의 서두에서 말씀드린 것처럼 암호화폐 보안에 대해 얘기하기 전에 기본적인 지식에 대해 설명을 하고 알려드리고자 했습니다.

그러면 이제 본격적으로 암호화폐에 대한 공격 방법은 무엇이 있는지, 대표적인 암호화폐 범죄 유형과 대응 방법이 있는지 등의 내용의 다음 포스팅으로 돌아오겠습니다.

읽어주셔서 감사합니다.

--

--