[알고리즘] SHA-256 해시 알고리즘: 개념과 활용
[알고리즘] 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}")