해시 함수는 무엇인가요? (1)

이번 편은 주소와 해시 함수에 관해 설명하고자 합니다. 계약에 대한 서명이나, 파일 암호화 처럼 일상적으로 사용되는 암호 시스템의 예시와 다르게, 해시 함수는 사용자에게 직접적인 사례로 표현되지 않기 때문에 이해가 조금 어려울 수 있습니다. 하지만, 블록체인 구성에 있어서 매우 중요한 역할을 하기 때문에 자산의 안전한 관리를 위해서 꼭 이해하고 있어야 하는 개념입니다. 내용이 길어질 수 있어서 두 편으로 구성되었으며, 이번 글에서는 해시 함수의 필요성과 특징에 대해서 알아보겠습니다.

해시 함수의 이해를 돕기 위해서, 간단한 예시를 들어보겠습니다. 여러분의 컴퓨터에 중요한 100개의 문서 파일이 있다고 가정해보겠습니다. 중요한 파일이기 때문에 누군가가 임의로 수정하면, 큰일이 날 수도 있어 수시로 수정된 부분이 없는지 확인을 해줘야 합니다. 그런데 100개나 되는 파일을 직접 열어서 내용을 확인하고, 일일이 페이지를 넘겨가며 수정된 부분을 확인하기에는 너무 오랜 시간이 걸립니다. 이럴 때 사용할 수 있는 방법이 없을까요?

100개의 파일을 다 일일이 확인하지 않아도 변경되었는지 아닌지 빠르게 확인할 수 있고, 변경이 되었다면 바로 알아차릴 수 있는 수단이 있습니다. 해시 함수를 이용해 100개의 파일에 대한 해시값을 만들어서 확인하는 것입니다. 해시값이란 입력을 해시 함수에 넣었을 때 출력되는 값을 의미합니다. 어떤 사실이 위변조가 되지 았았음을 나타내는 성질을 무결성(integrity)이라고 하는데, 해시 값은 무결성 확인을 위해서 사용됩니다.

해시와는 기능과 목적이 다르지만, 비슷하게 동작하는 것이 압축인데요. 어떤 파일을 압축하면, 파일의 사이즈가 줄어들고 압축된 파일을 해제하면 원본 파일이 나타납니다. 이와 유사하게 해시 함수는 입력 데이터에 대해서 압축과 유사하게 변환 과정을 거쳐, 출력된 결과를 제공합니다. 다만, 해시 함수가 가지는 특징은 압축과는 많이 다르기 때문에 이런 과정들을 조금 알아보겠습니다.

해시 함수의 특징 첫 번째는 고정된 출력길이를 반환한다는 것입니다. 압축의 경우에는 파일 사이즈가 크면, 압축되더라도 파일 사이즈가 비교적 큰편이지만, 해시 함수는 어떤 입력이 들어가더라도 동일한 출력 길이를 반환합니다. 이러한 출력길이는 사람의 눈으로 식별할 수 있는 40자리 숫자(160bit의 HEX 값) 정도로 나타나기 때문에 100개의 파일을 전체를 비교하는 것보다, 100개 파일의 해시값을 만들어서 40자리 숫자만 비교하면 훨씬 빠르겠지요.

두 번째 특징은, 입력 데이터가 조금만 달라져도 전혀 다른 출력 결과를 가진다는 것입니다. 아주 약간의 입력 데이터가 달라져도 전혀 다른 출력 결과를 가지기 때문에, 쉽게 검출 할 수 있습니다. 이 두가지 특징을 아래 그림을 통해 확인할 수 있습니다.

세 번째 특징은, 출력된 데이터로부터 입력된 데이터를 추정할 수 없다는 것입니다. 압축이 압축된 파일로부터 역변환을 통해 원본 파일을 만들어 내는 것과는다르게, 해시의 출력으로는 입력 데이터가 무엇이었는지 추정하는 것이 매우 어렵습니다. 당연히 해시 함수를 통해 원본(입력 데이터)을 만들어 낼 수는 없습니다. 100개의 파일에 대한 해시값을 누군가에게 알려줘도 파일의 내용은 유출되지 않겠네요.

네 번째 특징은, 충돌 저항성이라는 것으로, 출력 값과 동일한 두개의 데이터가 존재하는 입력 데이터를 찾을 수 없다는 것을 의미합니다. 만약, 100개의 파일을 통해 출력 값을 만들어 냈는데, 위변조 된 100개의 파일도 동일한 출력 값을 나타낸다면 무결성 검증에 사용할 수 없겠지요. 따라서 해시 함수는 이런 결과가 발생하지 않도록 설계되었으며, 이러한 특징을 충돌 저항성이라고 얘기합니다.

이번 편에서는 해시 함수가 어떤 기능과 목적으로 사용되는지와 해시 함수의 특징에 대해 알아보았습니다. 요약하면, 해시 함수는 무결성 검증을 빠르고 간편하게 하기 위한 목적으로 사용이됩니다. 다음 편에서는 해시 함수가 블록체인에서 어떻게 사용되는지에 대해서 알아보겠습니다.

Last updated