스킬캠퍼스

오늘 끝나면

패스워드

  • 패스워드의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 패스워드이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

왜 평문 저장은 범죄 — 해싱·솔트·레인보우 테이블 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

암호 & 보안 · 12

패스워드
저장의 기술

비번을 평문으로 저장하면 범죄다. 해시로, 그리고 솔트까지 쳐서 저장해야 한다.

P.01암호 & 보안 · 12

평문 저장 = 털리면 끝장

제일 게으른 방식이다. 사용자가 친 비번을 그대로 DB에 적어둔다. 로그인 때 입력값이랑 글자를 맞춰보면 끝이다. 만들기는 쉽다.

DB가 한 번 털리면 비번이 통째로 노출된다. 사람들은 같은 비번을 여기저기 돌려 쓴다. 한 사이트가 털리면 은행과 메일까지 줄줄이 뚫린다.

그래서 평문 저장은 사실상 범죄다. 비번은 서버조차 원래 글자를 몰라야 한다.

DB 한 줄에 비번이 그대로 적혀 있음
users 테이블, 평문 저장 (위험)
idpassword
alice1234
bob1234
carolqwerty

DB 한 번 털리면 전부 그대로 노출된다

P.02암호 & 보안 · 12

해시로 저장, 지문만 남긴다

비번을 해시 함수에 통과시켜 나온 지문만 저장한다. 비번 원본은 안 적는다.

해시는 한 방향이다. 비번에서 지문을 만들기는 쉬운데, 지문에서 비번으로는 되돌릴 수 없다. 로그인 때는 입력 비번을 똑같이 해시해서, 저장된 지문과 같은지만 본다.

이러면 DB가 털려도 적힌 건 지문뿐이다. 비번 원본은 거기 없다. 평문보다 한참 안전해진다. 그런데 아직 빈틈이 하나 있다.

비번을 한 방향 지문으로. 되돌리기 불가
한 방향, 되돌리기 불가
사용자가 친 비번

1234

해시 함수
DB에 저장되는 지문

a3f0c9e21b7d

비번에서 지문 만들기는 쉽고, 지문에서 비번 되돌리기는 불가능하다
P.03암호 & 보안 · 12

같은 비번은 같은 지문, 레인보우표가 노린다

해시의 약점이다. 같은 비번은 늘 같은 지문이 나온다. 결정적이기 때문이다.

공격자는 흔한 비번 수억 개를 미리 해시해서 지문과 비번을 잇는 사전을 만들어둔다. 이게 레인보우 테이블이다. 털린 지문을 표에서 찾기만 하면 비번이 튀어나온다.

게다가 두 사람이 같은 비번을 쓰면 DB에 똑같은 지문이 찍힌다. 한 명만 뚫려도 나머지가 같이 노출된다. 그래서 한 끗이 더 필요하다.

미리 계산해둔 표로 역추적당한다
레인보우 테이블, 미리 계산된 사전
지문(해시)→ 비번
a3f0c9e21b7d1234
7e2b41d0aa39password
c1908ff3e2b6qwerty
5d4e0b1c77a2admin

털린 지문을 표에서 찾기만 하면 비번이 튀어나온다

P.04암호 & 보안 · 12

솔트, 사용자마다 다른 소금

비번을 해시하기 전에 사용자마다 다른 무작위 글자(솔트)를 섞어준다. 음식에 소금 치듯이.

앨리스는 x7q2+비번, 밥은 k9w4+비번을 해시한다. 그럼 둘이 똑같은 비번을 써도 지문이 제각각이 된다. DB에 같은 값이 안 찍힌다.

DB가 털려도 평문은 빨강으로 노출되고, 해시는 두 값이 똑같아 주황 경고가 뜬다.해시에 솔트를 함께 쓴 쪽만 제각각이라 초록이다.

직접 해본다. 같은 비번, 갈라지는 결과
비번 저장 3종 비교 · 직접 입력
입력, 두 사용자가 같은 비번을 써 본다

앨리스와 밥이 우연히 똑같은 비번 1234을 쓴다.

저장, 서버 DB에 이렇게 적힘
① 평문입력 그대로
앨리스1234
1234
② 해시지문으로 저장
앨리스ff7f246c1ba5
ff7f246c1ba5
③ 해시 + 솔트사용자마다 다른 소금
앨리스b672148c6037
8a21468bbfc7
P.05암호 & 보안 · 12

왜 솔트가 표 공격을 죽이나

솔트가 붙는 순간, 공격자의 미리 계산해둔 표가 통째로 쓸모없어진다.

공격자가 만든 레인보우표는 비번 기준이다. 그런데 이제 해시되는 건 솔트+비번이다. 사용자마다 솔트가 다르니, 표를 사용자 수만큼 새로 만들어야 한다. 사실상 불가능하다.

정리하면 세 단계다. 평문은 절대 금지, 해시는 기본, 솔트는 필수. 진짜 서비스는 여기에 일부러 느리게 만든 해시(bcrypt 같은)까지 얹는다.

Q. 솔트(salt)를 쓰는 이유는?같은 비밀번호라도 해시 결과를 사용자마다 다르게 만들기 위해서다. 그러면 공격자가 미리 계산해둔 표(레인보우 테이블) 공격이 안 먹힌다. 사용자마다 솔트가 다르니 표를 사람 수만큼 새로 만들어야 해서 사실상 불가능해진다.
비번 하나에 표가 수억 개 필요해진다
솔트가 표 공격을 죽이는 원리
솔트 없음
hash(비번)
표 1개로모두 역추적
솔트 있음
hash(솔트+비번)
사람 수만큼표 새로 만들어야

그래서 미리 만든 표가 통째로 쓸모없어진다

3줄 요약

  1. 1왜 평문 저장은 범죄 — 해싱·솔트·레인보우 테이블
  2. 2패스워드은 고전 암호 → 키와 신뢰 → 웹 보안 → 블록체인 → 다음 시대 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

패스워드

왜 평문 저장은 범죄 — 해싱·솔트·레인보우 테이블

암호를 잠그고 풀 때 쓰는 비밀 또는 공개 숫자

해시

데이터를 고정 길이 지문으로 바꾸는 함수