비밀번호 해시에 취약한 알고리즘 사용

Use of Password Hash with Insufficient Computational Effort

설명

비밀번호를 MD5, SHA-1 같은 빠른 범용 해시로 저장하면, 공격자가 해시값을 탈취했을 때 GPU/클라우드로 매우 빠르게 대입 공격(brute force)과 사전 공격을 수행할 수 있습니다. 솔트가 없거나 코스트(반복/메모리)가 낮으면 더욱 취약합니다. 결과적으로 해시에서 원문 비밀번호를 복구해 계정 탈취로 이어질 수 있습니다. 주된 악용 방식은 데이터베이스 유출·백업 노출 등으로 해시를 획득한 뒤, 도구(Hashcat 등)로 대량 크래킹을 시도하는 것입니다.

잠재적 영향

  • 계정 탈취: 해시가 빠르게 크랙되어 사용자 계정에 무단 로그인 가능

  • 권한 상승: 탈취한 관리자/운영 계정으로 시스템 통제 권한 확보

  • 데이터 유출: 계정 접근을 통해 민감 정보 조회 및 다운로드

  • 크리덴셜 스터핑 확대: 복구한 비밀번호를 다른 서비스에 재사용 시도

  • 규정 준수/평판 손상: 보안 기준 미준수로 법적·신뢰도 리스크 발생

해결 방법

  • 비밀번호에는 전용 알고리즘 사용: Argon2id(권장), bcrypt, scrypt, PBKDF2

  • 충분한 비용 설정: bcrypt cost(1014), PBKDF2 ≥ 120k iterations(SHA-256/512), scrypt(N≈2^14, r=8, p≥1), Argon2id(time≥24, memory≥64MB 수준)

  • 고유 솔트(salt) 적용: 사용자별 최소 16바이트 이상 CSPRNG로 생성, 해시와 함께 저장

  • 필요 시 페퍼(pepper) 추가: 앱/환경변수 또는 HSM에 보관, 해싱 전 비밀번호에 추가

  • 약한 해시 마이그레이션: 로그인 시 감지하여 강한 알고리즘으로 재해싱(rehash-on-login)

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: MD5는 매우 빠른 해시로 설계되어 GPU/ASIC에서 초당 막대한 시도로 크랙이 가능합니다. 솔트/코스트가 없어 대입·사전 공격과 레인보우 테이블 공격에 특히 취약합니다.

  • 안전한 코드: bcrypt는 각 비밀번호에 고유한 솔트를 포함하고, 코스트 팩터로 연산량을 크게 늘려 대입 공격 비용을 높입니다. 예시 코드는 코스트 12를 사용해 안전하게 저장하고, 비교 시 bcrypt.compare로 검증합니다.

참조

Last updated