비밀번호 대상으로 취약한 일반 해시 함수 사용
Use of Password Hash with Insufficient Computational Effort
설명
비밀번호에 SHA-2/3, BLAKE2 같은 일반 해시를 직접 적용하면 연산 비용이 낮아 GPU/ASIC로 매우 빠르게 크래킹할 수 있습니다. 비밀번호는 입력 공간이 좁고 사용자가 재사용하는 경향이 있어, 공격자가 유출된 해시를 입수하면 사전에 준비한 dictionary/wordlist나 brute-force로 짧은 시간 내 복구가 가능합니다. 이 취약점은 해시가 유출되거나 백업·로그에 노출될 때 오프라인 크래킹이 특히 쉬워져 계정 탈취로 이어질 수 있습니다.
잠재적 영향
계정 탈취: 빠른 오프라인 크래킹으로 원문 비밀번호를 복구해 계정에 로그인할 수 있습니다.
크리덴셜 재사용에 따른 연쇄 침해: 한 서비스에서 털린 비밀번호로 다른 서비스까지 무단 접속이 가능해집니다.
데이터 유출 확대: 관리자 계정 탈취 시 더 넓은 범위의 시스템/데이터에 접근 가능합니다.
규정/컴플라이언스 위반: OWASP, NIST 권고 위반으로 보안 감사에서 지적 및 제재 위험이 있습니다.
해결 방법
전용 Password Hashing 함수 사용: Argon2id(권장), scrypt, bcrypt, PBKDF2 중 하나를 사용하십시오.
강한 파라미터 설정:
Argon2id: time_cost ≥ 3, memory_cost ≥ 64MB, parallelism ≥ 2 (환경에 맞게 벤치마크로 조정)
PBKDF2: iterations ≥ 310,000 (SHA-256 기준, 서버 성능에 맞춰 상향)
bcrypt: cost(work factor) 12 이상 권장
scrypt: N/r/p를 서버 성능에 맞춰 충분히 크게 설정
솔트(salt): 사용자마다 고유한 랜덤 salt(≥16바이트)를 생성해 저장하십시오. 재사용 금지.
페퍼(pepper): 추가로 서버 비밀 키(예: HSM/환경변수)에 보관하고 해싱 전에 결합해 유출 시 위험을 낮추십시오.
안전한 비교: 검증 시 constant-time 비교(hmac.compare_digest 등)를 사용하십시오.
비밀번호 정책: 최소 길이, 복잡도, 입력 최대 길이 제한, rate limiting/계정 잠금으로 온라인 공격도 완화.
검증된 라이브러리 사용: argon2-cffi, passlib 등 표준 라이브러리를 사용하고 자체 구현은 피하십시오.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드:
sha3_256 같은 빠른 일반 해시는 계산 비용이 낮아 GPU/ASIC로 매우 빠르게 brute-force가 가능합니다.
정적 salt를 사용해 동일 비밀번호의 해시가 사용자 간 동일해지며 rainbow table 대응이 약화됩니다.
문자열 비교는 constant-time이 아니어서 타이밍 기반 정보 누출 위험이 있습니다.
안전한 코드:
Argon2id는 메모리-하드 특성으로 대규모 병렬 크래킹 비용을 크게 증가시킵니다.
PasswordHasher가 각 해시에 랜덤 salt를 자동 포함하여 사용자별 고유성이 보장됩니다.
verify를 사용해 안전하게 검증하며, 파라미터는 서버 성능을 기준으로 벤치마크 후 상향 조정 가능합니다.
참조
Last updated