기사 메일전송
자바(Java)로 미니 블록체인 개발해봐요(7) - SECTION 06. 파일 기반의 신원 인증 시스템 구현하기(1) - 필자는 안경잡이 개발자로 유명하며 현재 프리랜서로 활동중에 있다
  • 기사등록 2018-05-03 01:20:20
  • 수정 2018-05-03 01:22:14
기사수정


▲ 사진출처 : 동아사이언스

지난 시간에 우리는 개인의 신원을 증명하기 위해 타원 곡선(Elliptic Curve) 암호화 기술을 사용하는 방법에 대해 공부했다. 타원 곡선은 나날이 많이 사용되고 있는 공개키 기반 구조 기술로 이산대수를 이용한 복잡한 암호 체계를 갖추고 있다. 특히 타원 곡선 알고리즘으로 만든 개인키와 공개키 한 쌍이 있을 때 특정한 개인키로 암호화한 정보는 반드시 그와 한 쌍이 되는 공개키로만 복호화가 가능하다는 특징이 있다. 블록체인에는 이러한 기술이 들어가 개인의 신원을 검증할 수 있다.



[그림 1] 동빈이의 블록체인 장부 속이기 공격이 들키는 과정


예를 들어 블록체인에서 누군가 ‘속이기(Spoofing) 공격’을 수행했다고 가정해보자. 위 그림을 보면 ‘동빈’이가 ‘종구’인 척 종구의 지갑에서 자신의 지갑으로 코인을 보냈다고 블록체인에 작성을 했다. 이렇게 블록체인에 작성된 내용들은 실제로는 특정한 개인키로 암호화한 암호문의 형태를 띤다. 다시 말해 ‘종구가 동빈이에게 100코인 전송’이라는 서명(Signature)된 데이터는 오직 종구의 개인키로만 만들어낼 수 있는 트랜잭션 정보인 것이다.


따라서 동빈이가 종구의 개인키를 가지고 있지 않는 이상 ‘종구’의 신원으로 블록체인에 데이터를 작성할 수는 없다. 실제로 종구의 개인키는 종구의 지갑 소프트웨어에 저장되어 있으며 해킹을 당하지 않는 이상 동빈이가 종구의 개인키를 확인할 방법이 없는 것이다. 뿐만 아니라 한 번 만들어진 개인키는 지갑 소프트웨어가 삭제될 때까지 ‘파일’ 형태로 남아있어야 한다.


따라서 이번 시간에는 지난 시간 작성했던 프로그램을 확장해 파일 기반의 신원 인증 시스템을 개발해보자. 지난 시간까지는 단순히 공개키 기반 구조의 원리를 알아보기 위해 개인키로 특정한 데이터를 암호화하고 나중에 공개키로 검증하는 로직만을 구현했다. 하지만 실제로 동작하는 블록체인 소프트웨어에서는 보다 수준 높은 모듈이 필요하다. 즉 개인키와 공개키가 일회성이 아니라 파일 형태로 우리 컴퓨터에 남아있으며 저장하거나 불러오는 작업이 가능하도록 구현할 필요가 있다.


자바(Java) 프로그래밍 언어에서 타원 곡선 암호화 기술을 쉽게 이용하도록 해주는 대표적인 라이브러리는 바운시 캐슬(Bouncy Castle)이며 MIT 오픈소스 라이브러리를 따른다. 따라서 우리의 프로젝트에 무료로 삽입할 수 있다. 바운시 캐슬 공식 사이트로 가서 라이브러리를 다운로드 해보자.


바운시 캐슬 설치 사이트: https://www.bouncycastle.org/latest_releases.html


타원 곡선 암호화 기술에 필요한 라이브러리는 구체적으로 bcprov-jdk15on-159.jar와 bcpkix-jdkon-159.jar이므로 두 파일을 다운로드 해주자. 바운시 캐슬 버전이 업그레이드됨에 따라서 파일 뒤에 붙는 숫자는 달라질 수 있다. 이 때 JAR(Java Archive) 파일은 여러 개의 자바 클래스 파일 및 리소스를 하나로 모은 일종의 압축 파일이다. 바운시 캐슬 라이브러리는 이와 같은 .jar 확장자로 구성되어 있으며 우리의 이클립스 프로젝트 내에 포함시켜 편리하게 사용할 수 있다.



위와 같이 JAR 파일 목록에서 찾아 다운로드 해준 뒤에 두 파일을 드래그(Drag)해서 이클립스 내 프로젝트 이름에 드롭(Drop)해준다. 그러면 다음과 같이 JAR 파일이 들어간다.



