안전하지 않은 비밀번호 저장 또는 빠른 해시 사용

안전하지 않은 비밀번호 저장 또는 빠른 해시 사용

설명

비밀번호를 평문으로 저장하거나 MD5, SHA 계열 같은 빠른 범용 해시로 저장하면 유출 시 오프라인 대입 공격에 취약합니다.

잠재적 영향

  • 데이터베이스 또는 로그 유출만으로 계정 탈취 위험이 커집니다.
  • 빠른 해시는 GPU 기반 대입 공격에 매우 취약합니다.

해결 방법

  • bcrypt, scrypt, Argon2id, PBKDF2처럼 비용을 조절할 수 있는 전용 비밀번호 해시를 사용하세요.
  • 기존 빠른 해시는 로그인 성공 시 전용 비밀번호 해시로 다시 저장해 점진적으로 전환하세요.

예시

비밀번호 저장 방식만 비교하는 발췌입니다. bcrypt 비용은 배포 환경에서 측정하고, 72바이트를 초과하는 입력은 오류로 처리하세요.

변경 전

go
user.SetPasswordHash(sha256.Sum256([]byte(password)))

변경 후

go
package example

import "golang.org/x/crypto/bcrypt"

type passwordHashStore interface {
    SetPasswordHash([]byte)
}

func storePassword(user passwordHashStore, password string) error {
    hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return err
    }
    user.SetPasswordHash(hash)
    return nil
}

설명:

  • 변경 전: 비밀번호를 평문으로 저장하거나 SHA/MD5 같은 빠른 범용 해시로 저장하면, 데이터베이스 또는 로그가 유출되었을 때 공격자가 오프라인 대입 공격으로 원문 비밀번호를 빠르게 복구할 수 있습니다.
  • 변경 후: 비용 조절이 가능한 bcrypt 해시를 저장해 유출 후에도 오프라인 대입 공격 비용을 높입니다. 해시 생성 오류를 확인하므로 너무 긴 비밀번호 등의 오류에서 nil 또는 유효하지 않은 해시를 저장하지 않습니다.

참조