Password Hashing Secret Crypto
3줄 요약
- 비밀번호는 복호화 가능한 암호화 대상이 아니라 오프라인 추측 비용을 높여야 하는 단방향 password hashing 대상이다.
- Secret, 암호키, TLS private key는 “값을 숨기는 것”만으로 끝나지 않고 발급, 저장, 접근 제어, 회전, 폐기, 유출 대응까지 수명주기로 관리해야 한다.
- 암호화는 기밀성, 서명과 MAC은 무결성/출처 확인, TLS는 전송 구간 보호를 담당한다. 목적을 섞으면 안전해 보이는 취약 설계가 나온다.
핵심 정리
- password hash는 공격자가 DB dump를 얻은 뒤에도 각 추측을 비싸게 만들기 위한 저장 형식이다. salt와 work factor는 이 목적을 위해 존재한다.
- bcrypt, Argon2, PBKDF2 선택은 유행이 아니라 운영 환경, 라이브러리 안정성, 규제 호환성, migration 가능성 기준으로 정한다.
- 환경 변수는 secret 전달 수단일 수 있지만 secret manager나 vault처럼 접근 감사, 버전, 회전, 폐기를 자동으로 해결하지 않는다.
- 암호화된 값은 반드시 변조 방지를 함께 검토한다. 가능한 검증된 AEAD 모드나 프레임워크를 사용하고 직접 crypto protocol을 만들지 않는다.
- TLS는 네트워크 도청과 변조를 줄이지만 인증, 권한, 입력 검증, 데이터 저장 암호화를 대체하지 않는다.
- 로그와 trace에는 password, hash 일부, token, API key, private key, certificate key material이 남지 않아야 한다.
하위 문서 연결
-
- Password Hashing Salt Work Factor: salt, work factor, rehash 정책으로 password dump 이후의 오프라인 공격 비용을 다룬다.
-
- bcrypt Argon2 PBKDF2 선택 기준: 알고리즘별 운영 특성과 migration 전략을 비교한다.
-
- Secret 환경 변수 Vault Rotation: secret이 git, image, log, env dump에 새지 않도록 저장과 회전 경계를 잡는다.
-
- 암호화와 서명 실수: 기밀성, 무결성, 인증, 키 분리, nonce/IV 재사용 문제를 구분한다.
-
- TLS 인증서와 키 관리 기본: 인증서 만료, chain, private key 보호, HSTS, 내부 mTLS 운영을 정리한다.
헷갈리는 지점
- salt를 secret으로 숨겨야 한다고 생각하기 쉽다.
- salt는 사용자별로 달라야 하는 공개 가능한 값이고, pepper는 별도 secret 저장소에서 관리하는 선택적 추가 방어다.
- salt를 숨기는 것보다 느린 hash와 적절한 work factor가 핵심이다.
- password hashing과 암호화를 같은 말로 쓰기 쉽다.
- 비밀번호 검증은 원문을 복구할 필요가 없으므로 단방향 hash를 쓴다.
- 주민번호처럼 다시 사용해야 하는 값은 암호화와 key management가 필요하다.
- secret을 환경 변수로 넣으면 끝났다고 생각하기 쉽다.
- 환경 변수는 process dump, debug page, container inspect, crash report에 노출될 수 있다.
- 회전과 폐기, 접근 감사가 없으면 secret lifecycle 관리가 아니다.
- HTTPS가 있으면 application crypto가 필요 없다고 생각하기 쉽다.
- TLS는 전송 중 보호이고 저장 데이터, 서명 검증, 내부 권한 정책은 별도 문제다.
확인 질문
- 비밀번호 저장에 양방향 암호화를 쓰면 왜 위험한가?
- 복호화 키가 유출되면 모든 비밀번호 원문을 복구할 수 있기 때문이다. 검증만 필요하면 단방향 password hashing을 사용해야 한다.
- work factor는 어떻게 정해야 하는가?
- 운영 로그인 지연을 감당할 수 있는 범위에서 공격자의 오프라인 추측 비용을 높이도록 측정해 정하고 주기적으로 재평가한다.
- secret rotation이 어려운 이유는 무엇인가?
- 새 secret 발급, 양쪽 동시 수용 기간, 연결 풀/캐시 갱신, old secret 폐기, 실패 시 rollback과 감사 로그가 함께 필요하기 때문이다.