개발 일반

Hashing(해싱) 개념 정리

애기공룡훈련병 2025. 2. 15. 22:08
반응형

1. 해싱(Hashing)이란?

해싱(Hashing)은 데이터를 일정한 길이의 고유한 값(해시값)으로 변환하는 과정입니다. 해싱은 암호학적 보안, 데이터 무결성 검사, 빠른 데이터 검색 등 다양한 용도로 사용됩니다.

해싱의 특징은 다음과 같습니다.

  • 단방향 변환: 해시값을 통해 원래 데이터를 복원할 수 없음
  • 고정된 길이 출력: 입력 데이터의 크기와 상관없이 해시값의 길이는 일정함
  • 고유성(Uniqueness): 서로 다른 입력은 서로 다른 해시값을 생성해야 함
  • 고속 연산: 해시 함수는 빠르게 계산 가능해야 함
  • 충돌 방지(Collision Resistance): 같은 해시값을 가지는 서로 다른 입력값(충돌)이 최대한 적어야 함

2. 해시 함수(Hash Function)란?

해시 함수(Hash Function)는 입력 데이터를 일정한 규칙에 따라 해시값으로 변환하는 알고리즘입니다. 일반적으로 다음과 같은 요구 사항을 충족해야 합니다.

(1) 일방향성 (One-way property)

입력값을 해시값으로 변환하는 것은 쉽지만, 해시값을 통해 원래 입력값을 알아내는 것은 불가능해야 합니다.

(2) 충돌 저항성 (Collision resistance)

두 개의 서로 다른 입력값이 같은 해시값을 갖지 않아야 합니다. 즉, 해시 함수는 같은 결과를 가지는 두 개의 다른 입력을 생성하기 어렵도록 설계되어야 합니다.

(3) 빠른 연산 (Efficiency)

해시 함수는 빠르게 연산이 가능해야 하며, 큰 데이터를 처리할 때도 성능이 뛰어나야 합니다.

(4) 작은 변화에 대한 큰 차이 (Avalanche Effect)

입력값의 한 비트만 변경되어도 해시값이 완전히 달라지는 성질이 있어야 합니다.

 

3. 대표적인 해시 함수

(1) MD5 (Message Digest Algorithm 5)

  • 128비트(16바이트) 길이의 해시값을 생성
  • 빠르지만 보안 취약점이 발견되어 현재는 보안 목적으로 사용되지 않음

(2) SHA (Secure Hash Algorithm) 시리즈

  • SHA-1: 160비트 길이의 해시값을 생성하지만 충돌이 발견됨
  • SHA-256: 256비트 길이의 해시값을 생성하여 높은 보안성을 가짐
  • SHA-512: 512비트 길이로 더욱 강력한 보안성 제공

(3) BLAKE2 & Argon2

  • 최신 해시 알고리즘으로 보안성과 성능이 뛰어나며, 패스워드 저장 등에 최적화됨

4. 해싱의 활용 사례

(1) 데이터 무결성 검사

파일 다운로드 시 해시값을 비교하여 데이터가 손상되지 않았음을 확인할 수 있습니다.

예제:

  • 파일 A의 SHA-256 해시값: a12b34c567de89f0g123456789123a12
  • 다운로드한 파일 B의 SHA-256 해시값이 다르면 파일이 변조되었을 가능성이 있음

(2) 비밀번호 저장

웹사이트에서 사용자의 비밀번호를 직접 저장하면 보안 문제가 발생할 수 있습니다. 이를 방지하기 위해 비밀번호를 해시값으로 변환하여 저장합니다.

예제:

  1. 사용자가 비밀번호 examplepassword123을 입력
  2. 해시 함수(SHA-256) 적용 → a12b34c567de89f0g123456789123a12
  3. 데이터베이스에는 원본 비밀번호가 아닌 해시값 저장
  4. 로그인 시 입력한 비밀번호를 다시 해싱하여 비교

(3) 블록체인

블록체인은 블록의 무결성을 보장하기 위해 해싱을 사용합니다.

각 블록은 이전 블록의 해시값을 포함하고 있어 데이터 위변조가 어렵습니다.

(4) 디지털 서명

전자 계약서, 이메일 인증 등에 활용되며, 데이터의 출처를 확인하는 데 사용됩니다.

(5) 데이터베이스 검색 최적화

해시 테이블(Hash Table) 구조를 이용하여 데이터 검색 속도를 최적화할 수 있습니다.

 

5. 해싱 과정 예제 (Python 코드 포함)

SHA-256 해싱 예제

import hashlib

def hash_string(input_string):
    return hashlib.sha256(input_string.encode()).hexdigest()

# 예제 실행
input_data = "hello world"
hash_result = hash_string(input_data)
print(f"입력: {input_data}")
print(f"SHA-256 해시값: {hash_result}")

해싱과 충돌 방지 실험

input1 = "password123"
input2 = "password124"

hash1 = hash_string(input1)
hash2 = hash_string(input2)

print(f"입력1: {input1}, SHA-256: {hash1}")
print(f"입력2: {input2}, SHA-256: {hash2}")
  • 단 한 글자만 바꿨음에도 완전히 다른 해시값이 생성됨
 

6. 해시 충돌(Collision)이란?

해시 함수가 제한된 길이의 값을 생성하기 때문에, 이론적으로는 서로 다른 두 개의 입력값이 동일한 해시값을 가질 수 있습니다. 이를 충돌(Collision) 이라고 합니다.

예제: MD5 해시에서 충돌이 발생할 가능성이 존재

입력1: "hello123"
MD5 해시값: 5d41402abc4b2a76b9719d911017c592

입력2: "hello124"
MD5 해시값: 5d41402abc4b2a76b9719d911017c592 (같을 가능성이 있음)
  • 최신 알고리즘(SHA-256, SHA-512)은 이러한 충돌 가능성을 줄이도록 설계됨

 

반응형