Skip to content

02. 해시 알고리즘과 패스워드 보안


학습 목표

  1. MD5와 SHA 계열 해시 알고리즘의 차이를 설명할 수 있다.
  2. 왜 패스워드를 평문으로 저장하면 안 되는지 이해한다.
  3. 패스워드를 해시로 저장하는 방식의 원리를 설명할 수 있다.
  4. Brute Force 공격이 무엇이고, Salt가 왜 필요한지 이해한다.
  5. MD5로 패스워드를 해싱하면 안 되는 이유를 설명할 수 있다.

전체 구조


1. 대표 해시 알고리즘

MD 계열과 SHA 계열

해시 알고리즘은 크게 MD 계열SHA 계열로 나뉜다.

알고리즘출력 길이경우의 수보안성패스워드 사용
MD5128비트2^128낮음사용 금지
SHA-1160비트2^160낮음비권장
SHA-256256비트2^256높음권장
SHA-512512비트2^512매우 높음권장

왜 출력 길이가 중요한가?

출력 길이가 길다 = 경우의 수가 많다 = 같은 결과를 내는 다른 입력을 찾기 어렵다

  • MD5 (128비트): 경우의 수 약 3.4 x 10^38
  • SHA-256 (256비트): 경우의 수 약 1.2 x 10^77

SHA-256의 경우의 수는 MD5의 경우의 수를 제곱한 것보다 크다.

해시 결과 예시

"test string"이라는 문자열을 해시하면:

MD5:    661f8009fa8e56a9d0e94a0a644397d7
SHA-256: d5579c46dfcc7f18207013e65b44e4cb4e2c2298f4ac457ba8f82743f31e930b

입력이 짧든 길든 결과 길이는 항상 동일하다. 이것이 고정 길이 출력 특성이다.

암기 포인트: 숫자가 클수록 → 경우의 수 넓음 → 충돌 가능성 낮음 → 보안성 높음


2. 패스워드 저장의 원칙

절대로 평문 저장 금지

사용자가 회원가입할 때 입력한 패스워드를 그대로 DB에 저장하면 절대 안 된다.

평문 저장의 위험:

  • 내부자 위협: DB 관리자가 패스워드를 볼 수 있다
  • 해킹 위협: DB가 유출되면 모든 패스워드가 노출된다
  • 2차 피해: 사용자는 여러 사이트에 같은 패스워드를 쓰는 경우가 많다

해시로 패스워드 저장하기

패스워드는 반드시 단방향 해시로 변환해서 저장해야 한다.

핵심 포인트:

  • 서버는 원본 패스워드를 저장하지 않는다
  • 서버는 해시 결과만 가지고 있다
  • 로그인할 때 입력된 패스워드를 같은 방법으로 해시해서 결과만 비교한다

3. 사용자 인증 방식의 종류

패스워드는 인증 방식 중 지식 기반 인증에 해당한다.

인증 방식예시장점단점
소지 기반열쇠, OTP물리적 소유 필요분실/도난 위험
지식 기반패스워드구현 간편, 비용 낮음유출/유추 위험
생체 기반지문복제 어려움변경 불가, 오인식
위치 기반GPS추가 인증 요소위치 변경 시 불편

실무에서는 이들을 **조합(Multi-Factor)**해서 사용한다. 예: 패스워드(지식) + OTP(소지)


4. Brute Force 공격과 MD5의 문제

Brute Force(전수 조사) 공격이란?

해시는 역계산이 불가능하다. 그런데 해커는 다른 방법으로 공격한다.

이것이 Brute Force(전수 조사) 공격이다. 원본을 역계산하는 게 아니라, 가능한 모든 입력을 시도해서 같은 해시 결과가 나오는 것을 찾는 것이다.

왜 MD5가 위험한가?

MD5의 출력 길이는 128비트로 경우의 수가 너무 적다. 현대 컴퓨터로 6자리 패스워드를 전수 조사하면 몇 시간 안에 뚫린다.

암기 포인트: MD5는 패스워드 해싱에 절대 사용 금지. SHA-256 이상을 사용하라.


5. Salt(솔트)란?

Salt의 필요성

SHA-256을 써도 패스워드가 짧으면 Brute Force에 취약할 수 있다. 예를 들어 패스워드가 "1234"라면 금방 찾아낸다.

이 문제를 해결하는 것이 Salt다.

Salt의 원리

Salt는 패스워드에 시스템만 아는 추가 문자열을 붙여서 해시하는 것이다.

Salt의 효과

항목Salt 없이Salt 적용
패스워드"1234""xK9mQ_server_1234"
해시 대상 길이4자18자
Brute Force 난이도매우 쉬움매우 어려움
해커의 전수조사4자리만 시도Salt까지 맞춰야 함

Salt의 비유: 음식의 소금

Salt라는 이름은 음식에 소금을 넣는 것에서 유래했다.

Salt의 특성

  • Salt는 시스템 내부자(개발자)만 알고 있는 값이다
  • 암호 키처럼 강력한 보안이 아닌, 추가적인 보호막 역할이다
  • Salt는 패스워드 앞, 뒤, 또는 양쪽 어디에든 붙일 수 있다
  • Salt가 유출되어도, Brute Force의 경우의 수는 여전히 크게 늘어난다

6. 전체 패스워드 보안 흐름


핵심 암기 포인트

해시 알고리즘: MD 계열, SHA 계열이 대표적. 출력 길이가 길수록 보안성 높음.

MD5 금지: 128비트로 경우의 수 적음. 패스워드 해싱에 절대 사용 금지.

SHA-256 권장: 현재(2022 기준) 패스워드 해싱의 사실상 표준.

패스워드 저장 원칙: 평문 저장 금지 → 반드시 단방향 해시 → DB에는 해시값만 저장.

Brute Force: 역계산이 아닌 전수 조사 공격. 가능한 모든 입력을 시도.

Salt: 패스워드에 시스템만 아는 문자열을 추가하여 경우의 수를 확대. 소금 비유.


확인 질문

  1. MD5를 패스워드 해싱에 사용하면 안 되는 이유는 무엇인가?
  2. SHA-256의 "256"은 무엇을 의미하며, 왜 숫자가 클수록 좋은가?
  3. 패스워드를 해시로 저장했을 때, 로그인 시 어떻게 패스워드를 검증하는가?
  4. Brute Force 공격은 해시의 역계산인가? 아니라면 어떤 방식인가?
  5. Salt를 적용하면 왜 Brute Force 공격이 어려워지는가?