설명
계산 비용이 낮은 일반 해시를 비밀번호에 직접 적용하면, 공격자가 유출된 해시를 대상으로 많은 후보를 빠르게 시험할 수 있습니다. 특히 약하거나 재사용된 비밀번호는 추측 공격으로 복구될 위험이 커집니다.
잠재적 영향
- 비밀번호 크래킹: 공격자가 빠른 해시 알고리즘을 이용해 비밀번호를 쉽게 추측하고 탈취할 수 있습니다.
- 계정 탈취: 탈취된 비밀번호를 통해 공격자가 계정을 탈취할 수 있습니다.
- 데이터 유출: 공격자가 시스템에 접근하여 민감한 데이터를 유출할 수 있습니다.
해결 방법
- 비밀번호 전용 해시 사용: Argon2id, bcrypt, scrypt 또는 충분한 반복 횟수의 PBKDF2처럼 의도적으로 계산 비용이 큰 비밀번호 해시를 사용합니다.
- 일반 해시와 구분: SHA-256 같은 일반 해시는 파일·메시지 무결성 확인에는 적합하지만, 비밀번호 저장에는 너무 빠르므로 직접 사용하지 않습니다.
- 검증된 라이브러리와 파라미터 사용: 사용자별 고유 솔트를 자동 관리하는 라이브러리를 사용하고 비용 파라미터를 운영 환경에서 벤치마크해 설정합니다.
- 최신 보안 지침 준수: OWASP, NIST 등의 최신 보안 지침을 준수합니다.
예시
비밀번호 해싱
변경 전
MD5:
python
# Unsafe password hashing with MD5
import hashlib
password = b'mypassword'
hashed_password = hashlib.md5(password).hexdigest()
SHA-1:
python
# Unsafe password hashing with SHA-1
import hashlib
password = "mypassword"
hashed_password = hashlib.sha1(password.encode()).hexdigest()
변경 후
Bcrypt:
python
# Safe password hashing with bcrypt
import bcrypt
def hash_password(password):
salt = bcrypt.gensalt(rounds=12)
hashed = bcrypt.hashpw(password.encode(), salt)
return hashed
password = "mysecretpassword"
hashed_password = hash_password(password)
Argon2:
python
# Safe password hashing with Argon2
from argon2 import PasswordHasher
def hash_password(password):
ph = PasswordHasher()
return ph.hash(password)
password = "mysecretpassword"
hashed_password = hash_password(password)
일반 데이터 무결성 해시 (비밀번호 아님)
python
# SHA-256은 비밀번호가 아닌 일반 데이터의 무결성 확인에 사용
import hashlib
document = b'document contents'
document_digest = hashlib.sha256(document).hexdigest()
설명:
- 변경 전: MD5와 SHA-1은 비밀번호 저장에 부적합하며, SHA-256·SHA-512·SHA-3 같은 빠른 일반 해시도 비밀번호에 직접 적용하면 오프라인 크래킹에 취약합니다.
- 변경 후: 비밀번호에는 비용 조절과 고유 솔트를 제공하는 bcrypt 또는 Argon2id 같은 전용 알고리즘을 사용합니다. SHA-256 예시는 비밀번호가 아닌 일반 데이터의 무결성 확인 용도로만 구분했습니다.