기사 메일전송
SHA256 - 나동빈(안경잡이 개발로 유명한 필자는 현재 프리랜서로 근무중이다)
  • 기사등록 2018-02-20 00:59:22
  • 수정 2018-10-30 01:56:45
기사수정



지난 번에서는 블록체인(Block Chain)을 구동시키는 핵심 알고리즘인 해시(Hash)에 대한 기본적인 이론을 공부하는 시간을 가졌다. 이전 시간에 다루었듯이 해시란 특정한 입력 데이터를 넣으면 이를 상징하는 새로운 출력 데이터를 만들어내는 알고리즘의 한 종류다. 더불어 ‘서로 다른 입력 데이터에 대한 출력 값이 동일한 현상’인 충돌(Collision)이 적게 발생할수록 좋은 해시 알고리즘이라고 언급했다. 이번 시간에는 실제로 비트코인 및 기타 코인들의 블록체인 알고리즘 전체에 걸쳐 사용되고 있는 SHA-256에 대해 자세히 알아보자. 블록체인에 해시가 적용되는 방식은 코인마다 상이하지만 상당수의 블록체인이 SHA-256을 사용하고 있다.



[그림 1] SHA 알고리즘의 분류


안전한 해시 알고리즘


SHA(Secure Hash Algorithm)은 미국 표준 기술 연구소(NIST)에 의해 공표된 표준 해시 알고리즘으로 소프트웨어 시장 전반에서 전세계적으로 가장 많이 사용되고 있다. SHA의 의미를 한글로 직역하면 ‘안전한 해시 알고리즘’으로, 현재 SHA-1과 SHA-2 계열이 많이 쓰이고 있다. SHA-0이 가장 먼저 나온 알고리즘이며 SHA-3이 가장 최근에 나온 알고리즘이다. 최근에 나온 알고리즘일수록 해시 문자열의 길이가 길고 강력하다는 특징이 있다.


SHA-2는 세부적으로 SHA-224, SHA-256, SHA-384, SHA-512로 나뉘는데 SHA-256이 가장 많이 사용되고 있다. 위 그림에서 붉게 표시한 SHA-1과 SHA-256이 현재 가장 많이 사용되고 있지만 SHA-1은 최근 2017년 구글(Google)이 주도적으로 진행한 해시 보안 관련 연구에서 충돌이 감지되어 신규 프로젝트에는 점차 차용되지 않는 추세다. 결과적으로 현재 가장 많이 사용되고 있는 해시 알고리즘은 SHA-256이며 상당수 블록체인에서 채택하여 사용하고 있다.


SHA-256은 256비트로 구성되어 64자리 문자열을 반환한다. 이전 시간에 다루었던 MD5는 32자리 문자열을 반환한다는 점과 비교했을 때 해시 값이 2배나 길다는 특징을 가진다. 단순히 산술적으로 계산했을 때 256비트는 2의 256 제곱만큼 경우의 수를 만들 수 있다. 이는 개인용 컴퓨터로 무차별 대입(Brute-Forcing)을 수행해 해시 충돌 사례를 찾으려고 할 때 억겁의 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 볼 수 있다. 예를 들어 ‘안경잡이개발자’라는 문자열을 SHA-256으로 해시화한 결과는 다음 그림과 같다.



[그림 2] SHA-256 알고리즘 적용 예시


앞서 간단히 언급했듯이 SHA-1은 구글 클라우드 서버를 기반으로 수행된 연구 사례에서 약 900경의 해시 연산을 통해 충돌이 발견된 적이 있다. 이러한 측면에서 SHA-1과 근본적으로 크게 다르지 않은 SHA-256이 언제까지나 안전할 것이라고 말하기는 어렵다. 하지만 저자는 사실상 해시 취약점을 대상으로 하는 양자 컴퓨터가 출시되지 않는 이상 최소 근 10년가량은 안전할 것이라고 판단한다. 꾸준한 컴퓨터 연산 속도의 향상을 고려해도 SHA-256이 제공하는 해시 알고리즘은 산술적으로 매우 강력하기 때문이다. 혹여 미래에 SHA-256의 취약점이 발견되더라도 블록체인에는 하드포크(Hard Fork)와 같은 알고리즘 개선 기법들이 존재한다. 따라서 블록체인의 기반이 되는 해시 알고리즘은 현재로서는 안전하다는 것이 전문가들의 공통된 견해이다.


