기사 메일전송
자바(Java)로 미니 블록체인 개발해봐요(6) - SECTION 05. 블록체인에서 개인 신원 증명 과정을 알아보자 - 필자 나동빈은 '안경잡이' 개발자로 현재 프리랜서로 활약하고 있다
  • 기사등록 2018-04-25 00:41:13
기사수정



지난 시간에는 각각의 블록이 트랜잭션(Transaction) 정보를 저장하도록 하여 블록 해시 값에 영향을 미치도록 설정했다. 이로 인해 특정 블록 내에서 트랜잭션 정보가 변경되는 경우 이후의 모든 블록의 해시 값이 변경되는 것을 확인할 수 있었다. 이러한 기능 덕분에 우리는 블록체인 속의 모든 트랜잭션 정보가 정상임을 검증할 수 있다. 즉 데이터 무결성(Integrity)을 지킬 수 있는 것이다.


이제 독자들은 블록체인에 들어있는 해시(Hash) 함수가 트랜잭션 데이터가 변질되는 것을 예방할 수 있음을 이해했을 것이다. 하지만 해당 트랜잭션 자체가 ‘속이기(Spoofing) 공격’으로 발생한 것이었다면 어떻게 될까? 예를 들어 ‘종구’는 ‘동빈’이에게 코인을 보낸 적이 없는데, ‘동빈’이가 ‘종구’인 척 종구의 지갑에서 자신의 지갑으로 코인을 보냈다고 블록체인에 작성할 수 있는 것이다.



[그림 1] 동빈이가 자신이 종구인 척 블록체인에 트랜잭션을 기록하는 모습


  현재 우리의 소스코드에는 아이디나 비밀번호 등 ‘개인의 신원’을 증명할 수 있는 방법이 없기 때문에 위와 같은 해킹 공격이 발생할 수 있다. 일반적으로 웹 서비스와 같은 ‘서버(Server) – 사용자(Client)’ 구조에서는 사용자가 서버에게 아이디와 비밀번호를 보내면, 서버가 해당 비밀번호가 맞는지 검토하여 사용자가 게시물 작성 권한을 주는 방식으로 신원을 검증한다. 하지만 블록체인에서는 중앙 통제를 담당하는 서버가 존재하지 않아서 이것과는 조금 다른 방식의 인증이 사용되어야 한다.



[그림 2] 일반적인 서버 – 클라이언트 인증 방식


  위 그림은 일반적인 서버 – 클라이언트 인증 방식을 보여준다. 반면에 블록체인은 이와 다르게 ‘사용자(Client) - 사용자(Client)’ 시스템, 즉 P2P 서비스이기 때문에 별도의 서버가 없어서 개인 간에 인증을 수행해야 한다. 따라서 흔히 우리가 알고 있는 아이디와 비밀번호 구조로는 개인의 신원을 입증할 수 없다. 그러므로 공개키 기반 구조를 사용해 개인의 신원을 증명한다.



[그림 3] 공개키 기반 구조


이전 블록체인 강좌에서 다루었듯이 공개키 기반 구조란 개인키와 공개키를 한 쌍으로 암호를 관리하는 방법이다. 이 때 개인키로 암호화한 데이터는 오직 그와 한 쌍이 되는 공개키로만 복호화할 수 있다. 또한 반대로 공개키로 암호화한 데이터는 그와 한 쌍이 되는 개인키로만 복호화할 수 있다.


공개키 기반 구조가 보안이 매우 뛰어난 이유는 공개키를 보고 역으로 개인키를 유추하는 것이 수학적으로 매우 어렵기 때문이다. 이는 암호 이론 및 대수학의 정수론과 관련된 내용으로 그 원리가 궁금한 독자는 따로 정수론에 대해서 개인적으로 공부해보는 것을 추천한다.


결과적으로 이러한 특징 때문에 블록체인상의 모든 참여자는 자기 자신의 개인키와 공개키를 가지고 있으면서 네트워크에 전달하고 싶은 내용이 있을 때 그 데이터를 개인키로 암호화한 뒤에 암호문을 자신의 공개키와 함께 네트워크로 전달한다. 그 형태는 다음의 그림과 같다.



[그림 4] 공개키 기반 구조를 활용한 개인의 신원 증명


같은 네트워크에 소속된 사람들은 위 그림과 같이 특정한 개인이 보낸 암호문을 해당 공개키로 복호화해볼 수 있다. 이 때 성공적으로 복호화가 된다면 해당 암호문이 그 사람의 개인키로 암호화하여 만들어졌다는 것이 입증되는 것이다. 또한 실제로 블록체인에서 지갑(Wallet) 주소는 공개키를 해시화해서 얻어낸다. 따라서 블록체인에서는 ‘특정한 개인’이 ‘지갑 주소’로 대변되므로 이러한 공개키 기반 구조를 이용해 개인의 신원을 정확히 증명할 수 있게 된다.


