오늘 끝나면
패스워드
- ✓패스워드의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 패스워드이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
왜 평문 저장은 범죄 — 해싱·솔트·레인보우 테이블 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
암호 & 보안 · 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)를 쓰는 이유는?
같은 비밀번호라도 해시 결과를 사용자마다 다르게 만들기 위해서다. 그러면 공격자가 미리 계산해둔 표(레인보우 테이블) 공격이 안 먹힌다. 사용자마다 솔트가 다르니 표를 사람 수만큼 새로 만들어야 해서 사실상 불가능해진다.그래서 미리 만든 표가 통째로 쓸모없어진다