해시 함수 (Hash Function)
해시 함수(Hash Function)는 임의의 크기 데이터를 고정 크기 데이터로 매핑하는 데 사용할 수 있는 모든 수학 함수입니다. 같은 입력에는 항상 같은 출력(해시값, 다이제스트)이 나옵니다. 암호화에서 쓰는 암호학적 해시 함수는 출력에서 입력을 되찾기 어려운 단방향 함수이며, 블록체인에서는 블록 연결, 주소 생성, 디지털 서명, 작업 증명 채굴 등에 쓰입니다.
암호학적 해시 함수의 성질
- 고정 길이 출력: 작은 거래 확인서를 입력하든 전체 거래 내역을 입력하든 출력은 항상 같은 길이입니다. 예를 들어 SHA-256의 출력은 언제나 256비트입니다.
- 역상 저항성(단방향성): 해시값만 보고 그 해시값을 만드는 입력을 찾는 것이 계산상 사실상 불가능합니다.
- 제2 역상 저항성: 어떤 입력이 주어졌을 때, 같은 해시값을 내는 다른 입력을 찾기 어렵습니다.
- 충돌 저항성: 같은 해시값을 내는 서로 다른 두 입력을 찾기 어렵습니다.
- 눈사태 효과: 입력이 한 비트만 바뀌어도 출력이 완전히 달라지므로, 데이터가 조금이라도 변조되면 쉽게 드러납니다.
실생활 예시
- 도서관 도서 코드: 도서관에 크기가 제각각인 책이 있다고 생각해 보십시오. 해시 함수는 책의 길이에 관계없이 책의 내용으로부터 같은 길이의 코드를 계산하는 것과 같습니다. 코드의 가짓수는 유한하므로 이론상 서로 다른 책이 같은 코드를 받을 수 있지만, 좋은 해시 함수에서는 그런 쌍을 찾는 것이 사실상 불가능합니다.
- 베이킹 레시피: 여러 재료(데이터)를 섞어 케이크(해시)를 굽는 과정을 생각해 보십시오. 재료의 종류나 양과 관계없이 결과물은 항상 같은 크기의 케이크 1개이고, 구운 케이크를 다시 재료로 되돌릴 수는 없습니다.
주요 용도
- 데이터 무결성 검증: 파일이나 메시지의 해시값을 함께 공개하면, 받은 쪽이 다시 해시를 계산해 비교함으로써 변조 여부를 확인할 수 있습니다.
- 블록체인 구조: 각 블록은 이전 블록의 해시를 담고 있어, 과거 블록을 고치면 이후 모든 블록의 연결이 깨집니다. 블록 안의 거래는 머클 트리로 해시되어 하나의 루트 해시로 요약됩니다.
- 비밀번호 저장: 시스템은 비밀번호를 일반 텍스트로 저장하는 대신 해시값을 저장하고, 로그인할 때 입력된 비밀번호의 해시와 비교합니다. 누군가 저장된 정보에 접근하더라도 해시에서 실제 비밀번호를 직접 알아내기는 어렵습니다. 다만 짧거나 흔한 비밀번호는 대입 공격으로 찾아낼 수 있으므로, 실제로는 솔트를 더하고 bcrypt나 Argon2처럼 일부러 느리게 만든 함수를 씁니다.
- 디지털 서명: 긴 문서나 트랜잭션 전체 대신 그 해시값에 서명하므로, 서명의 진위성과 무결성을 효율적으로 검증할 수 있습니다.
- 작업 증명 채굴: 비트코인 같은 작업 증명 방식에서 채굴자는 블록 헤더의 논스(nonce)를 바꿔 가며 해시값이 목표값보다 작아질 때까지 계산을 반복합니다. 이런 해시를 미리 예측할 방법이 없으므로 많은 계산을 한 쪽이 블록을 추가할 가능성이 높아지며, 이것이 네트워크 보안에 기여합니다.
해시 함수의 한계
- 충돌: 두 개의 다른 입력이 동일한 해시를 생성하는 것을 충돌이라고 합니다. 출력 길이가 고정되어 있으므로 충돌은 원리상 반드시 존재합니다. 강력한 해시 함수에서는 충돌을 찾는 것이 계산상 사실상 불가능하지만, MD5나 SHA-1처럼 실제 충돌이 발견된 함수도 있습니다.
- 무차별 대입 공격: 공격자는 가능한 입력을 하나씩 해시해 원하는 해시를 생성하는 입력을 찾으려고 시도할 수 있습니다. 그렇기 때문에 강력하고 긴 비밀번호와 강력한 해시 함수를 사용하는 것이 중요합니다.
- 보안은 해시만으로 정해지지 않음: 해시 함수는 블록체인 기록을 사후에 변경하기 어렵게 만드는 요소 중 하나입니다. 다만 기록의 안전성은 해시 함수뿐 아니라 합의 메커니즘과 네트워크 참여자 분포에도 달려 있습니다.
이 글은 학습을 위한 일반 정보이며 투자 권유나 법률 자문이 아닙니다. 가상자산은 가격 변동이 크고 원금 손실 위험이 있습니다.