데이터베이스가 유출되었을 때 피해 규모를 가르는 것은 비밀번호를 어떻게 저장했느냐다. 해시만 썼는지, 솔트와 반복 연산까지 적용했는지에 따라 공격자가 평문을 복원하는 데 걸리는 시간이 수천 배에서 수억 배까지 달라진다. 정보보안기사 필기·실기의 인증과 암호 영역, 정보관리기술사의 보안 토픽에서 자주 다뤄지는 주제다.
솔트(Salt)는 사용자마다 따로 만드는 난수로, 비밀번호와 합쳐 해시한다. 키 스트레칭(Key Stretching)은 해시를 수천~수십만 번 반복하거나 메모리를 많이 쓰게 만들어 한 번의 시도 비용을 의도적으로 키우는 기법이다. 핵심 키워드는 일방향성, 사용자별 고유 솔트, 반복 횟수(work factor), 메모리 하드 함수, 페퍼(Pepper)다. 복호화가 가능한 암호화로 저장하면 키가 새는 순간 전부 평문이 되므로 부적절하다.
흐름은 단순하다. 가입 시 서버가 난수 솔트를 만들고, 비밀번호와 솔트를 KDF(Key Derivation Function)에 넣어 해시를 얻는다. 저장하는 값은 알고리즘 종류, 비용, 솔트, 해시다. 로그인 때는 저장된 솔트와 비용으로 같은 계산을 다시 해서 결과가 같은지 비교한다.
솔트 자체는 비밀이 아니다. 목적은 두 가지다. 첫째, 레인보우 테이블 같은 사전 계산 표를 무력화한다. 솔트가 128비트라면 같은 비밀번호도 2의 128제곱 가지 값으로 갈라져 표를 미리 만들 수 없다. 둘째, 같은 비밀번호를 쓰는 두 사용자의 해시가 달라져 동일 비밀번호 사용 여부가 드러나지 않는다.
| 취약 요인 | 공격 방식 | 대응 |
|---|---|---|
| 솔트 없음·고정 솔트 | 레인보우 테이블, 동일 해시 일괄 조회 | 사용자별 무작위 솔트 |
| 빠른 범용 해시(MD5, SHA-1 단독 등) | GPU 무차별 대입, 사전 대입 | 느린 KDF, 반복 횟수 상향 |
| 약한 비밀번호 | 사전·규칙 기반 대입 | 길이·복잡도 정책, 유출 목록 대조 |
| DB와 같은 곳에 둔 비밀값 | DB 탈취 시 함께 노출 | 페퍼를 비밀 저장소·HSM에 분리 |
| 기법 | 원리 | 장점 | 한계 |
|---|---|---|---|
| PBKDF2 | HMAC을 지정 횟수만큼 반복 | 표준화되어 있고 FIPS 요건에 맞춤 | 메모리를 적게 써 GPU·ASIC 병렬화에 취약 |
| bcrypt | Blowfish 기반, cost로 반복 조절 | 오래 검증됨, 약간의 메모리 요구 | 입력 72바이트 제한, 메모리 요구 작음 |
| scrypt | 대량 메모리를 의도적으로 사용 | 전용 하드웨어 병렬화 비용 상승 | 매개변수(N, r, p) 조정이 까다로움 |
| Argon2id | 메모리·시간·병렬도를 함께 조절 | 신규 시스템의 우선 권장 | 메모리가 큰 환경에서 동시 로그인 부하 고려 |
OWASP 비밀번호 저장 치트시트는 현재 Argon2id를 우선 권장하며 최소값으로 메모리 19MiB, 반복 2회, 병렬도 1을 제시한다. PBKDF2는 HMAC-SHA-256 기준 600,000회, bcrypt는 작업 계수 10 이상이다. 권고값은 개정되므로 시험 준비와 별개로 최신 문서를 확인해야 한다.
간단히 계산해 보자. 영문 대소문자와 숫자 62문자로 만든 8자리 비밀번호는 62의 8제곱, 즉 약 2.18×10의 14제곱 가지다. 공격 장비가 초당 10의 10제곱 회 해시를 계산한다고 가정하면 반복 1회짜리 단순 해시는 최대 약 21,834초, 대략 6시간이면 끝난다. 반복을 10,000회로 올리면 같은 장비로 약 6.9년, 600,000회면 약 415년으로 늘어난다. 시도 한 번의 비용이 곱절이 되면 전체 시간도 곱절이 되기 때문이다.
다만 현실의 공격자는 전수 대입보다 흔한 비밀번호부터 시도하므로 약한 비밀번호는 이 계산보다 훨씬 일찍 뚫린다. 느린 해시는 강한 비밀번호 정책과 함께 있어야 의미가 있다.
답안에서는 솔트가 사전 계산 공격과 동일 비밀번호 식별을 막고, 키 스트레칭이 대입 속도를 늦춘다는 역할 분담을 분명히 쓴다. 페퍼는 솔트와 달리 모든 사용자가 공유하는 비밀값이며 DB 밖에 보관한다는 차이도 곁들이면 좋다. 실무에서는 로그인 한 번에 0.1~0.5초 정도의 지연을 감수할 수 있는 선에서 반복 횟수를 정하고, 하드웨어가 빨라지면 해시 형식에 비용을 함께 저장해 두었다가 로그인 시점에 재해시하는 방식으로 점진 상향한다. 로그인 폭주 시 서버 부하 때문에 DoS가 될 수 있다는 점도 고려사항이다.
비밀번호는 사용자별 솔트와 느린 KDF(Argon2id·bcrypt·PBKDF2)로 저장하고, 솔트는 사전 계산을, 반복·메모리 비용은 대입 속도를 막으며, 페퍼는 DB 밖에 따로 둔다.
이 글은 학습용 정리이며 실제 시험 문항과 다를 수 있다. 출제 기준은 큐넷·KISA·한국데이터산업진흥원 등 공식 공지를 확인하라. 그림은 개념도이거나 가정 계산이며 실측 데이터가 아니다.
11월에 일정이 있는 금융 DT 테스트 시험을 정리했습니다. 접수, 시험, 합격 발표 날짜를 한 번에…
같은 계좌를 두 사용자가 동시에 건드릴 때 데이터베이스가 어디까지 서로의 작업을 보여 줄지 정하는 설정이…
배당은 회사가 번 이익을 주주에게 현금으로 나눠 주는 일이다. "배당수익률 3%"라는 숫자는 매력적으로 보이지만 세금,…
주식 기사나 증권사 리포트에서 가장 자주 만나는 지표가 PER, PBR, ROE이다. 따로 외우면 숫자의 나열에…
컴퓨터활용능력 스프레드시트 파트에서는 조건에 맞는 값만 합치고 세는 문제가 거의 매 회차 나온다. SUMIF 계열…