블록체인 해시함수 | 정의, 특징, 블록체인 활용 예시

인사이트

블록체인 해시함수 | 정의, 특징, 블록체인 활용 예시

2023년 05월 25일

여러분은 해시라고 하면 무엇이 떠오르시나요? 저는 패스트푸드점의 고소한 해시 브라운 그리고 암호학, 컴퓨터 과학에서 다루는 해시 함수가 동시에 떠오르는데요. 전혀 상관없을 것 같은 이 두 가지가 사실은 같은 이름에서 유래되었다는 사실, 알고 계시나요?

[그림 1.] 해시함수란?

“해시(hash)”는 일반적으로 무언가를 잘게 쪼갠 후에 결과물을 생성하는 과정을 의미합니다. 해시 브라운은 감자를 잘게 쪼개 모양을 잡아 튀긴 음식인데요. 이와 유사한 개념을 컴퓨터 과학에 적용하여 데이터를 임의의 크기로 입력받아 고정된 크기의 출력값을 생성하는 함수를 해시 함수라고 부릅니다.

해시 함수의 역사

해시 함수 개념은 1950년대에 등장했지만, 그 역사는 조금 더 오래됐습니다. 해시 함수라는 용어를 사용하기 전에도 데이터를 변환하고 압축하는 함수들을 개발해 데이터의 효율적인 저장과 검색을 위해 사용했습니다.

해시 함수의 역사는 암호학・컴퓨터 과학의 발전과 밀접한 관련이 있습니다. 1970년대 암호학 분야에서 해시 함수의 중요성이 부각됐는데요. Merkle-Damgard 구조라고도 알려진 해시 함수 구조는 1979년에 등장했고, 이후 다양한 해시 함수 알고리즘이 개발됐습니다.

1990년대부터는 해시 함수의 안전성에 대한 요구가 더욱 강조되면서 MD5, SHA-1, SHA-256 등의 해시 함수가 개발됐습니다. 이러한 해시 함수는 데이터의 무결성 검증, 암호화, 블록체인 등 다양한 분야에서 사용되었고, 암호학적으로 안전한 특성을 갖추고 있습니다.

하지만 해시 함수의 안전성에 대한 이해는 시간이 지남에 따라 변화했는데요. 일부 해시 함수들은 충돌 공격에 취약하거나 보안 측면에서 취약함이 밝혀지면서, 더 강력한 해시 함수들이 개발되어 활용되고 있습니다. 현재는 SHA-3, Blake2, Whirlpool 등의 해시 함수들이 널리 사용되며, 더 안전한 암호학적 특성을 제공합니다.

해시 함수의 역사는 암호학・컴퓨터 과학의 발전과 함께 진행됐으며, 안전과 보안 측면의 요구에 따라 발전해 왔습니다. 지금도 암호학과 보안 분야에서 지속적으로 연구・발전되고 있는 해시 함수는 최근 크게 주목받고 있는 블록체인 기술에서도 큰 역할을 하고 있는데요. 이어 해시 함수의 정의와 특징, 그리고 블록체인에서의 활용까지 알아보겠습니다.

해시 함수의 정의

해시 함수(hash function)는 임의의 길이를 가진 데이터를 입력받아 고정된 길이의 값, 즉 해시값을 출력하는 함수입니다. 해시값은 입력 데이터로부터 유도되기 때문에 동일한 입력은 항상 동일한 해시값을 갖게 됩니다.

💡 해시 함수에 의해 반환되는 값은 해시값(hash value), 해시 코드(hash code), 다이제스트(digest) 또는 간단히 해시(hash)라고도 합니다.

정의만으로는 해시 함수를 완전히 이해하기 어려우실 수도 있는데요. 예를 들어 설명해 보겠습니다.

모듈러(Modulo) 연산, 즉 나머지 계산은 해시 함수의 가장 쉽고 직관적인 예시 중 하나입니다. 나머지 계산은 임의의 숫자를 다른 숫자로 변환하는 간단한 함수로, 일종의 해시 함수로 볼 수 있습니다.

예를 들어, 우리가 0부터 9까지의 숫자로 이루어진 데이터 세트를 가지고 있다고 가정해 봅시다. 그리고 입력된 숫자를 5로 나눈 나머지를 취하는 연산을 해시 함수로 사용한다고 가정해 보겠습니다. 이렇게 나머지 계산을 해시 함수로 사용하면, 데이터 세트의 각 숫자는 0부터 4까지 고정된 범위의 해시값으로 변환됩니다.

