해시(Hash)와 솔트(Salt) 완벽 이해하기 (무조건 알아야 할 비밀번호 보안! 개념부터 해킹 방어까지)
🔐 Hash와 Salt, 쉽게 이해하기
비밀번호를 안전하게 저장해야 하는데, 그냥 적어두면 해커한테 바로 털리겠지? 그래서 쓰는 게 바로 Hash(해시)야.
1️⃣ Hash가 뭐냐면
Hash는 비밀번호를 특별한 규칙으로 이상한 코드로 바꿔주는 도구야.
예를 들어, 네 비밀번호가 password123이면, 이걸 ef92b778bafe771e89245b89ecbc08a4 같은 이상한 문자열로 변환해줘.
- 중요한 건! 이걸 다시 원래 비밀번호로 절대 못 돌려. (이걸 '단방향 함수'라고 해)
- 그리고 같은 비밀번호를 넣으면 항상 같은 Hash값이 나와.
비유하자면, 재료를 믹서기에 넣고 갈아버리면 스무디가 되잖아? 근데 그걸 다시 원래 재료로 되돌릴 수 없는 거랑 비슷해.
2️⃣ 근데 Hash만으로 부족해
해커들은 미리 수많은 비밀번호랑 Hash값을 모아둔 레인보우 테이블이라는 걸 써.
그래서 네 Hash값을 보면, "아~ 이거 'password123'이네?" 이렇게 바로 알아낼 수 있어.
또한, 무식하게 계속 비밀번호를 넣어보는 무차별 대입 공격(Brute Force)도 해.
3️⃣ 그래서 등장하는 게 Salt
Salt(소금)는 비밀번호에 몰래 추가하는 비밀 재료야.
예를 들어, password123에 XyZ!@# 같은 랜덤 문자열을 더해서 Hash를 만들어.
- 이렇게 하면 같은 비밀번호라도 Hash값이 매번 달라져.
- 해커 입장에선 레인보우 테이블이 쓸모없어지는 거지.
요리할 때 똑같은 재료라도 비밀 소금(Salt) 하나 넣으면 맛이 완전 달라지는 거랑 똑같아.
🚨 왜 중요하냐고?
- Hash는 비밀번호를 숨기는 역할
- Salt는 그 숨긴 비밀번호를 더 안전하게 만드는 비밀 무기
이거 없으면 해커들이 네 비밀번호 금방 알아낸다!
Hash는 비밀번호 숨기는 기술, Salt는 해커가 그걸 못 풀게 만드는 비밀 재료야.
해커가 무차별 대입 공격을 할 때, Salt가 어떻게 방어해줄까?
🔨 무차별 대입 공격이 뭐냐면?
해커가 비밀번호를 무식하게 하나씩 다 넣어보는 공격이야.
예를 들어볼게
- "a",
- "aa",
- "aaa",
- "abc123",
이런 식으로 수천만 가지 비밀번호를 계속 시도하는 거지.
근데 요즘은 비밀번호를 직접 넣어보는 게 아니라, 미리 비밀번호 후보들을 Hash값으로 변환해서 비교해.
예시)
너의 비밀번호 Hash값이 abcd1234라고 하면, 해커는 비밀번호 후보들을 계속 Hash로 바꿔서 abcd1234랑 일치하는 걸 찾는 거야.
🧂 여기서 Salt가 하는 역할!
Salt가 있으면 해커가 예상할 수 없는 추가 재료가 생기는 거야.
예를 들어,
- 원래 비밀번호가 password123이면,
- 서버는 여기에 XyZ!@# 같은 Salt를 붙여서 → password123XyZ!@# 이렇게 만든 다음 Hash를 계산해.
해커는 네 비밀번호 Hash값을 알아도, 그 안에 어떤 Salt가 들어갔는지 모르면 똑같이 계산할 수가 없어.
🔒 무차별 대입 공격 방어 원리
- 해커가 비밀번호 후보를 준비했어.
- 근데 서버는 비밀번호 + Salt 조합으로 Hash를 만들었지.
- 해커가 일일이 비밀번호 후보에다가 매번 Salt를 붙여서 Hash 계산을 해야 해.
- 이 과정이 너무 복잡하고 오래 걸리니까, 현실적으로 공격이 거의 불가능해지는 거야.
특히, 사용자마다 다른 Salt를 쓰면 해커는 매번 처음부터 다시 계산해야 돼.
같은 비밀번호를 쓰더라도 Hash값이 다 다르니까 공격 효율이 뚝 떨어지는 거지.
✅ 결론
Salt는 해커가 무차별 대입 공격을 할 때, 비밀번호 예측을 어렵게 만들어서 공격 시간을 엄청나게 늘려버리는 방패 역할을 해!
Salt를 비밀번호랑 같이 저장해도 안전할까? 왜 그런지 생각해봐!
🧂 Salt를 같이 저장해도 안전한 이유
Salt는 비밀번호 자체를 숨기는 게 목적이 아니야. Salt의 역할은 해커가 쉽게 예측할 수 없게 비밀번호마다 Hash 결과를 다르게 만드는 것이야.
그래서 보통 시스템에서는 이렇게 저장해
[ Salt값 ] + [ Hash값 ]
즉, 해커가 DB를 털어서 Salt를 가져가더라도 문제는 없어. 왜냐면
🔑 1️⃣ 해커가 Salt를 알아도 비밀번호 찾기는 여전히 어려움
- 해커가 DB를 털어서 Salt와 Hash를 모두 가져갔다고 치자.
- 그래도 해커는 비밀번호 후보 + Salt 조합을 넣어서 일일이 Hash를 계산해야 해.
- 이게 바로 무차별 대입 공격인데, Salt 덕분에 그 작업량이 엄청 많아져서 현실적으로 힘들어지는 거야.
🔑 2️⃣ 레인보우 테이블을 무력화
- 레인보우 테이블(미리 만들어둔 Hash 사전)은 Salt가 없을 때만 효과적이야.
- Salt가 있으면, 해커는 그 테이블을 매번 새로 만들어야 해.
- 사용자마다 Salt가 다르면? 해커는 사람 수만큼 테이블을 만들어야 하니까 사실상 포기하게 돼.
🚨 그럼 Salt를 숨길 필요 없냐?
맞아, Salt는 공개되어도 괜찮아.
중요한 건 비밀번호와 Salt가 합쳐진 후 만들어진 Hash값을 역으로 풀 수 없게 만드는 것이야.
Salt는 숨기는 게 아니라, 해커의 공격을 복잡하게 만들어주는 재료라서 비밀번호랑 같이 저장해도 안전해!
왜 같은 비밀번호라도 Salt를 쓰면 Hash값이 달라지는 게 중요할까?
🔐 왜 같은 비밀번호 + Salt 조합이 중요할까?
만약 Salt 없이 비밀번호를 Hash로만 저장한다고 생각해봐.
- 사용자 A: 비밀번호 123456 → Hash값 abc123
- 사용자 B: 비밀번호 123456 → Hash값 abc123
이렇게 같은 비밀번호면 항상 같은 Hash값이 나와.
해커가 DB를 털었을 때 Hash값만 봐도, "어? 이 두 사람, 비밀번호 똑같네?" 하고 바로 알 수 있어.
게다가, 해커가 123456의 Hash값이 abc123인 걸 알면, 이제 모든 사용자 중에 Hash가 abc123인 사람은 비번이 123456이라는 걸 쉽게 찾아낼 수 있지.
🧂 근데 Salt를 쓰면?
- 사용자 A: 123456 + Salt1 → Hash값 xyz789
- 사용자 B: 123456 + Salt2 → Hash값 qwe456
같은 비밀번호여도 완전히 다른 Hash값이 만들어져!
해커가 봤을 때 누가 같은 비밀번호를 쓰는지 알 수 없고, 레인보우 테이블도 쓸 수 없어.
🚨 왜 중요하냐면?
- 사용자들의 비밀번호 패턴 노출을 막아줘.
- 같은 비밀번호 써도 절대 티 안 남.
- 해커가 공격 자동화를 못 해.
- 미리 계산해둔 Hash값으로 대충 비교하는 게 불가능해짐.
- 무차별 대입 공격 시, 매번 Salt까지 고려해야 하니까 공격 비용이 급상승.
Salt 덕분에 같은 비밀번호여도 Hash값이 달라져서, 해커가 비밀번호를 쉽게 추측하거나 패턴을 파악하지 못하게 막아주는 거야!
Salt 외에도 비밀번호 보안을 강화하기 위해 해시 함수는 어떤 기준으로 선택해야 할까?
해시 함수는 빠르면 오히려 위험해.
원래 Hash 함수(SHA-256 같은 것들)는 속도가 빠르게 설계돼서, 데이터 무결성 확인할 때 많이 써.
근데 비밀번호 저장엔 이런 빠른 함수 쓰면 안 돼. 왜냐면, 해커가 무차별 대입 공격(Brute Force) 할 때 빠르면 빠를수록 더 많은 시도를 할 수 있거든.
그래서 비밀번호용 해시 함수는 일부러 느린 걸 선택해야 해.
대표적인 예시)
- bcrypt
- scrypt
- PBKDF2
- Argon2 (요즘 최신 트렌드)
이 함수들은 일부러 계산을 느리게 하거나, 메모리도 많이 쓰게 만들어서 해커가 공격할 때 시간과 자원을 왕창 쓰게 만들어.
💡 정리
비밀번호 해시는 느리고, 반복 횟수를 조절할 수 있는 함수를 골라야 안전해!
해커가 Hash와 Salt를 가져갔을 때, 비밀번호 찾는 걸 더 어렵게 만드는 추가 방법은 뭐가 있을까?
1️⃣ 반복 연산 (Key Stretching)
- 같은 비밀번호라도 Hash를 수천~수만 번 반복해서 계산해.
- 예: "비밀번호 + Salt" → Hash → 다시 그 Hash를 또 Hash...
- 이렇게 하면 해커가 한 번 시도할 때마다 시간이 오래 걸려서 공격 속도가 확 떨어짐.
2️⃣ 이중 인증(2FA)
- 비밀번호가 털려도, 로그인하려면 추가 인증(문자, OTP 등)이 필요하니까 해커가 쉽게 접근 못 해.
3️⃣ 비밀번호 정책 강화
- 최소 길이, 특수문자 포함 등으로 예측하기 어려운 비밀번호를 쓰게 유도.
- 비밀번호가 복잡할수록 해커가 맞추기 힘들어.
4️⃣ 비밀번호 입력 제한 & 지연
- 로그인 시도 횟수 제한 걸거나, 실패 시 일정 시간 딜레이를 주면 무차별 대입 공격 방어에 효과적이야.
5️⃣ 서버 측 이상 징후 탐지
- 비정상적인 로그인 시도를 모니터링하고, 이상하면 바로 차단하거나 경고.
💡 정리
해커가 Hash랑 Salt를 가져가도, 느린 해시 함수, 반복 연산, 그리고 2FA 같은 추가 보안층을 적용하면 비밀번호 탈취를 훨씬 어렵게 만들 수 있어!