Foundry
보안
기초
핵심

비밀번호 저장과 해시

DB가 털려도 비밀번호는 지켜져야 한다

비밀번호 저장과 해시

일반 해시로는 왜 부족한가

  • SHA-256은 빠르다. 그 말은 공격자도 초당 대량으로 시도할 수 있다는 뜻이다
  • 같은 비밀번호가 같은 해시 -> 사전 계산 테이블과 중복 계정 탐지에 노출
  • 필요한 성질은 충돌 저항이 아니라 조절 가능한 느림이다

알고리즘 선택

알고리즘특성비고
Argon2id메모리 하드, 현재 1순위 권장메모리, 시간, 병렬도 조절
scrypt메모리 하드Argon2 미지원 환경 대안
bcrypt검증된 표준, 지원 범위 넓음입력 72바이트 제한 주의
PBKDF2규정 준수 필요 시반복 횟수를 충분히
MD5, SHA 계열 단독사용 금지너무 빠름

실무 포인트

  • 솔트는 계정별 무작위 값이며 bcrypt, Argon2는 결과 문자열에 솔트를 포함한다. 별도 컬럼이 필요 없다
  • 비용 파라미터는 서버에서 실제 측정해 정한다. 하드웨어가 빨라지면 상향
  • 로그인 실패 응답을 아이디와 비밀번호로 구분하지 않는다(계정 존재 여부 유출)
  • 검증 성공 시 저장된 파라미터가 낮으면 그 자리에서 재해시해 점진적으로 올린다
면접에서 이렇게 나옵니다

Q.비밀번호를 SHA-256으로 저장한 서비스를 인수했습니다. 어떻게 전환하겠습니까?

평문을 모르므로 한꺼번에 바꿀 수 없습니다. 로그인할 때 하나씩 옮기는 점진적 전환을 씁니다.

순서조치
1저장 형식에 알고리즘 표시를 넣는다 (sha256, bcrypt 를 접두로)
2로그인 시 옛 형식이면 옛 방식으로 검증하고, 성공하면 그 자리에서 새 방식으로 다시 저장한다
3새 형식이면 새 방식으로 검증한다
4일정 기간 뒤 남은 옛 형식 계정은 비밀번호 재설정을 요구한다

즉시 강화가 필요하면 기존 해시를 한 겹 더 감싸는 방법도 있습니다. 새 방식으로 옛 해시를 다시 해시해 저장하고, 검증 때 두 단계를 거칩니다. 로그인 없이도 전체를 강화할 수 있다는 장점이 있습니다.

흔한 실수: 전체 사용자에게 비밀번호 재설정을 강제하는 것부터 답하는 것. 유출이 확인된 상황이면 맞지만, 예방적 전환에서는 이탈이 큽니다. 점진적 전환을 먼저 말하고 강제 재설정을 예외로 두는 것이 실무 판단입니다.

Q.솔트를 쓰면 무엇이 막히고, 무엇은 여전히 막히지 않나요?

같은 비밀번호가 다른 해시를 갖게 되어 미리 계산한 표와 재사용 공격이 막힙니다. 개별 추측은 막지 못합니다.

막히는 것이유
레인보우 테이블미리 만든 표가 이 솔트에는 안 맞는다
한 번 계산해 여러 계정 뚫기계정마다 다시 계산해야 한다
같은 비밀번호 사용자 식별해시가 서로 달라 눈으로 찾을 수 없다
안 막히는 것이유
한 계정을 겨냥한 대입솔트는 함께 저장돼 공격자도 안다
흔한 비밀번호 추측자주 쓰는 후보 몇 개면 뚫린다
GPU 로 빠르게 시도해시가 빠르면 솔트와 무관하게 초당 수십억 번

그래서 솔트는 필수지만 충분하지 않습니다. 느린 해시로 시도 자체를 비싸게 만드는 것이 함께 필요합니다.

흔한 실수: 솔트를 비밀로 보관해야 한다고 답하는 것. 비밀이 아니고 해시와 나란히 저장합니다.

Q.bcrypt의 cost나 Argon2의 파라미터는 어떤 기준으로 정하나요?

보안이 아니라 응답 목표와 서버 처리량에서 거꾸로 계산합니다.

로그인 피크가 초당 40건, 서버 8코어, 응답 목표 300ms 라고 해봅시다.

비용 계수1건 처리코어당8코어피크 40건
11약 120ms초당 8건초당 64건감당한다
13약 480ms초당 2건초당 16건못 받는다

감당 가능한 범위에서 가장 높은 값이 답입니다. 보통 100에서 250ms 사이를 목표로 잡습니다.

Argon2 는 시간, 메모리, 병렬도 셋을 정합니다. 메모리를 크게 잡는 것이 GPU 공격을 비싸게 만드는 핵심이라 여기를 먼저 확보합니다.

그리고 하드웨어가 빨라지면 값을 올립니다. 저장 형식에 파라미터를 넣어두면 로그인 시 옛 값을 감지해 새 값으로 다시 저장할 수 있습니다.

흔한 실수: 가능한 가장 높은 값을 답하는 것. 로그인이 밀리면 서비스 장애이고, 느린 로그인 자체가 서비스 거부 공격의 표면이 됩니다.

Q.비밀번호 해시가 유출됐다고 판단되면 어떤 순서로 대응하겠습니까?

해시가 나갔다면 시간이 지날수록 깨진 계정이 늘어납니다. 세션 차단과 재설정 유도를 먼저 하고 조사를 병행합니다.

순서조치
1유출 범위와 시점을 확인한다. 어떤 알고리즘과 파라미터였는지
2전체 세션과 리프레시 토큰을 무효화한다
3비밀번호 재설정을 요구한다. 로그인 시 강제 변경
4유출 사실을 사용자에게 알린다. 다른 서비스에 같은 비밀번호를 쓴 경우를 경고
5이상 로그인(새 기기, 새 지역)을 한동안 강하게 감시한다
6원인을 막고 알고리즘과 파라미터를 강화한다

빠른 해시로 저장했다면 위험이 훨씬 큽니다. 초당 수십억 번 시도가 가능해 흔한 비밀번호는 사실상 즉시 뚫립니다.

흔한 실수: 비밀번호 재설정만 하고 세션을 남겨두는 것. 이미 탈취된 세션은 비밀번호와 무관하게 살아 있습니다. 무효화가 함께 가야 합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

보안 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.