전체 목록
보안Hard#439

비밀번호를 안전하게 저장하기 위해 해시와 salt를 어떻게 사용해야 하나요?

#보안#PasswordHashing#Salt#Argon2

답변 포인트

단순 SHA 해시가 아니라 bcrypt, scrypt, Argon2 같은 password hashing 알고리즘을 떠올려보세요.

정답 및 해설

빠른 요약

비밀번호는 절대 평문으로 저장하면 안 됩니다. 또한 단순히 SHA-256 같은 빠른 해시를 한 번 적용하는 것도 충분하지 않습니다.

비밀번호는 절대 평문으로 저장하면 안 됩니다. 또한 단순히 SHA-256 같은 빠른 해시를 한 번 적용하는 것도 충분하지 않습니다. 공격자가 DB를 탈취하면 GPU로 매우 빠르게 대량 대입 공격을 할 수 있기 때문입니다.

비밀번호 저장에는 bcrypt, scrypt, Argon2처럼 의도적으로 느리고 비용 조절이 가능한 password hashing 알고리즘을 사용해야 합니다. 각 비밀번호마다 고유한 salt를 생성해 함께 해싱하면, 같은 비밀번호라도 저장된 해시가 달라집니다.

Text
 = algorithm + cost + salt + hash

salt는 비밀일 필요는 없지만 사용자마다 달라야 합니다. rainbow table 공격을 어렵게 만들고, 동일 비밀번호 사용자도 구분되지 않게 합니다.

추가로 pepper를 사용할 수도 있습니다. pepper는 애플리케이션 secret으로, DB가 탈취되어도 별도 secret 없이는 검증이 어렵게 만듭니다. 다만 pepper는 KMS나 환경 변수처럼 DB와 분리된 안전한 위치에 보관해야 합니다.

운영에서는 cost 값을 너무 낮게 두면 보안성이 떨어지고, 너무 높이면 로그인 서버가 과부하될 수 있습니다. 실제 서버 성능 기준으로 적절한 검증 시간을 측정해 정하는 것이 좋습니다.

관련 질문

같은 카테고리/태그 기준