CSS Tutor Study Hub 메인으로

Computersystemsicherheit 2025/26

19. Password storage·Salt·Slow KDF 완전 초보 강의

비유, 단계별 예시, 자체 흐름도, 강의 스크립트 원본, 시험 답안까지 한 페이지에서 연결합니다.

CSS 1타 강사 · CONCEPT 19/25

Server는 왜 비밀번호를 암호화해 보관하지 않고 slow KDF 결과를 저장할까요?

Server는 plaintext password나 복호화 가능한 형태 대신 사용자별 random salt와 느린 password KDF 결과를 저장합니다. Login 때 같은 계산을 다시 해 비교합니다. Argon2id, bcrypt, scrypt, PBKDF2가 대표적입니다.

전문 용어를 보기 전에 이 장면부터 잡으세요

정답 자체가 아니라 정답을 전용 기계에 넣었을 때 나오는 느린 검증 결과만 보관하는 방식입니다.

비밀번호는 복호화해서 꺼내 보는 값이 아닙니다

00

한 장면으로 문제를 시작해 봅시다

이번 페이지에서 끝까지 따라갈 예시

Alice와 Bob이 우연히 같은 password를 쓰더라도 서로 다른 random salt를 갖는 password database를 생각합니다.

비유와 실제 시스템을 정확히 연결하기

  • 사용자별 다른 양념random salt
  • 일부러 느린 검증 기계password KDF
  • 기계의 난이도 설정cost parameter

이 예시에서 사람·장치·데이터·화살표를 먼저 찾습니다. 아직 용어를 완벽히 몰라도 “누가 무엇을 가지고, 어떤 처리를 거쳐, 무엇이 달라지는가”를 말할 수 있으면 출발점은 충분합니다.

01

긴 이름을 작은 용어로 분리하기

한 제목에 여러 단어가 들어 있어도 같은 기능을 뜻하지 않습니다. 아래 카드를 하나씩 읽고 각 용어의 대상과 역할을 따로 잡으세요.

Password를 저장하지 않고 검증값을 저장하는 법

Server는 사용자의 plaintext password를 다시 읽을 필요가 없다. 가입할 때 각 사용자마다 무작위 salt를 만들고 password와 함께 느린 password KDF에 넣어 나온 hash와 salt만 저장한다. 로그인 때 입력 password로 같은 계산을 수행해 비교한다. Argon2id, bcrypt, scrypt, PBKDF2 같은 KDF는 반복 계산과 memory 사용으로 대량 추측을 비싸게 만든다.

TERMS FROM ZERO

Password를 저장하지 않고 검증값을 저장하는 법 핵심 용어

아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.

Password hash / KDF

Password 검증을 위해 의도적으로 비용을 높여 만든 단방향 계산 결과입니다.

Salt

사용자마다 새로 만드는 공개 random 값으로 같은 password도 서로 다른 저장 결과를 만들게 합니다.

Cost parameter

Password 추측 한 번에 필요한 시간·memory 비용을 조절하는 설정입니다.

Offline guessing

공격자가 유출된 database를 자기 장비에서 server 제한 없이 시험하는 공격입니다.

Hash는 암호화가 아니라 고정 길이 지문이다

Cryptographic hash function은 길이가 제각각인 입력을 정해진 길이의 digest로 바꾼다. 같은 입력은 같은 digest를 만들지만 digest에서 원문을 되찾기는 어려워야 한다. 서로 다른 두 입력이 같은 digest를 만드는 상황을 collision이라고 한다. 입력 가능성은 사실상 무한하고 출력 종류는 유한하므로 collision은 수학적으로 반드시 존재하며, 보안 목표는 collision이 전혀 없게 하는 것이 아니라 현실적인 시간에 찾기 어렵게 하는 것이다.

TERMS FROM ZERO

Hash는 암호화가 아니라 고정 길이 지문이다 핵심 용어

아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.

Hash function

임의 길이 입력을 고정 길이 digest로 바꾸는 단방향 함수입니다. 암호화처럼 복호화 key가 있는 기능이 아닙니다.

Digest

Hash function의 고정 길이 출력으로, 데이터의 짧은 지문처럼 사용됩니다.

Collision

서로 다른 두 입력이 같은 digest를 만드는 경우입니다. 출력 공간이 유한하므로 존재 자체는 피할 수 없습니다.

Preimage resistance

주어진 digest를 만드는 입력을 현실적인 시간에 찾기 어려워야 한다는 성질입니다.

02

실제 시스템에서는 이 순서로 움직입니다

모바일에서는 그림 안을 좌우로 움직이며 번호 순서대로 읽으세요.

예시를 단계별로 해체하기

  1. 1단계Registration 때 사용자별 random salt를 생성합니다.
  2. 2단계Password와 salt를 Argon2id·bcrypt·scrypt·PBKDF2 같은 slow KDF에 입력합니다.
  3. 3단계Database에는 salt·cost parameter·KDF output만 저장합니다.
  4. 4단계Login 때 제출된 password로 같은 계산을 다시 수행해 결과를 비교합니다.
  5. 5단계Salt는 같은 password의 stored value를 다르게 하고 rainbow-table 재사용을 막습니다.
  6. 6단계느린 KDF 비용은 database 유출 후 offline guessing 한 번 한 번을 비싸게 만듭니다.

이 단계들은 시험 답안에서 원인과 결과가 빠지지 않도록 만든 설명 순서입니다.

손으로 따라가는 초보 예제

같은 password를 쓰는 Alice와 Bob의 DB 값이 달라지는 과정

