보안/암호화 알고리즘

SHA-256은 왜 비밀번호 해싱에 위험할까? 안전한 비밀번호 저장법 - 코드카인 티스토리

CodeCaine Explorer 2025. 1. 23. 09:27
728x90
반응형
SMALL

안녕하세요😊 코드카인 여러분!

오늘은 "SHA-256과 비밀번호 해시 알고리즘의 차이"라는 주제로 이야기를 나눠볼 거예요. 비밀번호를 보호할 때 흔히 사용하는 해시 알고리즘이 왜 단순한 해시 알고리즘과 다른지 궁금하지 않으신가요? 보안의 핵심을 함께 파헤쳐 보아요! 🔒


SHA-256이란? 🍩 단단한 도넛 같아요!

SHA-256은 Secure Hash Algorithm 256-bit의 약자로, 입력값을 고정된 길이의 256비트(32바이트) 해시로 변환해주는 암호화 해시 함수예요. 예를 들어, 도넛 반죽(입력값)을 굽는다고 생각해보세요. 반죽 크기나 모양과 상관없이 매번 똑같이 딱딱한 도넛(출력값)이 나오는 거예요!

  • 특징
    • 입력값이 같으면 항상 같은 출력값을 생성.
    • 입력값이 조금이라도 다르면 완전히 다른 출력값(해시)을 생성.
    • 되돌릴 수 없어요(단방향 암호화). 즉, 도넛을 다시 반죽으로 되돌릴 수 없는 것처럼요.

SHA-256은 주로 데이터 무결성 검증, 디지털 서명, 인증서 등에 사용되며, 비밀번호 해싱에는 단독으로 적합하지 않아요.


비밀번호 해시 알고리즘 🧂 설탕 가루를 추가한 도넛

비밀번호 해시 알고리즘은 단순한 해시 함수(SHA-256 같은 것)를 사용하지 않고, 여기에 추가적인 보안 기능을 더한 알고리즘이에요. 단순한 SHA-256과 다른 점은 무엇일까요? 🧐

1. 소금(Salt) 추가

  • 같은 비밀번호라도 매번 다른 해시값을 생성하기 위해 랜덤 데이터를 추가해요.
  • 예: 비밀번호 password123randomSalt를 더해 해시를 생성.
  • 💡 왜 필요할까요?
    • 만약 소금이 없으면 같은 비밀번호를 가진 모든 사용자가 동일한 해시값을 가지게 돼요. 해커는 해시값만 보고도 비밀번호를 추측할 수 있겠죠?

2. 반복 작업

  • 단순한 SHA-256은 매우 빠르지만, 빠른 속도는 보안에 오히려 취약할 수 있어요.
  • 비밀번호 해시 알고리즘은 작업을 일부러 느리게 만들어서, 해커가 모든 경우의 수를 시도하는 걸 어렵게 만들어요.
  • 예: PBKDF2, bcrypt, Argon2는 반복 작업으로 보안을 강화해요.

3. 브루트 포스 방지

  • 단순한 해시 함수는 빠르게 계산되기 때문에 해커가 모든 조합을 시도하는 데 유리해요.
  • 반면, 비밀번호 해시 알고리즘은 계산을 느리게 만들어 브루트 포스 공격을 어렵게 만들어요.

SHA-256과 비밀번호 해시 알고리즘의 주요 차이점 비교 🔍

특징 SHA-256 비밀번호 해시 알고리즘
소금(Salt) 지원하지 않음 필수적으로 사용
반복 작업 빠르게 처리 일부러 느리게 처리
용도 데이터 무결성, 서명 비밀번호 저장
보안 수준 비밀번호 저장에는 부족 비밀번호 보호에 적합

왜 SHA-256을 비밀번호 저장에 쓰면 안 될까요? 😱

  1. 공격자가 쉽게 해독 가능
    • 빠른 속도로 계산되는 SHA-256은 해커가 무작위 대입 공격(브루트 포스)을 빠르게 실행할 수 있어요.
  2. 레인보우 테이블 공격
    • 해커가 미리 다양한 비밀번호와 대응하는 해시값을 저장해둔 테이블을 이용해 비밀번호를 쉽게 유추할 수 있어요.
  3. 소금이 없어서 보안 취약
    • 같은 비밀번호를 가진 사용자는 같은 해시값을 가지게 되므로, 해커가 쉽게 특정 패턴을 찾아낼 수 있어요.

실전 코드 예제 🖥️

SHA-256 코드 예제

import hashlib

# SHA-256 해싱
password = "password123"
hashed = hashlib.sha256(password.encode()).hexdigest()
print("SHA-256 해시:", hashed)

bcrypt 코드 예제 (비밀번호 해시 알고리즘)

import bcrypt

# 비밀번호 해싱
password = "password123".encode()
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password, salt)

print("bcrypt 해시:", hashed)

😊 마무리하며...

SHA-256은 강력한 해시 알고리즘이지만, 비밀번호 보호에 적합하지 않다는 사실을 알게 되었죠? 비밀번호는 bcrypt, Argon2 같은 전용 해시 알고리즘을 사용해야 더욱 안전하게 보호할 수 있어요. 여러분의 데이터와 보안을 위해, 오늘 배운 내용을 꼭 활용해보세요! 🔒

728x90
반응형
SMALL