단순히 프로젝트 내에 JAR 파일이 포함되었다고 해서 사용이 가능한 것은 아니며 프로젝트를 빌드(Build)할 때 해당 라이브러리를 읽을 수 있도록 빌드 패스(Build Path)에 추가해주어야 한다. 다음 그림과 같이 두 라이브러리를 선택하고, 우클릭 하여 ‘Add to Build Path’를 눌러준다.


흔히 컴퓨터에 저장된 개인키 및 공개키 파일을 인증서(Certificate)라고 한다. 일반적으로 인증서 정보는 바이트 형태로 저장되어 있어 읽거나 처리하기 어려우므로 키 데이터를 Base64 알고리즘을 이용해 보기 편하고, 전송하기 편한 형태로 인코딩(Encoding)을 해서 관리한다. 그렇게 인코딩된 파일을 PEM(Privacy Enhanced Mail) 이라고 하며 일반적으로 .pem 확장자를 가진다.


따라서 임의의 타원 곡선 암호 키를 생성해서 .pem 확장자로 내보내는 모듈을 개발해서 개인키 및 공개키를 컴퓨터 내에 저장할 수 있도록 하자. 이를 위해 util 패키지를 내부에 EC(타원 곡선), Pem 클래스를 새롭게 만들어준다. 만든 이후의 프로젝트 구성은 다음 그림과 같다.



먼저 Pem.java 클래스를 다음과 같이 작성해보자. 단순히 특정한 개인키 혹은 공개키 정보를 읽어서 저장한 뒤에 파일로 내보내는 역할만을 수행하는 것이다.




이제 타원 곡선 암호화 기술을 이용해 개인키 및 공개키를 생성해 저장할 수 있도록 EC.java 클래스를 작성해보자. 타원 곡선 암호화 기술에 적용할 수 있는 세부 알고리즘으로는 다양한 종류가 있는데 저자는 키의 길이가 짧은 알고리즘인 ‘sect163k1’을 사용해보았다.


이후에 위와 같이 작성된 두 개의 클래스를 이용해 개인키와 공개키를 랜덤으로 생성해서 파일 형태로 저장하도록 프로그램을 작성해보자. BlockChainStart.java 클래스를 다음과 같이 수정한다.




프로그램을 실행해보면 그 결과는 다음과 같다.



이후에 다음과 같이 프로젝트명을 마우스 우클릭 하여 속성(Properties) 탭을 열어준다.



이후에 Resources 탭에서 프로젝트가 저장된 위치(Location)를 열어볼 수 있다.



위와 같이 폴더 열기 버튼을 눌러서 프로젝트의 위치 폴더에 접근한 뒤에 자신의 블록체인 프로젝트 폴더를 열어보면 다음과 같이 개인키와 공개키 파일이 생성되어 있는 것을 확인할 수 있다.



먼저 개인키 파일인 private.pem을 메모장 등의 에디터(Editor) 프로그램을 이용해 열어보자. 그러면 다음과 같은 형식으로 키 데이터가 작성되어 있는 것을 확인할 수 있다.


-----BEGIN EC PRIVATE KEY-----

MGwCAQAwEAYHKoZIzj0CAQYFK4EEAAEEVTBTAgEBBBUACBlGTrxR2gMEGd9udNYO

5unIhQCgBwYFK4EEAAGhLgMsAAQD4mA5Ta270nw5sf+afBCFPjCNsTYGVYYPJ6hD

e7zxAy+UYBWlVOqx/YQ=

-----END EC PRIVATE KEY-----


우리가 작성한 프로그램은 랜덤으로 키를 생성하여 저장하는 프로그램이므로 실행할 때마다 이러한 키 정보는 매번 변경될 것이다. 다만 정해진 규격에 따라서 길이가 동일하고, 형식 또한 유사하다는 것을 확인할 수 있다. 이후에 공개키 파일인 public.pem의 내용을 확인해보자.


-----BEGIN EC PUBLIC KEY-----

MEAwEAYHKoZIzj0CAQYFK4EEAAEDLAAEA+JgOU2tu9J8ObH/mnwQhT4wjbE2BlWG

DyeoQ3u88QMvlGAVpVTqsf2E

-----END EC PUBLIC KEY-----


실제 대다수의 블록체인 지갑 소프트웨어에서는 개인키와 공개키 정보가 위와 같이 인증서 파일 형태로 저장이 되어 있으며 흔히 우리가 알고 있는 ‘지갑 주소 생성’ 기능 또한 사실은 위와 같은 한 쌍의 공개키와 개인키를 만드는 것이라고 할 수 있다. 이후의 시간에 자세히 배우게 되겠지만 ‘지갑 주소’란 위와 같이 만들어진 공개키에 해시를 적용한 것에 불과하기 때문이다.


다음호에 계속...

0
기사수정

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

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