[그림 2.] 간단한 해시함수의 예시

예를 들어, 숫자 7을 해시 함수에 적용하면 7을 5로 나눈 나머지인 2가 해시값으로 출력됩니다. 마찬가지로 숫자 8은 3, 숫자 9는 4로 해시값이 출력됩니다. 이러한 방식으로 해시 함수를 사용하면 입력값에 대해 항상 동일한 규칙에 따라 고정된 길이의 해시값을 생성할 수 있습니다.

나머지 계산은 매우 간단하고 예측할 수 있는 해시 함수입니다. 그러나 실제로 사용하는 복잡한 해시 함수는 비트 연산, 비선형 함수, 복잡한 알고리즘 등을 사용하여 안전성과 충돌 저항성*을 보장하며, 더욱 안전한 데이터 변환을 수행합니다.

*충돌 저항성 : 해시충돌(Hash collision)을 잘 일으키지 않는 특성을 의미합니다. 해시 충돌에 대해서는 추후 설명합니다.

해시 함수의 특징

1. 단방향성

해시 함수는 단방향성을 가지고 있어서 입력 데이터에서 해시값으로의 변환은 쉽지만, 해시값에서 원래 데이터로의 역변환은 거의 불가능합니다. 이는 해시 함수가 데이터의 무결성을 보장하고, 보안 용도로 활용되는 데에 중요한 특징입니다.

이러한 단방향성을 평가하는 척도 중 하나가 역상 저항성(preimage resistance)입니다. 역상 저항성이 우수하다는 건 어떤 해시 함수가 특정한 값을 출력하는 입력값을 찾기 어려움을 의미합니다. 현재 보안에 사용되는 많은 암호화 해시 함수는 서로 다른 입력값에 대해 완전히 다른 출력값을 반환하여 입력값을 유추하기 매우 어렵습니다.

[그림 3.] 비슷한 입력값에도 전혀 다른 출력값을 내는 암호화 해시함수 예시

2. 해시 충돌

해시 함수는 서로 다른 입력에 대해 동일한 해시값을 출력할 수 있습니다. 이를 해시 충돌이라고 부릅니다. 좋은 해시함수는 충돌을 최소화해야 하며, 보안 측면에서 안전한 해시 함수는 매우 낮은 충돌 확률을 보장해야 합니다.

이를 평가하는 척도를 충돌 저항성(collision resistance)으로 표현할 수 있습니다. 충돌 저항성이 우수하다는 건 어떤 해시 함수가 충돌하는 서로 다른 두 입력값을 찾기 어려움을 의미합니다.

💡 제2 역상 저항성(second preimage resistance)이란?

충돌 저항성과 역상 저항성이 복합적으로 작용한 경우로, a라는 입력의 해시값과 동일한 해시값을 갖는 입력 b를 찾기 어려워야 함을 나타냅니다.

- 역상 저항성, 충돌 저항성, 제2 역상 저항성은 암호화 해시함수의 안전성을 평가하는 요소입니다.

3. 고정된 결괏값의 길이

해시 함수는 항상 일정한 길이의 결괏값을 출력합니다. 입력 데이터의 크기가 다르더라도 항상 동일한 길이의 해시값을 반환하기 때문에 블록체인과 같은 분산 시스템에서 데이터의 일관성과 효율적인 처리를 보장하는 데에 유용합니다.

예를 들어 대용량 데이터에 변조가 일어났는지 확인할 때, 일일이 모든 데이터를 대조하는 것보다 데이터의 해시값을 비교하면, 변조가 일어났는지 쉽게 확인할 수 있습니다. 이러한 검사 방법을 데이터 무결성 검사라고 합니다.

[그림 4.] 대용량 데이터의 무결성 검사에 활용되는 해시함수

블록체인의 해시 함수 사용

블록체인의
해시 함수 사용 이유

블록체인은 탈중앙화된 분산 시스템으로 데이터의 안전성과 무결성이 보장되는 것은 중요한 문제입니다. 이에 따라, 블록체인 데이터를 해시 함수를 사용하여 고유한 해시값으로 변환하여 저장함으로써 식별성, 무결성, 데이터 보안 등의 장점을 얻을 수 있습니다. 해시 함수가 블록체인에서 어떻게 활용되는지 더 알아보겠습니다.

