오늘 끝나면
비밀번호 크래킹
- ✓비밀번호 크래킹의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 비밀번호이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
해시·무차별 대입, 그리고 방어선 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
화이트해킹 · 12
비밀번호
크래킹
서버가 털려도 새어 나가는 건 비번이 아니라 해시다.
공격자는 그 해시를 자기 PC로 가져가 조용히 맞춰본다.
느린 해시와 솔트는 이 작업을 끝없이 늘리는 방어다.
유출되는 건 비번이 아니라 해시
제대로 만든 서버는 비번을 그대로 적지 않는다. 해시로 바꿔 저장한다.
해시는 한 방향이다. 비번을 넣으면 고정 길이 문자열이 나오지만 거꾸로는 풀지 못한다.
로그인할 때마다 입력값을 다시 해시해서 저장된 값과 같은지만 비교한다.
그래서 DB가 통째로 새어도 비번 원문은 보이지 않는다. 보이는 건 해시 목록뿐이다.
여기서 공격이 시작된다. 해시를 자기 컴퓨터로 가져가 비번을 거꾸로 알아내는 것이다.
서버를 더 건드릴 필요도 없다. 이게 오프라인 크래킹이다.
alice → $2b$…wF3
DB 통째로 샌다
자기 PC에서 맞춰본다
서버 한 번 털리면 나머지는 공격자 컴퓨터에서 진행된다
오프라인 = 시도 횟수 제한이 없음
왜 오프라인이 무서운가. 서버가 보고 있지 않아서 제한이 다 사라진다.
온라인으로 로그인 창에 막 찔러보면 서버가 막는다. 5번 틀리면 계정을 잠그고, 속도를 늦추고, 로그를 남긴다.
그래서 온라인 추측은 느리고 금방 들킨다.
그런데 해시를 손에 쥐면 서버가 필요 없다.
후보 비번을 자기 GPU로 해시해서 유출된 값과 맞춰보면 된다. 초당 수억 번도 가능하다.
잠금도 로그도 알림도 없다. 공격자가 시간만 들이면 된다. 그래서 방어는 그 시간을 키우는 일이다.
- ·5번 틀리면 잠금
- ·속도 제한 걸림
- ·로그·알림 남음
- ·잠금 없음
- ·제한 없음
- ·아무도 못 봄
사전 · 무차별 · 레인보우 테이블
후보 비번을 만드는 방법은 크게 세 가지다. 보통 싼 것부터 차례로 쓴다.
사전 공격은 흔한 비번 목록(password, 123456, 회사명2024)을 먼저 다 던지는 방식이다.
사람들이 쓰는 비번은 뻔해서 약한 비번은 여기서 거의 다 깨진다.
무차별 대입은 모든 조합을 a, b, … aa, ab 순으로 전부 만든다. 답은 반드시 있지만 길수록 폭발적으로 느려진다.
레인보우 테이블은 해시와 비번 짝을 미리 계산해 둔 거대한 표다. 한 번 만들면 다음부터는 조회만 하면 되지만, 솔트가 있으면 통째로 무력화된다.
흔한 비번 목록부터
password · 123456 · qwerty
모든 조합 전부
a · b · … · aa · ab · …
해시→비번 미리 계산
솔트 있으면 무력화
크래킹 시간 계산기
무차별 대입이 얼마나 걸리는지는 두 가지로 정해진다. 길이와 문자종류다.
비번에 쓰인 문자종류(소문자, 대문자, 숫자, 기호)가 조합 수를 정하고, 거기에 길이만큼 거듭제곱이 붙는다.
한 글자만 늘려도 시간이 수십 배로 뛰고, 종류를 섞으면 또 뛴다.
이건 실제 공격이 아니라 안전한 추정이다. 해시를 만들지도, 서버를 건드리지도 않는다.
짧고 단순한 비번은 순식간에 깨진다.
길이 7 · 조합 수 = 36^7 ≈ 7.8×10^10
GPU 한 대 · 10억/초
길이를 한 글자 늘리면 시간이 약 36배로 뛴다. 문자종류를 섞으면 또 뛴다. 방어는 이 시간을 끝없이 키우는 일이다. 긴 비번, 느린 해시(bcrypt), 솔트.
방어, 느린 해시 + 솔트
크래킹을 완전히 막진 못한다. 대신 끔찍하게 느리고 비싸게 만들 수 있다.
빠른 해시(MD5 · SHA-1)는 검증용이라 한 번 계산이 너무 빨라서 크래킹에도 유리하다.
비번엔 일부러 느린 해시(bcrypt · argon2)를 쓴다. 한 번 계산을 수만 배 느리게 만들어 초당 시도를 확 줄인다.
솔트는 사용자마다 다른 무작위 값을 비번에 붙여 해시하는 방식이다.
그러면 같은 비번도 사람마다 해시가 달라져 레인보우 테이블이 무력화되고, 한 명씩 따로 깨야 한다.
정리하면 긴 비번, 느린 해시, 사용자별 솔트다. 셋이 합쳐져 크래킹을 사실상 포기하게 만든다.
Q. 유출된 해시의 크래킹을 느리게 만들려면? (빠른 MD5로 저장 · 느린 해시 bcrypt + 사용자별 솔트 + 긴 비번 · 평문 저장 · 솔트 없는 SHA-1)
정답은 느린 해시(bcrypt) + 사용자별 솔트 + 긴 비번이다.느린 해시는 초당 시도 수를 확 줄이고, 솔트는 레인보우 테이블과 일괄 크래킹을 막고, 긴 비번은 조합 수를 폭발시킨다.
MD5와 SHA-1은 너무 빨라 오히려 공격자에게 유리하고, 평문 저장은 유출되는 즉시 끝이다.
세 방어가 합쳐져야 크래킹이 사실상 불가능에 가까워진다.
검증엔 빠르지만 크래킹에도 빠르다. 솔트 없으면 레인보우 테이블에 그대로 뚫린다
사용자별 솔트로 같은 비번도 해시가 다 다르다. 한 명씩 따로 깨야 한다