671. 솔트 (Salt) 첨가 패스워드 해시 (PBKDF2, bcrypt, Argon2) 체계
핵심 인사이트: 세상의 수많은 사람들은 "1234"라는 똑같은 비밀번호를 쓴다. 만약 DB가 털렸을 때 해시값이 똑같다면, 해커는 "아, 이 값은 무조건 1234구나"라고 다 뚫어버린다. 이를 막기 위해 네이버 서버는 내 비밀번호 "1234" 뒤에 나만의 고유한 무작위 소금(Salt) "ax9&!"을 뿌려서 섞은 뒤 해시로 간다. 설령 남들과 비밀번호가 같아도 결과물은 완전히 다르게 나오는 마법의 조미료다.
Ⅰ. 기존 단순 해시 저장의 치명적 약점 (레인보우 테이블)
- 개념: 과거에는 사용자 비밀번호 "1234"를 SHA-256 같은 해시 함수에 그냥 한 번 넣고 갈아서 나온 결과값을 DB에 저장했습니다.
- 레인보우 테이블(Rainbow Table) 공격 🌟: 해커가 바보는 아닙니다. 미리 "0000"부터 "99999999"까지, 그리고 세상의 모든 영단어 사전을 해시 믹서기에 돌려본 뒤, 그 **'평문-해시값 짝꿍표(레인보우 테이블)'**를 수십 테라바이트짜리 하드디스크에 저장해 둡니다.
- 해킹 성공: 네이버 DB가 털렸을 때, 해커는 복호화를 할 필요도 없이 털어온 해시값을 자신의 레인보우 테이블에서
Ctrl+F로 검색만 하면 "아, 이 해시값은 평문 1234네!" 하고 1초 만에 비밀번호를 모두 탈취해 버립니다.
Ⅱ. 방어책 1: 솔트 (Salt) 첨가
- 개념: 사용자의 평문 비밀번호를 해시 함수에 넣기 직전에, 사용자마다 완전히 다른 무작위 문자열(Salt, 소금)을 생성하여 평문 앞뒤로 찰싹 이어 붙이는 기법입니다.
- 예시: 내 비밀번호가
1234이고 서버가 만들어준 내 소금이z9K!라면, 서버는1234z9K!를 해시에 넣고 돌립니다. - 효과 (레인보우 테이블 무력화): 해커가 가진 레인보우 테이블에는
1234z9K!같은 괴상한 단어의 해시값은 없습니다. 해커는 내 소금을 알아내어 다시 레인보우 테이블을 처음부터 새로 만들어야 하므로 공격 시간이 수십 년으로 늘어납니다.
Ⅲ. 방어책 2: 키 스트레칭 (Key Stretching)
- 개념: 소금을 친 비밀번호를 해시 믹서기에 한 번만 돌리는 게 아니라, 나온 결과물을 다시 믹서기에 넣는 짓을 수천~수만 번 무식하게 반복(Loop)하는 기술입니다.
- 효과: 해커가 무차별 대입 공격(Brute-force)으로 비밀번호 1개를 찍어볼 때마다 해시를 수만 번 돌려야 하므로 계산 속도가 엄청나게 느려집니다. 즉, 해커의 컴퓨터 CPU를 지치게 만들어 뚫는 시간을 고의적으로 늦추는(지연) 기술입니다.
Ⅳ. 대표적인 패스워드 전용 해시 함수 3대장 🌟
일반 SHA-256은 너무 빨라서 해커가 좋아합니다. 그래서 일부러 무겁고 느리게 만든 특수 해시 함수들을 씁니다.
- PBKDF2: 가장 고전적이고 널리 쓰이는 표준입니다. 해시 함수를 수만 번 반복(키 스트레칭)하는 단순한 구조입니다. 애플 iOS나 윈도우 등에서 널리 쓰입니다.
- bcrypt (비크립트): 브루스 슈나이어가 만든 전설적인 함수입니다. 반복 횟수를 늘릴 뿐만 아니라, 해커가 그래픽카드(GPU)를 수백 개 동원해 병렬로 해킹하지 못하도록 메모리 요구량을 의도적으로 꼬아버려 방어력이 매우 뛰어납니다.
- Argon2 (아르곤2): 2015년 패스워드 해싱 대회(PHC)에서 당당히 우승한 현존 최강의 차세대 끝판왕입니다. CPU 연산 시간뿐만 아니라, 해시를 돌릴 때 소모하는 메모리(RAM) 용량까지 관리자가 마음대로 무겁게 조절할 수 있어, 해커의 GPU/ASIC 병렬 채굴기 공격을 완벽하게 무력화시킵니다.
📢 섹션 요약 비유: 해커의 '레인보우 테이블'은 전 세계 모든 요리의 냄새(해시값)와 레시피(평문)를 적어둔 거대한 백과사전입니다. 카레 냄새가 나면 "이건 카레가루 2스푼!"이라고 바로 맞춥니다. '솔트(Salt)'는 주방장(서버)이 카레를 끓일 때 아무도 모르는 이상한 아프리카 야생 향신료(무작위 문자열)를 한 꼬집 섞어버리는 것입니다. 냄새가 완전히 변해버렸기 때문에, 해커는 백과사전을 백날 뒤져봐야 이 요리의 원본 레시피를 절대 찾을 수 없습니다.