블록체인의
해시 함수 활용 예시

트랜잭션 해시

블록체인에서 네트워크 참여자들 간에 전송되는 데이터 단위인 트랜잭션은 해시 함수를 거쳐 일정한 길이의 해시값으로 전환됩니다. 이를 통해 식별이 쉬워지고 트랜잭션 데이터가 변경되면 해시값도 변경되므로 무결성을 확인할 수 있습니다. 또한 해시 된 데이터는 원본 데이터로 복원이 어렵기 때문에, 블록체인에 저장된 데이터의 안정성이 높아집니다.

블록 해시

각 블록은 블록에 포함된 데이터를 기반으로 한 고유한 해시값을 가지고 있습니다. 이를 통해 블록들은 서로 구별되며, 특정 블록을 찾거나 검증할 때 해시값을 사용할 수 있습니다. 또한, 각 블록의 해시를 계산할 때는 이전 블록의 해시값도 포함되어 체인의 무결성을 보장합니다.

머클 트리(Merkle Tree)

블록체인의 무결성을 검증하기 위한 핵심적인 데이터 구조인 머클 트리(Merkle Tree)를 함께 보면서 자세히 살펴보겠습니다. 머클 트리는 여러 데이터에 대해 단계적으로 해시 함수를 적용하여 하나의 해시값으로 나타내는 데이터 구조입니다. 쉽게 말해, 여러 개의 데이터를 하나의 해시값으로 만드는 데이터 구조입니다.

[그림 5.] 머클 트리의 구조

여러 개의 데이터 집합이 있을 때, 각각에 해시 함수 연산을 거친 해시값을 두 개씩 짝지어 다시 해시 함수 연산을 거치고, 이 과정을 하나의 해시값이 나올 때까지 반복하여 얻는 데이터 구조입니다. 이때, 마지막 하나의 해시값을 머클 트리의 머클 루트(Merkle root)라 부릅니다. 머클 트리는 데이터가 변조되었는지 확인할 때 유용한 구조입니다. 각 데이터를 일일이 비교하기보다 머클 루트 값만 비교하면 되기 때문입니다.

[그림 6.] 머클트리의 데이터의 값이 변경되어 최종적으로 머클루트 값이 변함

위 그림처럼 머클 트리를 이루는 데이터 중 하나인 DATA(C)가 변조되었다고 가정해 보겠습니다. 이 경우, DATA(C)의 해시값은 기존의 값과 다른 값이 될 것입니다. 또한, 이를 입력값으로 사용한 Hash (hC.hD) 값도 다른 값으로 변할 것이며 최종 해시값인 머클 루트 값도 기존의 값과 달라질 것입니다. 따라서 머클 루트 값만 비교하면 데이터 집합에 변조가 이루어졌는지 쉽게 판단할 수 있습니다.

블록체인에서는 한 블록 내에 기록될 트랜잭션 집합을 가지고 머클 트리를 구성하고, 머클 루트 값을 사용하여 블록 해시값을 계산합니다. 따라서 어떤 사람이 블록 내의 트랜잭션을 변조하게 되면 머클 트리의 루트 값이 변경되고, 최종적으로는 해당 블록의 블록 해시값이 변경되게 됩니다.

[그림 7.] 머클루트의 값이 변해 최종적으로 블록 해시값이 변함

그런데 앞서 말씀드렸듯이, 블록체인에서는 이전 블록의 해시값을 현재 블록의 해시값을 계산하는 데 사용합니다. 따라서 뒤이어 체인에 포함된 블록의 해시값도 변경되게 될 것입니다. 즉, 특정 블록에 기록된 트랜잭션을 단 하나라도 변경하는 경우, 블록은 체인처럼 모두 연결되어 있기 때문에 해당 블록 이후에 연결된 블록을 모두 수정해야 합니다.

[그림 8.] 이전 블록의 블록 해시값이 변해 다음 블록의 블록 해시값이 변함

이미 전 세계에 분산된 블록체인에 올라간 데이터를 특정 부분부터 모두 수정한다는 것은 큰 비용이 들기 때문에, 이러한 구조로 되어 있는 블록체인은 위변조하기 매우 어렵습니다.