두 사용자가 모두 `BlueHorse!7`을 쓰지만 Alice salt는 `A91F`, Bob salt는 `72BC`입니다.

  1. 1단계Registration 때 server는 Alice와 Bob에게 서로 다른 random salt를 생성합니다.
  2. 2단계Alice는 `KDF(password, A91F, cost)`, Bob은 `KDF(password, 72BC, cost)`를 계산합니다.
  3. 3단계Password가 같아도 salt가 달라 stored output은 달라집니다.
  4. 4단계Database에는 salt, KDF 종류·cost, output을 저장하며 plaintext password는 저장하지 않습니다.
  5. 5단계Login 때 제출 password와 저장 salt로 같은 KDF를 다시 계산해 output을 비교합니다.
  6. 6단계DB 유출 시 salt는 공개되어도 공격자가 사용자마다 느린 추측 계산을 다시 해야 합니다.

그래서 무엇을 배웠나? Salt는 같은 password의 결과 재사용을 막고, slow KDF는 각 추측 비용을 높입니다. 두 기능은 서로 대체하지 않습니다.

03

관련 개념도 하나씩 따로 이해하기

Password를 저장하지 않고 검증값을 저장하는 법

비유에서 실제 시스템으로 옮겨 보기

먼저 떠올릴 장면 · 비밀번호 원본을 창고에 보관하는 대신, 입력한 열쇠가 맞는지만 검사하는 느린 시험 장치를 보관하는 것이다. Salt는 같은 열쇠라도 사용자마다 다른 시험지를 받게 한다.

정확한 뜻 · Server는 사용자의 plaintext password를 다시 읽을 필요가 없다. 가입할 때 각 사용자마다 무작위 salt를 만들고 password와 함께 느린 password KDF에 넣어 나온 hash와 salt만 저장한다. 로그인 때 입력 password로 같은 계산을 수행해 비교한다. Argon2id, bcrypt, scrypt, PBKDF2 같은 KDF는 반복 계산과 memory 사용으로 대량 추측을 비싸게 만든다.

  1. 1단계사용자마다 고유한 random salt를 생성한다.
  2. 2단계Password와 salt를 느린 KDF에 넣는다.
  3. 3단계Salt, KDF parameter, 결과 hash를 저장한다.
  4. 4단계로그인 시 검증 API로 비교하고 role authorization은 별도로 확인한다.

Hash는 암호화가 아니라 고정 길이 지문이다

비유에서 실제 시스템으로 옮겨 보기

먼저 떠올릴 장면 · 수많은 책을 짧은 서가 번호로 압축해 표시하면 언젠가 같은 번호가 겹친다. 좋은 hash는 공격자가 원하는 겹침을 일부러 찾기 매우 어렵게 만든다.

정확한 뜻 · Cryptographic hash function은 길이가 제각각인 입력을 정해진 길이의 digest로 바꾼다. 같은 입력은 같은 digest를 만들지만 digest에서 원문을 되찾기는 어려워야 한다. 서로 다른 두 입력이 같은 digest를 만드는 상황을 collision이라고 한다. 입력 가능성은 사실상 무한하고 출력 종류는 유한하므로 collision은 수학적으로 반드시 존재하며, 보안 목표는 collision이 전혀 없게 하는 것이 아니라 현실적인 시간에 찾기 어렵게 하는 것이다.

  1. 1단계출력 길이는 입력 문장 길이가 아니라 알고리즘이 정한 bit 수로 고정된다.
  2. 2단계Preimage resistance는 digest에서 원문을 찾기 어려운 성질이다.
  3. 3단계Collision resistance는 서로 다른 두 입력의 같은 digest를 찾기 어려운 성질이다.
  4. 4단계MD5처럼 실용적인 collision 공격이 알려진 알고리즘은 보안 용도로 사용하지 않는다.

04

강의 스크립트 원본과 연결하기

TLS login·salted password hash·database attack를 보여 주는 대표 슬라이드입니다. 먼저 위의 초보 설명을 읽고, 원본에서는 같은 개념이 어떤 기호와 독일어·영어 용어로 표현되는지 확인하세요.

Password storage·Salt·Slow KDF 관련 강의 스크립트 대표 슬라이드
원본 Vorlesung/05 Authentifizierung.pdf · p.23, p.21, p.24 · TLS login·salted password hash·database attack
  • 05 Authentifizierung.pdf · p.23, p.21, p.24

05

시험 함정과 답안에 적용하기

  • Password를 저장하지 않고 검증값을 저장하는 법 · 일반적인 빠른 hash 한 번만 사용하거나 모든 사용자에게 같은 salt를 쓰면 대량 추측과 미리 계산한 table 공격에 약하다.
  • Hash는 암호화가 아니라 고정 길이 지문이다 · collision-free라는 절대 표현과 collision-resistant라는 계산적으로 찾기 어렵다는 표현을 구분해야 한다.

서술형 답안 골격

per-user random salt + slow password KDF + cost parameter + constant-time verification을 씁니다.

정의 → 등장 주체 또는 입력 → 작동 순서 → 보안 효과 → 조건과 한계 순서로 쓰고, 위 단계별 예시에서 필요한 문장을 골라 붙이세요.

30초 자가 확인

책을 덮고 “Server는 왜 비밀번호를 암호화해 보관하지 않고 slow KDF 결과를 저장할까요?”에 대해 핵심 용어 두 개, 작동 단계 세 개, 대표 함정 하나를 말해 보세요.

다음 개념으로 넘어가기 전 확인

  1. Salt가 비밀일 필요가 없는 이유는?
  2. 빠른 SHA-256 한 번이 password 저장에 약한 이유는?
  3. 같은 password라도 stored output이 달라지는 이유는?