지난 시간에 다루었던 내용은 ‘한 번 작성된 트랜잭션은 변경될 수 없음을 보장’하는 방법이며 ‘트랜잭션을 발생시킨 사람의 신원을 입증’하는 방법은 아니다. 이 두 가지는 명확히 다른 것이고, 이번 시간에는 방금까지 언급했던 트랜잭션을 발생시킨 사람의 신원을 입증하는 모듈을 직접 소스코드로 구현해 볼 것이다. 이 때 ‘타원 곡선 암호 알고리즘’ 기법이 사용된다.


타원 곡선 암호화 알고리즘은 특정한 개인키를 토대로 산술적 연산을 통해 공개키를 생성할 수 있도록 해준다. 이 때 공개키를 이용해 개인키를 역으로 추적하는 것은 수학적으로 매우 어렵다는 특징이 있다. 자바(Java)에서는 이를 기본 라이브러리 형태로 제공하고 있으므로 그대로 사용해볼 수 있다. 일단 간단하게 원리를 이해하기 위해서 BlockChainStarter 클래스를 다음과 같이 수정해보자.



위에서 제시한 암호화 모듈은 대부분의 자바(Java) 개발자에게도 생소할 정도로 쉽지 않은 내용이므로 각 핵심 구간마다 주석을 달아놓았다. 자바 암호화 라이브러리에서는 랜덤으로 개인키 및 공개키를 만들어주도록 할 수 있는데, 위 소스코드는 이를 이용해 간단히 개인키와 공개키를 랜덤으로 생성해 실습한 것이다. 반면에 실제 블록체인에서는 사용자가 임의의 비밀번호로 개인키를 생성해 사용할 수 있다. 다만 비밀번호가 쉬우면 레인보우 테이블(Rainbow Table) 공격의 표적이 될 수 있다.



소스코드를 실행해보면 위와 같이 특정한 개인키로 서명한 문장은 반드시 그 개인키와 한 쌍이 되는 공개키로 검증을 했을 때 참(True) 값이 나오는 것을 알 수 있다. 즉 특정한 암호문을 작성한 사람이 ‘누구’인지를 검증할 수 있는 것이다. 해당 공개키와 한 쌍이 되는 개인키를 모른다면 해당 암호문을 작성할 수 없으므로 누가 해당 암호문을 작성했는지 정확히 알아낼 수 있다. 이제 다음과 같이 ‘변경된 문장’을 만들어 추가적으로 복호화를 수행하도록 소스코드를 수정해보자.




위 소스코드는 코인을 100개 보냈다는 문구를 1,000개로 수정한 ‘변경된 문장’을 추가한 소스코드다. 개인키를 이용해 ‘원래 문장’으로 암호문을 만들어냈으므로 ‘원래 문장’에 대해서만 복호화가 성공적으로 이루어져야 할 것이다. 실제로 실행해보면 ‘원래 문장’에 대한 검증만 참(True)값이 나오고, ‘변경된 문장’에 대해서는 거짓(False) 값이 나오는 것을 알 수 있다.



이처럼 개인키와 공개키가 한 쌍을 가지는 공개키 기반 구조의 특징 때문에 네트워크에 소속된 사람들은 특정한 사람이 보낸 암호문을 임의대로 변경시킬 수 없게 된다. 또한 우리의 프로그램은 실행할 때마다 ‘암호문’ 문자열이 다르게 나올 텐데, 이는 현재 우리가 개인키와 공개키를 무작위로 생성하도록 만들었기 때문이다. 실제 블록체인에서는 개인키와 공개키 한 쌍이 개인의 지갑 정보에 담겨 있어서 변하지 않고 항상 동일하다. 그렇기 때문에 개인키 정보가 다른 사람에게 누설되는 경우 지갑의 모든 코인을 빼앗길 수 있으므로 지갑 소프트웨어에 대한 보안에 만전을 기해야 하는 것이다.


다음호에 계속...


-기사 속 코드 작성에 문제가 있으면 비트웹 대표메일로 메일을 주시면 필자의 원본 파일을 전달해드리겠습니다-


비트웹(bitweb.co.kr)

1
기사수정

다른 곳에 퍼가실 때는 아래 고유 링크 주소를 출처로 사용해주세요.

http://www.bitweb.co.kr/news/view.php?idx=813
기자프로필
프로필이미지
나도 한마디
※ 로그인 후 의견을 등록하시면, 자신의 의견을 관리하실 수 있습니다. 0/1000
실시간 암호화폐 순위 확인하기
코인마켓캡
모바일 버전 바로가기