블록체인에서
사용하는 해시 함수

블록체인에서 주로 사용되는 암호화 해시 함수로는 SHA(Secure Hash Algorithm) 계열 해시 알고리즘이 있습니다. SHA는 미국 표준 기술 연구소(NIST)에서 개발한 해시 함수 알고리즘들의 모음으로 SHA-1, SHA-2, SHA-3와 같은 다양한 버전이 있으며, 각각의 버전은 서로 다른 특징과 보안 수준을 가지고 있습니다. 이번에는 블록체인에 널리 사용되는 몇 가지 해시 함수를 알아보겠습니다.

SHA-256

SHA-2 계열에 속하는 해시 함수로 256 비트(32 바이트)의 해시값을 생성합니다. 블록체인 기술을 기반한 최초의 암호화폐인 비트코인(Bitcoin)은 SHA 256을 트랜잭션 처리와 보안을 위해 사용합니다. 비트코인 이외에도 여러 가상 화폐 및 블록체인 프로젝트에서 SHA-256을 사용합니다.

Keccak-256

Keccak 해시 함수의 한 변종으로, 256비트(32바이트)의 해시값을 생성하는 알고리즘입니다. Keccak은 원래 NIST에 의해 SHA-3으로 선택되어 공개 해시 함수입니다. 이더리움(Ethereum)에서 주로 사용되는 해시 함수로 이더리움은 스마트 계약을 실행하고 트랜잭션을 처리하는 데에 Keccak-256 해시 함수를 사용합니다. 또한, Keccak-256은 블록체인에서 데이터 무결성을 검증하고 다양한 보안 관련 기술에 사용될 수 있습니다.

RIPEMD-160

RIPEMD(Race Integrity Primitives Evaluation Message Digest) 알고리즘을 기반으로 하여 개발되었습니다. RIPEMD-160은 주로 암호화폐와 관련된 기술에서 사용됩니다. 예를 들어, 비트코인에서는 공개키를 RIPEMD-160으로 해시하여 주소를 생성합니다. 이를 통해 공개키의 길이를 줄이고, 더 간결하고 보안 측면에서 강력한 주소를 생성할 수 있습니다.

그로스톨 알고리즘(Grøstl Algorithm)

미국 표준 기술 연구소(NIST)의 해시 함수 대회에서 최종 5에 선정된 새로운 암호화 해시 함수입니다. 해당 대회의 최종 우승은 앞서 말한 Kecaak이 하게 되었지만, 그로스톨 알고리즘을 활용한 그로스톨 코인, 디지 바이트, 버지 등 새로운 블록체인에 활용되기도 하였습니다.


해시함수는 임의 길이의 입력값을 받아 고정된 길이의 출력값을 내는 함수입니다. 이러한 특성을 활용하여 데이터 검색과 저장에도 널리 활용되지만, 출력값으로부터 입력값을 유추하기 어렵다는 단방향성이라는 특징을 활용하여 데이터 무결성 검사, 암호화에도 활용되고 있습니다.

분산 원장 시스템의 한 종류인 블록체인에서도 해시 함수는 핵심적인 역할을 수행합니다. 해시 함수는 데이터의 무결성 검증, 블록 식별, 블록체인의 무결성 검증 등 다양한 측면에서 활용되고 있습니다. 이 밖에도 해시함수는 블록체인의 작업증명(PoW)과 유효성 검사, 디지털 서명에서도 활용되고 있습니다. 또 해시 함수의 충돌을 활용한 공격 방법인 레인보우 테이블 공격, 생일자 공격 등의 키워드를 학습해 보시는 것도 추천드립니다.

코드스테이츠 블록체인 부트캠프에서는 탄탄한 이론을 바탕으로 블록체인 생태계의 가능성에 도전하고 싶은 분들을 기다립니다. 해시 함수 등 이론 학습에 이어 더 깊고 넓은 블록체인 생태계를 배우고 싶다면, 코드스테이츠 블록체인 부트캠프와 함께해 보세요.

오하영 Blockchain Engineer (블록체인 부트캠프)
편집 최인성 Content Manager


🚀 이론부터 실습, 취업까지
탄탄한 블록체인 커리어의 시작

목록 보기

추천글