설명
비밀번호를 평문으로 저장하거나 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또는 유효하지 않은 해시를 저장하지 않습니다.