오늘 끝나면
패스워드
- ✓패스워드의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 패스워드이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
왜 평문 저장은 범죄 — 해싱·솔트·레인보우 테이블 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
암호 & 보안 · 12
패스워드
저장의 기술
비번을 평문으로 저장하면 범죄임. 해시로, 그리고 솔트까지 쳐서 저장해야 함.
평문 저장 = 털리면 끝장
제일 게으른 방식임. 사용자가 친 비번을 그대로 DB에 적어둠. 로그인 때 입력값이랑 글자 맞춰보면 끝. 만들긴 쉬움.
DB가 한 번 털리면? 비번이 통째로 노출됨. 사람들은 같은 비번을 여기저기 돌려 씀. 한 사이트 털리면 은행·메일까지 줄줄이 뚫림.
그래서 평문 저장은 사실상 범죄임. 비번은 서버조차 원래 글자를 몰라야 함. 그럼 어떻게 맞춰보지? 다음 칸에서 해결함.
| id | password |
|---|---|
| alice | 1234 |
| bob | 1234 |
| carol | qwerty |
DB 한 번 털리면 전부 그대로 노출됨
해시로 저장 — 지문만 남김
비번을 해시 함수에 통과시켜 나온 지문만 저장함. 비번 원본은 안 적음.
해시는 한 방향임. 비번 → 지문은 쉬운데, 지문 → 비번은 되돌릴 수 없음. 로그인 때는? 입력 비번을 똑같이 해시해서, 저장된 지문이랑 같은지만 봄.
이러면 DB가 털려도 적힌 건 지문뿐임. 비번 원본은 거기 없음. 평문보다 한참 안전해짐. 근데 아직 빈틈이 하나 있음.
1234
a3f0c9e21b7d
같은 비번 = 같은 지문 → 레인보우표
해시의 약점임. 같은 비번은 늘 같은 지문이 나옴. 결정적이라서임.
공격자는 흔한 비번 수억 개를 미리 해시해서 지문↔비번 사전을 만들어둠. 이게 레인보우 테이블임. 털린 지문을 표에서 찾기만 하면 비번이 튀어나옴.
게다가 두 사람이 같은 비번을 쓰면 DB에 똑같은 지문이 찍힘. 한 명만 뚫려도 나머지가 같이 노출됨. 그래서 한 끗이 더 필요함.
| 지문(해시) | → 비번 |
|---|---|
| a3f0c9e21b7d | 1234 |
| 7e2b41d0aa39 | password |
| c1908ff3e2b6 | qwerty |
| 5d4e0b1c77a2 | admin |
털린 지문을 표에서 찾기만 하면 비번이 튀어나옴
솔트 — 사용자마다 다른 소금
비번을 해시하기 전에 사용자마다 다른 무작위 글자(솔트)를 섞어줌. 음식에 소금 치듯이.
앨리스는 x7q2+비번, 밥은 k9w4+비번을 해시함. 그럼 둘이 똑같은 비번을 써도 지문이 제각각이 됨. DB에 같은 값이 안 찍힘.
오른쪽에서 직접 해봄. 같은 비번을 넣고 [DB 털림]을 눌러보셈. 평문은 빨강, 해시는 둘이 똑같아 주황 경고, 해시+솔트만 제각각이라 초록임.
앨리스·밥이 우연히 똑같은 비번 1234을 씀.
왜 솔트가 표 공격을 죽이나
솔트가 붙는 순간, 공격자의 미리 계산해둔 표가 통째로 쓸모없어짐.
공격자가 만든 레인보우표는 비번 기준임. 근데 이제 해시되는 건 솔트+비번임. 사용자마다 솔트가 다르니, 표를 사용자 수만큼 새로 만들어야 함. 사실상 불가능함.
정리하면 세 단계임. 평문은 절대 금지 · 해시는 기본 · 솔트는 필수. 진짜 서비스는 여기에 일부러 느리게 만든 해시(bcrypt 같은)까지 얹음.
Q. 솔트(salt)를 쓰는 이유는?
같은 비밀번호라도 해시 결과를 사용자마다 다르게 만들기 위해서임. 그러면 공격자가 미리 계산해둔 표(레인보우 테이블) 공격이 안 먹힘 — 사용자마다 솔트가 다르니 표를 사람 수만큼 새로 만들어야 해서 사실상 불가능해짐.→ 미리 만든 표가 통째로 쓸모없어짐