구글 보안 연구팀이 발표한 SHA-1의 해시 충돌 공격 사례에 대한 구체적인 내용은 SHAttered 서비스의 URL(https://shattered.io/)에서 확인할 수 있다. 이러한 연구를 통해 SHA-1을 대상으로 하는 공격이 가능하다는 것이 실무적으로 증명되어 최근 보안 전문가들은 각종 소프트웨어를 개발할 때는 반드시 SHA-256 이상의 해시 알고리즘을 사용하기를 권고하고 있다. 저자 또한 현재 개발하고 있는 상당수 소프트웨어에서 중요 정보를 저장할 때 SHA-256을 사용하고 있다.

블록체인 속의 SHA-256


그렇다면 SHA-256이 구체적으로 블록체인 내에서 어떻게 사용되는지 알아보도록 하자. 저자는 일종의 블록체인 프로토타입(Prototype)을 예시로 들어 설명할 것이다. 블록체인마다 조금씩 구체적인 구현 방법은 다를 수 있지만 앞으로 다룰 예시만 이해해도 블록체인이 왜 ‘해시로 시작하여 해시로 끝나는’ 암호 기반의 기술인지 이해할 수 있을 것이다. 채굴(Mining)은 기술적으로 보았을 때 ‘하나의 블록을 형성하여 블록체인의 길이를 연장하는 행위’이다. 이 때 블록을 형성하는 방법은 현재 블록에서 정해진 난이도를 만족하는 정답 값을 찾는 것이다. 흔히 이 정답 값을 논스(Nonce)라고 하며 논스 값은 사실상 무차별 대입(Brute-Forcing)으로만 찾을 수 있다.



[그림 3] 블록체인 프로토타입 예시


위 그림을 보면 기본적으로 블록체인의 난이도가 1000000임을 확인할 수 있다. 이는 블록이 형성되려면 ‘현재 해시’의 값이 1000000 이하의 값이 되어야 한다는 의미이다. 첫 번째 블록의 정답(Nonce) 값이 3849356으로 되어있는데, 3849356을 해시 알고리즘의 입력으로 넣고 돌렸을 때 그 결과가 A34983E로 1000000보다 작아서 채굴(Mining)에 성공한 것이라고 볼 수 있다. 물론 해시 값이 1000000보다 작기만 하면 무엇이든지 정답이 될 수 있다. 채굴에 성공한 이후에는 다음 블록으로 현재의 해시 값이 넘어간다. 두 번째 블록부터는 (이전 해시 + 정답)을 해시한 값이 1000000보다 작아야 한다. 정답 값을 찾을 확률은 난이도에 대해 반비례하며 ‘이전 해시’의 값을 ‘현재 해시’를 구하는 데 활용하는 이유는 블록체인을 변조로부터 방어하기 위해서이다.



[그림 4] 특정한 블록의 변조가 전체 블록체인에 미치는 영향


예를 들어 위와 같이 두 번째 블록의 데이터가 변조되었다고 해보자. 두 번째 블록에서 8598493 외에도 9871223이라는 정답이 존재하여 위와 같이 해시 값이 난이도를 만족한다고 가정한다. 하지만 특정한 블록은 이전 블록의 해시 값을 토대로 새로운 해시를 만들어낸다는 점에서 두 번째 블록의 뒤로 이어진 모든 블록은 이로 인해 해시 값이 완전히 바뀌어버린다. 세 번째 블록부터 시작하여 존재하는 모든 블록들의 해시 값이 바뀌며 대부분의 블록은 난이도 1000000을 만족하지 못할 것이다. 결과적으로 악의적인 공격자가 특정한 거래 내역을 바꾸기 위해서는 특정한 블록부터 시작해 뒤쪽의 모든 블록의 정답(Nonce) 값을 새롭게 찾아야 한다.


위와 같이 블록체인은 블록마다 해시 데이터가 긴밀하게 연결되어 블록이 생성될수록 더욱 견고해진다. 물론 가장 뒤쪽에 있는 몇 개의 블록은 상대적으로 해킹당할 가능성이 높다. 그래서 상당수 거래소 및 지갑 소프트웨어에서는 입금이 발생한 뒤에도 블록이 최소한 몇 개는 더 생성되어야 비로소 ‘완전히’ 입금이 이루어졌다고 판단한다. 또한 위 예시는 저자가 간단히 만들어본 것으로 해시 결과 값의 길이가 매우 짧지만 실제 블록체인에서는 SHA-256 등을 사용해 이보다 훨씬 긴 해시 결과 문자열을 가진다. 혹은 더욱 복잡한 자체 알고리즘을 적용하곤 한다.


따라서 경제적인 측면에서 보았을 때 블록을 변조하려고 노력하는 것보다 성실히 채굴(Mining)에 임했을 때 더욱 많은 수익을 얻을 가능성이 높다. 흔히 암호화폐 관련 해킹이 발생했다고 하면 개인 PC, 거래소 서버, 계정 정보 등을 해킹당한 사례가 대부분이며 블록체인이 해킹당하는 일은 드물다. 물론 취약한 알고리즘을 적용한 몇몇 암호화폐들은 블록체인 자체를 해킹당한 이력이 있다. 다만 그들 중 상당수는 이미 하드포크(Hard Fork) 등의 기법을 이용해 재탄생되었다. 이제 위 블록체인 프로토타입에 거래 내역(Transaction)의 개념을 더해보자.



[그림 5] 거래 내역을 포함한 블록체인 프로토타입 예시


실제 블록체인에서는 위와 같이 거래 내역을 저장한다. 각 블록은 새로운 블록이 만들어질 때까지 발생한 모든 거래 내역을 기록한다. 위 그림을 통해 첫 번째 블록이 생성되고 두 번째 블록이 생성되기까지 3번의 거래가 발생했음을 알 수 있다. 이 때 하나의 블록에서 ‘현재 해시’ 값을 생성할 때는 해당 블록에 기록된 거래 내역 데이터들이 반영된다. 거래 내역에서 한 글자만 바꾸어도 해시 값이 완전히 바뀌므로 한 번 성사된 거래는 돌이키기 어렵다. 만일 거래 내역 중에서 특정한 데이터를 변조하려고 하면 이후 존재하는 모든 블록들의 해시 값까지 변경된다.



[그림 6] 거래 내역을 포함한 블록체인 프로토타입 예시


한 번 A, B, C라는 세 채굴자가 블록체인 생성에 기여하고 있다고 가정해보자. 이 때 위 그림과 같이 채굴자 C가 블록체인의 두 번째 블록에 있는 ‘A가 C에게 25코인을 송금’했다는 데이터를 ‘A가 C에게 2500코인을 송금’했다는 데이터로 조작을 하면 어떻게 될까? 이 경우 데이터를 조작하자마자 두 번째 블록의 ‘현재 해시’ 값이 변경되어 새로운 정답(Nonce) 값을 찾지 않는 이상 성공적으로 해당 블록을 변조시킬 수 없다. 행여나 두 번째 블록의 새로운 정답 값을 찾았다고 해도 두 번째 블록 이후의 모든 블록의 해시 값이 변경된 상태이므로 이후 블록들에 대한 정답 값도 찾아야 할 것이다. 그러므로 사실상 장부를 변조하는 것은 불가능하다.


더불어 채굴자 C가 가장 최근의 몇 개 블록에 대한 변조에 성공했다고 하더라도 동일한 네트워크에 있는 A와 B가 가지고 있는 블록체인과 그 형태가 다를 것이다. 따라서 A와 B에게는 C의 변조된 장부가 올바른(Correct) 장부라고 받아들여지지 않는다. 블록체인은 이러한 방어 기술을 내재한다는 점에서 강력하다. 다만 현재의 상당수 블록체인은 컴퓨터 연산 능력을 합의(Consensus)의 기준으로 삼고 있다. 이 경우 채굴자 C의 네트워크 장악력이 50%를 초과한다면 채굴자 C의 장부가 올바른 장부로 받아들여질 가능성이 있다. 하지만 방대한 채굴 네트워크에서 일개 세력의 연산 능력이 50%를 초과하는 것 또한 사실상 불가능하다.


한마디로 블록체인은 해시(Hash)를 통해서 그 무결성이 입증되며 공격자로부터 안전하게 유지될 수 있다. 그렇다면 특정한 개인이 다른 사람에게 코인을 송금했다는 사실은 어떻게 증명할 수 있을까? 이는 공개키 기반 구조(Public Key Infrastructure)에 기초하는 것으로 다음 강좌 시간 때 자세히 다루어 볼 예정이다. 사실 블록체인은 SHA-256과 공개키 기반 구조에 대해서만 바르게 이해하면 그다지 어려운 개념이 아니다. 이들은 모두 자료구조, 알고리즘, 정보보안 등의 컴퓨터 공학 강의에서 배우는 내용이므로 대학에서 정규 고등교육을 이수한 프로그래머라면 각종 기술 문서를 참고하여 충분히 프로토타입 수준의 블록체인 정도는 개발할 수 있을 것이다.


SHA-256 실습하기


SHA-256 암호화 사이트 URL(http://www.convertstring.com/ko/Hash/SHA256)로 가보면 누구나 쉽게 SHA-256 해시 알고리즘을 사용해볼 수 있다. 저자는 ‘안경잡이개발자’를 넣어 ‘825C2FD18B3579018770053F4540DFA79825A7A4AAFDDAE48CD7AC375F165BA2’라는 해시 값을 얻을 수 있었다. 기본적으로 SHA-256 알고리즘은 세계 어디에서나 동일하게 사용되므로 별도의 소금(Salt) 값을 적용하지 않는 이상 동일한 입력 값에 대해서는 동일한 결과가 출력될 것이다.



[그림 7] SHA-256 암호화 실습 사이트에서의 암호화 결과


더불어 SHA-256 또한 지난 시간에 해보았던 MD5 복호화 공격 실습처럼 사전(Dictionary) 기반의 복호화 공격을 수행할 수 있다. 물론 SHA-256은 아직까지 충돌(Collision)이 한 번도 발견되지 않은 알고리즘이지만 해시 복호화 공격은 레인보우 테이블(Rainbow Table)을 구축한 뒤에 이루어지는 공격이므로 충돌 여부와는 상관없이 수행될 수 있다. SHA-256 복호화 실습 사이트 URL(http://md5decrypt.net/en/Sha256/)에 접속한 뒤에 SHA-256 복호화 공격 실습을 해보자. ‘705DB0603FD5431451DAB1171B964B4BD575E2230F40F4C300D70DF6E65F5F1C’를 복호화(Decrypt) 시도하면 ‘awesome’이라는 영어 문자열이 출력되는 것을 확인할 수 있다. 다만 현재 해당 SHA-256 복호화 실습 사이트에서는 3,771,968,094 개의 단어만이 저장되어 있으므로 이에 포함되지 않는 입력 문자열은 당연히 복호화가 이루어지지 않을 것이다.



[그림 8] SHA-256 복호화 공격 실습 사이트에서의 복호화 결과


다음호에서 계속...

1
기사수정

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

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