민감한 데이터에 취약한 해시 사용
Use of Weak Hash
설명
MD5나 SHA-1처럼 충돌에 취약한 해시 알고리즘을 비밀번호, 토큰, 인증서 등 민감한 데이터에 사용하면 안전하지 않습니다. 이들 알고리즘은 매우 빠르기 때문에 무차별 대입(브루트포스)·사전 공격이 쉽고, 충돌 생성이 가능해 검증 절차를 우회할 수 있습니다. 공격자는 충돌을 만들어 동일한 해시 값을 가진 다른 데이터를 제출하거나, 빠른 해시 특성을 이용해 해시 역추정을 시도해 비밀번호·토큰을 탈취할 수 있습니다.
잠재적 영향
인증 우회/위조: MD5·SHA-1 충돌을 이용해 다른 데이터로 동일 해시를 만들어 검증(무결성 확인, 파일/인증서 체크)을 통과할 수 있습니다.
비밀번호 탈취(브루트포스/레인보우 테이블): 빠른 해시와 솔트 미사용 시 대량 대입이 쉬워 비밀번호가 빠르게 노출될 수 있습니다.
데이터 무결성 약화: 변경 감지가 실패해 위·변조된 데이터가 정상으로 처리될 수 있습니다.
토큰/링크 서명 위조: 키 없는 단순 해시로 보호된 토큰·다운로드 링크 등은 위조될 수 있습니다.
해결 방법
비밀번호 저장
Argon2id 권장(또는 bcrypt, scrypt, PBKDF2-HMAC-SHA256). 충분한 작업량(Iterations)·메모리 비용 설정, 랜덤 Salt 필수, 비교는 constant-time(hmac.compare_digest) 사용.
예시 기준: PBKDF2-HMAC-SHA256, 310,000회 이상, 16바이트 이상 Salt.
무결성/식별 목적
단순 해시가 아닌 HMAC(SHA-256 이상)을 사용해 키 기반 무결성 검증 수행.
단순 체크섬 용도 외에는 MD5·SHA-1 사용 중단. 필요 시 SHA-256/512 또는 SHA-3 계열 사용.
마이그레이션 전략
로그인 시 재해싱(rehash)로 단계적 교체, 저장 포맷에 알고리즘/파라미터를 포함해 점진적 업그레이드 가능하게 설계.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드:
MD5/SHA-1은 충돌에 취약하고 매우 빨라 비밀번호 크래킹에 유리합니다. 솔트가 없으면 레인보우 테이블 공격까지 가능해집니다.
키가 없는 단순 해시(SHA-1)로 링크/토큰을 보호하면 공격자가 동일 해시를 만드는 데이터를 조작하거나 위조 값을 생성할 수 있습니다.
안전한 코드:
비밀번호는 PBKDF2-HMAC-SHA256으로 느리게(310k회) 계산하고, 랜덤 Salt를 사용해 브루트포스·레인보우 테이블 공격을 어렵게 만듭니다. 비교는 hmac.compare_digest로 시간 기반 사이드채널을 줄입니다.
무결성/인증은 HMAC-SHA256처럼 키 기반 MAC을 사용해 단순 해시 위조를 방지합니다. 강한 알고리즘과 안전한 키 관리로 충돌/위조 위험을 완화합니다.
참조
Last updated