🧾 Codetest/알고리즘

[알고리즘] SHA-256 해시 알고리즘: 개념과 활용

heywantodo 2025. 2. 21. 11:20
728x90
반응형

[알고리즘] SHA-256 해시 알고리즘: 개념과 활용

SHA-256(Secure Hash Algorithm 256)SHA-2 계열의 암호학적 해시 함수 중 하나로,

입력된 데이터를 256비트(32바이트)의 고정된 길이 해시 값으로 변환하는 알고리즘이다.

 

이 알고리즘은 강력한 보안성과 낮은 충돌 가능성을 제공하여 다양한 보안 애플리케이션에서 사용된다.

 

SHA-256의 내부 동작 방식

1) 입력 데이터 패딩 (Padding)

  • 입력 데이터의 길이를 512비트의 배수가 되도록 추가적인 비트를 붙인다.
  • 마지막 64비트는 원래 메시지의 길이를 저장한다.

 

2) 초기 해시 값 설정(Initial Hash Value)

  • 8개의 고정된 초기 해시 값(32비트씩 8개, 총 256비트)이 설정된다.

 

3) 메시지 블록 처리(Message Processing)

  • 입력 데이터를 512비트 블록 단위로 나누어 처리한다.
  • 64번의 반복적인 연산을 통해 해시 값을 생성한다.

 

4) 압축 함수(Compression Function) 적용

  • 비트연산, 논리연산 등을 활용하여 데이터를 변환한다.

 

5) 최종 해시 값 출력

  • 최종적으로 256비트(32바이트) 크기의 해시 값이 생성된다.

 

SHA-256의 주요 특징

1) 입력 크기와 출력 크기

  • 입력 데이터의 크기는 제한이 없지만, 출력 값은 항상 256비트(32바이트) 길이를 가진다.
  • 입력 데이터가 아무리 커도 출력은 항상 일정한 길이를 유지한다.

 

2) 일방향성 (One-Way Function)

  • 해시 값을 통해 원래의 입력 데이터를 복원하는 것은 사실상 불가능하다.
  • 비밀번호 저장, 디지털 서명 등에 적합하다.

 

3) 작은 변경에도 완전히 다른 결과 (Avalanche Effect)

  • 입력값이 아주 조금만 변해도 출력 값이 완전히 달라진다.
  • 이를 통해 데이터의 변조 여부를 쉽게 확인할 수 있다.

 

4) 충돌 저항성 (Collision Resistance)

  • 서로 다른 두 입력 값이 동일한 해시 값을 가질 확률이 극도로 낮다.
  • MD5나 SHA-1과 비교하여 더 강력한 보안성을 제공한다.
💡 MD5와 SHA-1의 구조적 취약점?

MD5는 128비트의 해시 값을 생성하는데, 이는 서로 다른 두 입력값이 동일한 해시 값을 갖는 충돌(collision)을 발견하는 것이 현실적으로 가능하다. 이는 인증서 등 보안이 중요한 분야에서 위조 및 변조를 허용할 수도 있다.

SHA-1은 160비트의 해시 값을 생성하지만, 연구를 통해 충돌을 발견하는 데 필요한 연산 복잡도가 예상보다 낮아졌다. 이는 공격자가 서로 다른 두 메시지에 대해 동일한 해시 값을 생성하여 보안 시스템을 우회할 수 있음을 의미한다.

 

SHA-256의 활용

1) 비밀번호 저장

웹사이트에서는 사용자의 비밀번호를 평문(Plain Text)으로 저장하는 대신, SHA-256을 사용하여 안전하게 저장한다.

하지만 단순 해싱만으로는 안전하지 않기 때문에, 솔트(Salt) 기법과 함께 사용한다. 

💡 솔트(Salt) 란?

비밀번호 해싱 시 추가적인 무작위 데이터를 삽입하여 보안성을 높이는 방법이다.
해시 값이 동일하면 비밀번호도 동일하다고 쉽게 유추할 수 있기 때문에, 솔트를 추가하여 같은 비밀번호라도 서로 다른 해시 값을 생성하도록 한다.
import hashlib
import os

def hash_password(password):
    # 16바이트 랜덤 솔트
    salt = os.urandom(16)
    hash_value = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
    # 16진수로 변환
    return salt.hex() + hash_value.hex()

passwd = "mypassword"
hashed_passwd = hash_password(passwd)

print(f"해싱된 비밀번호 : {hashed_passwd}")

 

2) 블록체인 보안

SHA-256은 비트코인의 작업 증명(Proof of Work) 알고리즘에서 사용된다. 비트코인의 블록 헤더는 SHA-256 해시 함수를 통해 해싱되며, 마이닝 과정에서 특정 조건을 만족하는 해시 값을 찾는 것이 목표다.

import hashlib

data = "Bitcoin Block"
hash_value = hashlib.sha256(data.encode()).hexdigest()
print(f"SHA-256 해시 : {hash_value}")

 

3) 디지털 서명 & 데이터 무결성 검증

소프트웨어 다운로드 시 SHA-256 해시 값을 제공하여 파일이 변조되지 않았는지 확인할 수 있다.

import hashlib

def get_file_hash(filename):
    sha256 = hashlib.sha256()
    with open(filename, 'rb') as f:
        while chunk := f.read(4096):
            sha256.update(chunk)
    return sha256.hexdigest()

# 파일 해시 값 출력
file_hash = get_file_hash("example.txt")
print(f"파일의 SHA-256 해시 값 : {file_hash}")

 

728x90
반응형