안녕하세요. 어미새입니다.


이전 블록체인 포스팅에서 합의 문제, 합의 알고리즘에 대해서 알아봤습니다. 블록체인에서 합의 알고리즘이란 어떤 방식으로 블록을 생성해 낼 것이며, 어떤 블록이 '진짜'인지 판별하기 위한 알고리즘이라고 설명해드렸습니다. 좀 더 구체적으로 설명을 해드리자면 블록체인을 조작할 수 없어야 하고어떤 블록이 유효한지 확인할 수 있는 메커니즘이 필요합니다. 이러한 과정을 검증하는 메커니즘이 합의 프로토콜, 합의 알고리즘이라고 생각하시면 됩니다. 또한 합의 알고리즘은두 개의 유효한 블록체인이 생성됐을 때 하나를 선택하는 방법도 필요합니다.


이번 포스팅에서는 '해시함수'란 무엇이고 블록체인에서 '해시함수'는 어떤 역할을 수행하는지에 대해 알아보도록 하겠습니다.('해시함수'의 특징 및 역할은 추후 블록 구성요소에 대해 학습하기 위해서 반드시 개념을 알고 넘어가야합니다.)


해시 함수란 무엇인가?


해시함수는 메시지의 오류나 변조를 쉽고 빠르게 탐지할 수 있습니다. 또한, 데이터의 무결성을 제공하기 위해 사용되며, 매우 빠른 데이터 검색을 위한 소프트웨어에서도 널리 사용됩니다. 비트코인에서는 SHA-256 방식의 해시 함수를 사용하고 있습니다. 해시함수는 아래와 같은 특징을 가지고 있습니다.


해시 함수의 특징


  1. 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.

  2. 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)

  3. 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.

  4. 입력 값은 항상 동일한 해시 값을 출력한다.


SHA(Secure Hash Algorithm)


해시(Hash)의 종류에는 MD 알고리즘 및 SHA 알고리즘이 있습니다. 이번 포스팅에서는 비트코인에서 사용되는 알고리즘인 SHA256 함수에 대해서 알아보도록 하겠습니다. SHA(Secure Hash Algorithm)알고리즘은 미국 NSA에 의해 만들어졌습니다. 160비트의 값을 생성하는 해시 함수로, MD4가 발전한 형태입니다. MD5보다 조금 느리지만 좀 더 안전한 것으로 알려져 있으며, SHA에 입력하는 데이터는 512비트 크기의 블록이며 알고리즘의 동작원리는 아래 그림과 같습니다.



SHA 알고리즘은 크게 SHA-1과 SHA-2로 나눌 수 있으며 종류에 따른 성능은 아래의 표와 같습니다.



간다한 실습을 통해 해시 함수의 특징을 이해 해보도록 하겠습니다. 먼저 아래의 사이트는 입력 값을 SHA256 방식으로 변환해주는 사이트입니다.


사이트에 접속하시면 아래의 그림과 같은 화면이 있습니다, 상단의 입력박스에 해시하고자하는 입력 값을 누른 후 파란색 버튼인 'SHA256 해시를 생성!' 버튼을 누르면 입력값을 해시 값으로 변경하여 결과 값이 출력됩니다.



위의 사이트를 활용하여 앞서 설명한 해시 함수의 특징을 살펴보겠습니다.


  1. 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력한다.

위의 특징은 다시 말해서 입력 값의 길이와 상관 없이, 즉 책 한권의 분량의 데이터를 넣어도, 몇 글자 되지 않은 작을 글자를 넣어도 같은 결과가 나온다는 의미입니다. 먼저 어미새라는 짧은 문자열을 입력한 후 결과 값을 확인해 보겠습니다.



위의 그림과 같이 결과 값은 256비트(32바이트) 데이터의 길이로 결과 값이 출력되는 것을 확인 할 수 있었습니다. 그럼 이번에는 아주 긴 문자열을 넣어보도록 하겠습니다.



위의 그림과 같이 입력 값의 길이가 길어도 고정된 길이인 256비트의 길이로 결과 값이 출력되는 것을 확인할 수 있습니다. 즉 입력 길이에 상관없이 항상 고정된 문자열의 길이를 반환하는 특징을 확인할 수 있습니다. 그렇다면 이러한 특징을 어떻게 활용할 수 있을까요? 이 부분에 대한 설명을 하기 위해서는 먼저 해시 함수의 두 번째 특징인 눈사태 효과에 대한 설명이 필요합니다.


2.눈사태 효과 : 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.


눈 사태 효과는, 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력하는 특징입니다. 먼저 Hello word라는 단어를 입력하고 결과 값을 출력해보겠습니다.



Hello word의 결과 값은 위의 그림과 같이 256비트의 고정된 길이의 결과 값 AEA1D1146A00E1C55E49C7837C224ECFB76CA0337FD4BB6DC09E892CA0190119이 출력되는것을 확인할 수 있었습니다. 이번에는 마지막에 s를 추가하여 Hello words를 입력하고 결과 값을 출력해보겠습니다.



Hello wordHello words는 단어 한글자 차이지만 아래처럼 전혀 다른 결과 값이 출력되는것을 확인할 수 있었습니다.

1번 결과 : AEA1D1146A00E1C55E49C7837C224ECFB76CA0337FD4BB6DC09E892CA0190119

2번 결과 : 1FCBB61355A529153565A480CA98017D9FD97DD38B0C2CBE3EA56E68F3BC8745


입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값이 출력됩니다, 입력 값의 일부만 변경되었을 뿐인데 이렇게 전혀 다른 값으로 출력 된다면 출력된 결과 값을 토대로 입력값을 유추하는건 불가능할겁니다.


그럼 아주 방대한 데이터의 내용이 변경되었는지 확인하는 과정이 있다고 생각해봅시다. 데이터가 변경되었는지 한 글자 한 글자식 비교한다면 아주 오랜 시간이 소요될겁니다. 하지만 해시함수를 이용한다면 어떤 길이의 입력값이라도 256비트의 고정된 결과값을 출력할 것이고 입력값의 아주 일부만 변경되어도 전혀 다른 값이 출력되는 특징 때문에 데이터가 변경되었는지 쉽게 확인할 수 있습니다.


추가적으로 해시함수는 입력된 값이 같을 경우 항상 같은 결과 값을 출력해야합니다. 입력된 값은 같으나 다른 결과가 나온다면 데이터의 무결성을 검증할 수 없겠죠?

입력된 결과 값은 다르지만 같은 결과 값이 출력될 경우가 있습니다. (이련 경우는 아주~ 아주~~~ 희박하다고 합니다.) 입력 값이 다르지만 같은 결과 값이 출력되는 경우를 충돌이라고 표현하며, 충돌이 적은 해시함수가 좋은 해시함수가 되겠습니다.


이상으로 간단한 해시 함수의 정의와, 해시함수의 특징에 대해 알아봤습니다. 긴 글 읽어주셔서 감사합니다!



[참고 사이트]

https://blog.iwanhae.ga/introduction_of_bitcoin/

https://steemit.com/kr/@twinbraid/2b3hcu

http://www.convertstring.com/ko/Hash/SHA256

https://seed.kisa.or.kr/iwt/ko/intro/EgovHashFunction.do

+ Recent posts