Computer Science/Blockchain

[Blockchain] 블록체인(Blockchain)에서 해시(Hash)란?

Henry Cho 2023. 12. 3. 13:52

블록체인(Blockchain)에서 해시(Hash)란?

포스트 난이도: HOO_Junior


# Hash

우리가 해시 (Hash)에 대해서 알아보기 위해 검색을 해보면 "해시 함수는 임의 길이의 입력값을 받아 고정된 길이의 출력값을 생성하는 함수"라는 문장으로 시작되며 해시를 소개하는 많은 글들을 살펴볼 수 있다. 해시에 대해서 다뤄본 적이 있거나 이미 알고 있다면 해당 문장이 무슨 의미를 나타내는지 한 번에 이해할 수 있지만 처음 해시에 대해서 알아보고자 하는 브로들에게는 여기서 블록체인에 대한 흥미를 떨어지게 만들 수 있다. 한마디로 압축적으로 한 문장 안에서 해시에 대한 설명을 하려고 하니 무슨 말인지 이해가 잘 되지 않는다. (사실 글쓴이가 논문을 쓸 때마다 실수하는 부분 중 하나다.)

해시에 대해서 간단히 말하자면 데이터를 한문장의 고유한 값으로 만드는 것이다. 마치 한국 대학생 브로들에게 내려오는 족집게 시험 자료, 또는 시험 요약본처럼 교수님의 수많은 강의 내용들을 간략하게 문장을 재구조화하여 저장한다고 생각하면 된다. 조금 더 이해를 돕고자 글쓴이가 만든 데이터를 해시로 만드는 간단한 프로그램을 통해서 시각적으로 이해도를 높여보도록 하자. 아래의 예제코드는 파이썬 기반으로 만들어진 코드이며, 텍스트 데이터를 해시값으로 산출해 준다. 아래의 코드는 HOOAI 주인장 코드이니 우리 브로들은 공부할 때 사용하면 된다.


import tkinter as tk
from tkinter import StringVar
import hashlib

def update_hash():
    data = data_text.get("1.0", tk.END).strip()
    hash_object = hashlib.sha256(data.encode())
    hash_hex = hash_object.hexdigest()
    hash_var.set(hash_hex)

# Main window
root = tk.Tk()
root.title("SHA-256 Hash Generator")
root.geometry("500x200")

hash_var = StringVar()
hash_var.set("")

tk.Label(root, text="Data").grid(row=0, column=0, sticky="nw")
data_text = tk.Text(root, height=5, width=40)
data_text.grid(row=0, column=1)

generate_button = tk.Button(root, text="Generate Hash", command=update_hash)
generate_button.grid(row=1, column=1, sticky="ew")

tk.Label(root, text="Hash").grid(row=2, column=0, sticky="nw")
hash_label = tk.Entry(root, textvariable=hash_var, state='readonly', width=40)
hash_label.grid(row=2, column=1)

root.mainloop()

Figure 1. 해시가 생성되는데 시간이 걸릴 수 있다.


https://github.com/WhoisHOO/blockchain/blob/main/simple_hash_generator_sha256


위의 코드를 돌려보면 알겠지만 (안 돌려본 브로는 직접 돌려보고 오길 바란다. 일단 Generate Hash를 하고 나서 다시 데이터를 변경하고 해시를 누르면 새로운 해시값이 나와야하는데 버튼이 클릭이 잘 안 된다. 간단한 프로그램이다 보니 해시가 새롭게 생성되는데 시간이 걸릴 수 있으니 짜증 내지 말고 기다리면 바뀐 해시값을 확인할 수 있다. 이처럼 긴 텍스트를 입력하거나 짧은 텍스트를 입력하더라도 해시로 전환하며 임의의 숫자와 알파벳으로 구성된 해시값이 나오지만 균일한 길이의 정렬된 해시값들이 나오는 걸 알 수 있다. 반대로 저장된 해시값을 입력해서 다시 Original data를 산출해 낼 수도 있을 것 같아 보이지만 현실적으로 어렵다. 불가능한 것은 아니지만 사실상 불가능하기 때문에 해시가 가진 보안성의 장점이 여기에 있다. 하지만 해시값을 통해서 원본 데이터가 언제, 어떻게 바뀌었는지를 추적해 낼 수 있기에 데이터 트랜잭션에 있어서 중요한 역할을 한다.


# 해시의 장점

해시를 너무 어렵게만 생각하는데 사실 이처럼 재미있고 단순한 구조를 가지고 있다. (원래 어려운 걸 알려주기 전에 쉽다고 다들 속인다.) 앞선 제너레이터를 통해서 직접 해보면서도 느낄 수 있지만 해시는 데이터 저장, 관리, 보완 등의 측면에서 활용도가 매우 높다걸 알 수 있다. 간단한 텍스트뿐만 아니라 이미지나 영상, 또는 주요 문서 등도 해시를 활용해서 간단하게 저장하고 관리가 용이하다. 해시를 사용하게 된 이유는 데이터의 무결성, 즉 데이터의 오류가 있는지를 파악하기 위해서였지만 이제는 데이터 자체의 수정이나 조작에 대한 부분을 검증하는 데에도 해시가 큰 역할을 한다. 또한 데이터를 저장하고 보관하는 데에도 해시는 편리함을 가져다준다. "아니 해시를 다시 디코딩해서 원본 데이터를 가질 수 없다면서요!"라고 할 수 있는데, 여기서 말하는 편리함은 데이터의 거래내역이나 수정되는 부분을 데이터 원본을 일일이 저장할 필요 없이 해시값만 가지고 비교하고 확인이 가능하다는 점이다. 예를 들어서 우리가 은행 앱을 통해서 거래내역을 눌러서 간편하게 확인이 가능하듯이 굳이 가계부나 장부를 일일이 들고 다니고 하나하나 비교해 볼 필요가 없이 데이터 또한 해시값을 통해서 확인이 가능하다는 것이다.


# Digital Commodities, 데이터 상품

해시의 이러한 장점은 블록체인과 더불어 데이터 상품이 생성되기 시작하면서 부각되었다. 이제는 비트 코인과 같이 암호화화폐 뿐만 아니라 탄소 크레디트와 같이 가상 자산과 가상의 데이터 상품에 대한 가치가 실물 가치와 동일하게 받아들이고 거래가 이루어지기 시작했다. 이러한 점에서 기존의 인터넷 방식의 데이터 송수신은 실물 가치와 비슷한 가치를 지닌 가상의 데이터 상품들에게는 아주 치명적이다. 따라서 블록체인 기반의 Web3와 같이 해시를 활용한 데이터 상품의 무결성과 투명성을 입증할 수 있는 방법과 수단들이 활용되고 있다.


 

728x90