페이지 목차
이 페이지에서 검색
EIS
이 페이지에 묻기
EIS · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.
생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.
EIS · SECURITY
EIS
생성 수정
정보보안기사의 시스템·네트워크·애플리케이션 보안과 암호·관리·실기 내용을 개념의 경계와 실습으로 연결합니다.
29개 문서 · 4 · 정보보안일반 · 21 / 29
20 · 해시함수와 MAC
지도 위치 : 4과목 정보보안 일반 · README 4장 ② 부품 층 (무엇으로 지키나) | 출제기준: 2. 암호학 > 2. 해시함수 | 이전: 19 암호 알고리즘 | 다음: 21 정보보호 관리와 위험평가 출제 빈도 : ⭐ (회당 약 2.1문항 — 출제분석.md) · 변화 ▲ (이전 1.6 → 현행 2.6) · ⚠️ 상승 중 — MAC · HMAC, 충돌 저항성, MDC/MAC 문항이 늘어남 세세항목 : 1. 해시함수의 개요 및 요구사항 / 2. 해시함수별 특징 및 구조 / 3. 메시지 인증 코드(MAC)의 원리 및 구조
이 노트를 다 읽으면
- 해시함수를 암호화와 구별 하고, 해시가 주는 보안 서비스가 무결성 임을 말할 수 있다.
- 역상 · 제2역상(약한 충돌) · 충돌(강한 충돌) 저항성 을 "공격자에게 무엇이 주어졌나"로 구별할 수 있다.
- 생일 공격 이 왜 n비트 해시를 2^(n/2) 수준으로 약하게 만드는지 설명할 수 있다.
- MD5 · SHA-1 · SHA-2 · SHA-3 · HAS-160 · RIPEMD-160 · LSH 의 출력 길이와 특징을 표로 말할 수 있다.
- MDC ↔ MAC , MAC ↔ 전자서명 을 키 유무와 부인방지로 가를 수 있다.
- HMAC과 CBC-MAC 의 구조를 그리고, MAC이 못 하는 것 (부인방지 · 재전송 방지)을 말할 수 있다.
- 패스워드 저장에 솔트 가 왜 필요한지, 레인보우 테이블 이 무엇인지 설명할 수 있다.
0. 이 노트의 판별 축
| # | 축 | 왼쪽 (0) | 오른쪽 (1) | 이 축으로 갈리는 것 | 큰 축 (README 5장) |
|---|---|---|---|---|---|
| 1 | 되돌릴 수 있나 | 암호화 (키로 복호화) | 해시 (일방향) | AES · RSA ↔ SHA-256 | 암호화 ↔ 해시 (⑤의 파생) |
| 2 | 키를 쓰나 | 키 없는 해시 (MDC) | 비밀키를 쓰는 해시 (MAC) | SHA-256 ↔ HMAC-SHA256 | 이 노트의 축 |
| 3 | 키가 몇 개인가 | 공유 비밀키 하나 (MAC) | 개인키 · 공개키 (전자서명) | HMAC ↔ RSA 서명 → 부인방지 유무 | ⑤ 대칭 ↔ 비대칭 |
| 4 | 공격자가 무엇을 쥐었나 | 해시값만 / 메시지 하나 | 아무것도 (둘 다 자유롭게) | 역상 · 제2역상 저항성 ↔ 충돌 저항성 | 이 노트의 축 |
이 노트의 질문은 "데이터가 바뀌지 않았다는 것을 어떻게 증명하는가?" 입니다. 앞에서 배운 보안 목표(21번 노트) 중 무결성 을 지키는 부품이고, 앞의 19번 노트(암호)가 기밀성을 맡았다면 이 노트는 무결성을 맡습니다. 해시는 전자서명(18번 노트), OTP · 패스워드 저장(17번 노트), 무결성 점검 도구 등 뒤의 거의 모든 노트에 부품으로 들어갑니다.
1. 해시함수란
1.1 정의와 경계
해시함수 (Hash Function) — [일방향 함수]인데, [ 임의 길이의 입력을 고정 길이의 값(해시값 · 메시지 다이제스트)으로 압축하며, 키 없이 누구나 계산하지만 거꾸로 입력을 찾을 수는 없다 ]는 점에서 키로 되돌릴 수 있는 암호화와 구별된다.
| 해시 | 암호화 | 체크섬 · CRC | |
|---|---|---|---|
| 되돌림 | ❌ | ⭕ (키로) | — |
| 키 | ❌ | ⭕ | ❌ |
| 출력 길이 | 입력과 무관하게 고정 | 입력에 비례 | 고정 |
| 목적 | 의도적 변조 탐지 (무결성) | 기밀성 | 우연한 전송 오류 탐지 |
| 공격자에 대한 안전성 | ⭕ (충돌을 일부러 만들기 어려움) | ⭕ | ❌ (일부러 같은 값을 쉽게 만듦) |
⚠️ 반례
- CRC는 해시처럼 고정 길이 값을 내지만 암호학적 해시가 아닙니다. 공격자가 같은 CRC를 갖는 위조 데이터를 쉽게 만들 수 있습니다.
- Blowfish는 블록 암호 입니다. "해시 함수가 아닌 것"으로 나옵니다(2025).
- 해시 자체 는 키를 쓰지 않습니다. "해시 함수는 비밀키를 사용한다"는 틀린 설명입니다.
눈사태 효과 (Avalanche Effect) — 입력이 1비트만 바뀌어도 출력의 약 절반 비트가 바뀌는 성질. 그래서 해시값을 비교하면 미세한 변조도 드러납니다.
1.2 해시가 주는 것과 주지 않는 것
| 주는 것 | 주지 않는 것 |
|---|---|
| 무결성 (바뀌었는지 탐지) | 기밀성 (해시값만으로 원문을 숨길 목적이 아님) |
| 출처 인증 — 공격자도 바꾼 메시지의 해시를 새로 계산해 붙이면 됨 | |
| 부인방지 |
그래서 해시만으로는 "누가 보냈나"를 증명하지 못하고 , 키를 섞은 MAC (3절)이나 개인키로 서명하는 전자서명 (18번 노트)이 필요해집니다.
📝 기출 포인트 — "일방향 해시가 주는 보안 서비스 = 무결성", "해시 함수 특징이 아닌 것 = 키 사용", "블록 암호와 해시 구분", "무결성용 해시 식별(CRC 제외)".
2. 해시의 요구사항과 생일 공격 ⭐
2.1 세 가지 저항성
| 성질 | 공격자에게 주어진 것 | 찾기 어려워야 하는 것 | 다른 이름 |
|---|---|---|---|
| 역상 저항성 (Preimage Resistance) | 해시값 h | h = H(x)인 x | 일방향성 |
| 제2역상 저항성 (Second Preimage Resistance) | 메시지 x (그리고 H(x)) | H(x) = H(y)인 다른 y | 약한 충돌 저항성 |
| 충돌 저항성 (Collision Resistance) | 아무것도 없음 (자유롭게 고름) | H(x) = H(y)인 아무 쌍 x ≠ y | 강한 충돌 저항성 |
🔍 읽는 포인트 — 축 4로 보면 쉽습니다. 주어진 것이 하나라도 있으면 "약한" , 아무 조건 없이 아무 쌍이나 찾으면 되는 것이 "강한" 충돌 저항성입니다. 공격자에게 자유가 많은 쪽(아무 쌍)이 공격하기 쉬우므로, 그것을 막는 성질이 더 강한 요구입니다.
기본 요구사항으로는 이 셋 앞에 임의 길이 입력 · 고정 길이 출력 · 계산 용이성 이 붙습니다.
⚠️ 반례 — "역방향성(해시값에서 원문을 계산할 수 있어야 함)", "생일 공격"은 요구사항이 아닙니다 (2018 · 2022). 생일 공격은 요구사항이 아니라 충돌 저항성을 노리는 공격 입니다.
📝 기출 포인트 — G2.2에서 가장 많이 반복된 개념이 약한 충돌 저항성 = 제2역상 저항성 (2014 · 2017 · 2022 · 2024). "주어진 x에 대해 같은 해시를 갖는 다른 y를 찾기 어렵다"는 문장을 보면 바로 제2역상입니다.
2.2 생일 공격
생일 역설 — 한 방에 23명 만 있어도 생일이 같은 두 사람이 있을 확률이 50%를 넘습니다. "특정한 누구와 같은 생일"이 아니라 " 아무 둘이나 같은 생일"이라 생각보다 훨씬 빨리 겹칩니다.
생일 공격 — [해시 공격]인데, [ 아무 두 메시지의 해시가 같아지는 충돌을 찾는다 ]는 점에서 특정 메시지와 같은 해시를 찾는 제2역상 공격보다 훨씬 적은 시도로 성공한다.
| 공격 대상 | n비트 해시에서 필요한 시도 |
|---|---|
| 역상 · 제2역상 | 약 2^n |
| 충돌 (생일 공격) | 약 2^(n/2) |
MD5 (128비트) → 충돌 찾기 약 2^64
SHA-1 (160비트) → 약 2^80
SHA-256 → 약 2^128 ← 그래서 충돌 저항이 128비트 수준
🔍 읽는 포인트 : 출력이 n비트인 해시의 충돌 안전성은 n/2비트 입니다. "생일 공격에 안전하려면 해시 길이는 원하는 보안 강도의 2배 "라는 문항이 여기서 나옵니다.
활용 시나리오 — 공격자가 정상 계약서와 불리한 계약서를 각각 여러 변형(띄어쓰기 · 쉼표 차이)으로 만들어 해시가 같은 쌍을 찾은 뒤, 정상본에 서명을 받아 불리한 계약서에 그 서명을 옮겨 붙입니다.
📝 기출 포인트 — "생일 공격에 안전한 해시 길이"(2014), "충돌 저항성을 노리는 공격 = 생일 공격"을 제로데이 · 재전송 · 레인보우 테이블 사이에서 고르는 유형(2025).
3. 해시 알고리즘별 특징 ⭐
3.1 구조 — 머클-담고르 ↔ 스펀지
| 구조 | 원리 | 쓰는 알고리즘 |
|---|---|---|
| 머클-담고르 (Merkle-Damgård) | 메시지를 패딩해 고정 크기 블록으로 자르고, 압축 함수 에 블록을 하나씩 넣어 연쇄 (마지막에 메시지 길이를 덧붙임) | MD5, SHA-1, SHA-2, HAS-160, RIPEMD-160 |
| 스펀지 (Sponge) | 내부 상태에 입력을 흡수(absorb) 한 뒤 출력을 짜냄(squeeze) | SHA-3 (Keccak) |
머클-담고르 구조는 길이 확장 공격 (H(K‖M)을 알면 K를 몰라도 H(K‖M‖추가)를 계산)에 약합니다. 그래서 "키를 앞에 붙여 해시"하는 단순 MAC은 위험하고, 3.3절의 HMAC 구조가 나왔습니다.
3.2 알고리즘 표 (출력 길이 암기)
| 알고리즘 | 출신 | 출력 길이 | 블록 | 단계 · 라운드 | 상태 |
|---|---|---|---|---|---|
| MD5 | Rivest (1991) | 128비트 | 512 | 4라운드 × 16 = 64단계 | 충돌 발견 (2004). 보안 용도 사용 금지 |
| SHA-1 | 미국 NIST (1995) | 160비트 | 512 | 4라운드 × 20 = 80단계 | 실제 충돌 공개 (2017). 서명 용도 금지 |
| SHA-224 / 256 | NIST SHA-2 (2001~) | 224 / 256 | 512 | 64라운드 | 현재 표준 |
| SHA-384 / 512 | NIST SHA-2 | 384 / 512 | 1024 | 80라운드 | 현재 표준. 64비트 워드 연산 |
| SHA-3 | Keccak, NIST 공모 (FIPS 202, 2015) | 224 / 256 / 384 / 512 | (가변) | Keccak-f 24라운드 | 스펀지 구조 — SHA-2와 다른 설계 |
| RIPEMD-160 | 유럽 (1996) | 160비트 | 512 | 5라운드, 두 줄 병렬 | |
| HAS-160 | 한국 (TTA 표준) | 160비트 | 512 | 80단계 | 국내 전자서명 KCDSA 와 함께 쓰려고 설계 |
| LSH | 한국 (2014) | 224 / 256 / 384 / 512 | — | — | 국내 권고 해시 |
🔍 읽는 포인트
- 출력 길이만 정확히: MD5 = 128 , SHA-1 · RIPEMD-160 · HAS-160 = 160 , SHA-256 = 256, SHA-512 = 512.
- "라운드"는 교재마다 라운드(4 · 5) 로 세기도 하고 단계(64 · 80) 로 세기도 합니다. MD5와 SHA-1을 비교하는 문항에서는 "MD5는 4라운드 64단계, SHA-1은 4라운드 80단계"로 기억하면 둘 다 대응됩니다.
- SHA-512는 블록 1024비트 · 80라운드 로, SHA-256(블록 512 · 64라운드)과 다릅니다(2025 출제).
- KISA 관점 — KISA 「암호 알고리즘 및 키 길이 이용 안내서」(2018)는 단순 해시 · 전자서명용 국내 권고로 SHA-2 · SHA-3 · LSH 계열 을 듭니다. HAS-160 과 SHA-1은 충돌 저항성이 112비트 보안 강도에 못 미쳐 전자서명용으로는 쓸 수 없고 , 메시지 인증 · 키 유도 · 난수 생성용으로만 허용됩니다.
📝 기출 포인트 — MD5(4회 이상) : "출력 길이 128비트", "패딩 특성", "특징". SHA-1 = 160비트 (2024 · 2025 연속). "유럽에서 개발한 160비트 해시 = RIPEMD-160"(2025). "SHA-512 블록 · 라운드"(2025). 출력 길이 표가 그대로 정답 근거입니다.
4. MDC와 MAC ⭐⭐
4.1 MDC ↔ MAC ↔ 전자서명
MDC (Modification Detection Code, 변경 탐지 코드) — [무결성 검사값]인데, [ 키 없이 해시만으로 만든다 ]는 점에서 비밀키를 쓰는 MAC과 구별된다. 해시값 자체를 안전한 별도 경로 로 받아야 의미가 있습니다(예: 다운로드 페이지에 게시된 SHA-256 값).
MAC (Message Authentication Code, 메시지 인증 코드) — [무결성 검사값]인데, [ 송 · 수신자가 공유한 비밀키와 메시지로 만들어, 키를 가진 사람만 만들 수 있다 ]는 점에서 누구나 계산하는 MDC와 구별된다. 그래서 무결성 + 메시지 출처 인증 을 줍니다.
| MDC (단순 해시) | MAC | 전자서명 | |
|---|---|---|---|
| 키 | 없음 | 공유 비밀키 (대칭) | 개인키 · 공개키 (비대칭) |
| 무결성 | ⭕ | ⭕ | ⭕ |
| 출처 인증 | ❌ | ⭕ (키 공유자 중 누군가) | ⭕ (서명자 특정) |
| 부인방지 | ❌ | ❌ — 수신자도 같은 키로 MAC을 만들 수 있으므로 제3자에게 "송신자가 만들었다"를 증명 못 함 | ⭕ |
| 기밀성 | ❌ | ❌ | ❌ |
| 속도 | 빠름 | 빠름 | 느림 |
| 예 | SHA-256 값 게시 | HMAC, CBC-MAC, CMAC, GMAC | RSA, DSA, ECDSA |
⚠️ MAC이 못 하는 두 가지
- 부인방지 — 키를 양쪽이 공유하니 누가 만들었는지 제3자에게 증명할 수 없습니다(2019 · 2025 출제).
- 재전송 방지 — 정상 메시지와 MAC을 그대로 다시 보내면 MAC은 여전히 맞습니다. 순서번호 · 타임스탬프 · Nonce 를 MAC 계산에 함께 넣어야 막힙니다(17번 노트의 재전송 공격, 2019 · 2023 · 2024 출제).
📝 기출 포인트 — MAC(8회) 이 G2.2 최빈출. "비밀키로 고정 길이 인증값을 만드는 기술", "공유키로 무결성 · 출처를 확인", " MAC 특성 오류 = 부인방지 제공 ", "MDC와 MAC(HMAC) 구분"(2022), "해시값과 MAC · HMAC의 차이와 한계"(2023).
4.2 HMAC ⭐
HMAC (Hash-based MAC) — [MAC]인데, [ 기존 해시함수에 비밀키를 두 번(안쪽 · 바깥쪽) 섞어 만든다 ]는 점에서 블록 암호로 만드는 CBC-MAC과 구별된다. 표준은 RFC 2104이며, 어떤 해시든 끼워 쓸 수 있습니다(HMAC-SHA256 등).
HMAC(K, M) = H( (K ⊕ opad) ‖ H( (K ⊕ ipad) ‖ M ) )
ipad = 0x36을 블록 길이만큼 반복, opad = 0x5C를 블록 길이만큼 반복
① 키를 해시 블록 크기에 맞춤 (길면 해시, 짧으면 0으로 채움)
② 안쪽 해시: (K ⊕ ipad)를 메시지 앞에 붙여 해시
③ 바깥 해시: (K ⊕ opad)를 ②의 결과 앞에 붙여 다시 해시
🔍 읽는 포인트 : 해시를 두 번 겹쳐서, 3.1절의 길이 확장 공격 을 막습니다. "키 ‖ 메시지를 한 번 해시"하는 단순 방식과의 차이가 바로 이것입니다. OTP(HOTP · TOTP, 17번 노트)와 TLS · IPsec의 무결성 검사가 HMAC을 씁니다.
4.3 CBC-MAC과 그 밖의 MAC
CBC-MAC — [MAC]인데, [ 블록 암호를 CBC 모드(IV = 0)로 돌려 마지막 암호문 블록을 MAC으로 쓴다 ]는 점에서 해시를 쓰는 HMAC과 구별된다.
M1 → E_K → C1
M2 ⊕ C1 → E_K → C2
...
Mn ⊕ Cn-1 → E_K → Cn = MAC
⚠️ 기본 CBC-MAC은 고정 길이 메시지에서만 안전 합니다. 길이가 다른 메시지를 섞으면 위조가 가능해 이를 보완한 CMAC 이 나왔습니다. GMAC 은 GCM 모드의 인증 부분만 따로 쓰는 MAC입니다. CCM 모드는 CTR 암호화 + CBC-MAC 인증을 합친 것입니다(19번 노트).
| 해시를 이용한 메시지 인증 방식 | 원리 |
|---|---|
| 해시 + 대칭키 암호화 | 해시값을 공유키로 암호화해 첨부 |
| 해시 + 공개키(전자서명) | 해시값을 송신자 개인키로 서명 |
| 해시 + 비밀값 (HMAC 계열) | 메시지에 공유 비밀값을 섞어 해시 |
| ❌ 해시만 첨부 | 공격자가 다시 계산해 붙이면 끝 → 인증 아님 |
📝 기출 포인트 — "HMAC 원리"(2024), "메시지 인증 기법 식별"(2017), " 해시를 이용한 메시지 인증 방식이 아닌 것 "(2022) → 키나 서명이 없는 "해시만 첨부"가 정답.
5. 해시의 응용 — 패스워드 저장 · 무결성 점검
5.1 패스워드 저장
서버는 패스워드를 평문으로 저장하지 않고 해시값 만 저장합니다. 로그인 때 입력값을 같은 방식으로 해시해 비교합니다(17번 노트).
레인보우 테이블 — [사전 계산 공격]인데, [ 자주 쓰는 패스워드의 해시값을 미리 대량으로 계산해 두고 탈취한 해시를 표에서 거꾸로 찾는다 ]는 점에서 매번 해시를 새로 계산하는 무차별 대입과 구별된다.
솔트 (Salt) — [패스워드 해시 보강값]인데, [ 사용자마다 다른 무작위 값을 패스워드에 섞어 해시한다 ]는 점에서 모두에게 같은 비밀값인 MAC의 키와 구별된다. 솔트는 비밀일 필요가 없고 해시와 함께 저장합니다.
| 솔트의 효과 | 이유 |
|---|---|
| 레인보우 테이블 무력화 | 솔트마다 표를 새로 만들어야 함 |
| 같은 패스워드라도 다른 해시값 | 한 사람의 패스워드가 풀려도 같은 패스워드 쓰는 다른 계정이 드러나지 않음 |
추가로 해시를 수천~수십만 번 반복해 계산을 일부러 느리게 하는 키 스트레칭 (PBKDF2, bcrypt, scrypt, Argon2)을 씁니다.
$ sudo grep '^alice:' /etc/shadow
alice:$6$Gq3x9L2m$Yh0p...(이하 생략, 고정 길이):20380:0:90:7:::
│ │ └ 해시값
│ └ 솔트
└ 알고리즘 ID ($1$ MD5, $5$ SHA-256, $6$ SHA-512)
🔍 읽는 포인트 : $6$ → SHA-512 기반. 두 번째 $ 사이가 솔트 , 그 뒤가 해시값입니다. 해시값의 길이는 패스워드가 1자든 30자든 같습니다 ("해시값 길이가 입력 길이에 비례한다"는 틀린 설명, 2024). $1$(MD5)이면 약한 알고리즘으로 점검 대상입니다. 최근 배포판은 $y$(yescrypt)를 쓰기도 합니다.
📝 기출 포인트 — " 사전 계산 공격을 막는 값 = 솔트 "(2022), "미리 계산한 해시표로 패스워드를 찾는 공격 = 레인보우 테이블"(2025), /etc/shadow 해시 길이(2024).
5.2 무결성 점검과 기타 응용
| 응용 | 해시의 역할 |
|---|---|
| 파일 무결성 점검 | 중요 파일의 해시값 기준선을 저장해 두고 주기적으로 다시 계산해 비교 (Tripwire 같은 도구) |
| 다운로드 검증 | 게시된 SHA-256 값과 내려받은 파일의 해시 비교 (MDC 방식) |
| 전자서명 | 긴 메시지 대신 해시값에 서명 (18번 노트) |
| 디지털 포렌식 | 증거 이미지의 해시값으로 원본과 동일함을 증명 |
| 블록체인 | 앞 블록의 해시를 다음 블록에 넣어 연결 |
$ sha256sum /bin/ls
3c9e...a71f /bin/ls
🔍 읽는 포인트 : 기준선 값과 다르면 파일이 바뀐 것입니다(루트킷이 시스템 명령을 바꿔치기한 흔적일 수 있음). 단, 공격자가 기준선 파일까지 고칠 수 있으면 소용없으므로 기준선은 읽기 전용 매체나 별도 서버에 보관합니다.
앞으로 다시 만납니다 — Tripwire 등 무결성 점검 도구는 05번 노트, /etc/shadow와 계정 파일은 01 · 02번 노트, 포렌식의 해시 증명은 22번 노트.
6. 실기 연결
관련 수행준거 : 2-1 "운영체제 보안설정 점검과 보완"(패스워드 저장 방식 · 무결성 점검), 3 "로그 분석으로 침입 원인 파악"(변조 파일 확인), 1-2-4 "SSL/TLS, IPSec의 동작절차"(HMAC으로 무결성).
| 묻는 방식 | 답안 핵심어 |
|---|---|
| 해시함수의 세 가지 안전성 요건 | 역상 저항성(일방향성), 제2역상 저항성(약한 충돌), 충돌 저항성(강한 충돌) |
| MAC이 부인방지를 못 하는 이유 | 송 · 수신자가 같은 비밀키 를 공유 → 수신자도 같은 MAC 생성 가능 |
| HMAC 구조 | ipad · opad, 안쪽 · 바깥쪽 두 번 해시, 길이 확장 공격 방지 |
| 솔트의 목적 | 레인보우 테이블(사전 계산) 공격 방지, 같은 패스워드도 다른 해시 |
| 무결성 점검 절차 | 기준 해시값 생성 → 안전한 곳에 보관 → 주기적 재계산 · 비교 → 불일치 시 경보 |
점검 관점 예시 — 리눅스 패스워드 해시 알고리즘 설정
$ grep ENCRYPT_METHOD /etc/login.defs
ENCRYPT_METHOD MD5
🔍 읽는 포인트 : MD5는 충돌이 발견된 약한 해시입니다. SHA-512(또는 배포판이 지원하는 yescrypt)로 바꾸고, 바꾼 뒤에는 기존 계정의 패스워드를 다시 설정해야 새 방식으로 저장됩니다(이미 저장된 해시는 자동으로 바뀌지 않음). 점검 보고서에는 "현황 → 위험(레인보우 테이블 · 충돌) → 조치(알고리즘 변경 + 패스워드 재설정)" 순서로 씁니다.
7. 확인 문제
1. "메시지 x가 주어졌을 때 H(x) = H(y)를 만족하는 다른 메시지 y를 찾기 어려워야 한다"는 성질은? ① 역상 저항성 ② 제2역상 저항성 ③ 강한 충돌 저항성 ④ 눈사태 효과
2. 출력이 256비트인 해시함수에 생일 공격을 적용할 때, 충돌을 찾는 데 필요한 계산량은 대략 얼마인가? ① 2^32 ② 2^64 ③ 2^128 ④ 2^256
3. 해시 알고리즘과 출력 길이의 연결로 옳지 않은 것은? ① MD5 – 128비트 ② SHA-1 – 160비트 ③ RIPEMD-160 – 160비트 ④ HAS-160 – 128비트
4. MAC(메시지 인증 코드)에 대한 설명으로 옳지 않은 것은? ① 송신자와 수신자가 공유한 비밀키로 생성한다 ② 메시지 무결성과 출처를 확인할 수 있다 ③ 송신자가 메시지를 보낸 사실을 제3자에게 증명하는 부인방지를 제공한다 ④ HMAC은 해시함수를 이용한 MAC이다
5. HMAC이 키를 메시지 앞에 붙여 한 번만 해시하는 방식 대신 ipad · opad로 두 번 해시하는 주된 이유는? ① 출력 길이를 늘리기 위해 ② 머클-담고르 구조의 길이 확장 공격을 막기 위해 ③ 공개키 없이 부인방지를 제공하기 위해 ④ 해시를 복호화할 수 있게 하기 위해
6. 패스워드 해시를 저장할 때 사용자마다 다른 무작위 값을 섞는 주된 목적은? ① 해시값을 복호화하기 위해 ② 레인보우 테이블 같은 사전 계산 공격을 무력화하기 위해 ③ 해시 출력 길이를 줄이기 위해 ④ 부인방지를 제공하기 위해
7. 다음 중 암호학적 해시함수가 아닌 것은? ① SHA-3 ② LSH ③ Blowfish ④ RIPEMD-160
정답과 해설
| # | 정답 | 해설 (판별 축) |
|---|---|---|
| 1 | ② | 메시지 x가 주어짐 → 제2역상(약한 충돌) 저항성(축 4). ①은 해시값이 주어짐, ③은 아무 쌍 |
| 2 | ③ | 생일 공격은 2^(n/2) → 2^128 |
| 3 | ④ | HAS-160은 이름 그대로 160비트 |
| 4 | ③ | MAC은 공유 비밀키라 수신자도 만들 수 있어 부인방지 불가 (축 3). 부인방지는 전자서명 |
| 5 | ② | 길이 확장 공격 방지. ③ MAC은 어떤 구조든 부인방지를 못 함, ④ 해시는 되돌릴 수 없음(축 1) |
| 6 | ② | 솔트 = 사전 계산 공격 방지. 솔트는 키가 아니므로 ① · ④와 무관 |
| 7 | ③ | Blowfish는 블록 암호 (축 1의 암호화 쪽) |
부록 A. 스스로 확인하기
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | 해시 · 암호화 · CRC의 차이는? | 1.1 |
| 2 | 해시만으로 출처 인증이 안 되는 이유는? | 1.2 |
| 3 | 역상 · 제2역상 · 충돌 저항성에서 공격자에게 주어진 것은 각각? | 2.1 |
| 4 | "약한"과 "강한" 충돌 저항성 중 무엇이 더 강한 요구인가? 왜? | 2.1 |
| 5 | 생일 공격으로 n비트 해시의 충돌을 찾는 데 필요한 시도 수는? | 2.2 |
| 6 | 머클-담고르와 스펀지 구조의 대표 알고리즘은? | 3.1 |
| 7 | MD5 · SHA-1 · SHA-256 · RIPEMD-160 · HAS-160의 출력 길이는? | 3.2 |
| 8 | SHA-512의 블록 크기와 라운드 수는? | 3.2 |
| 9 | HAS-160을 전자서명용으로 쓰지 않는 이유는? | 3.2 |
| 10 | MDC · MAC · 전자서명을 키와 부인방지로 비교하면? | 4.1 |
| 11 | MAC이 못 하는 두 가지는? | 4.1 |
| 12 | HMAC의 ipad · opad 구조와 그 목적은? | 4.2 |
| 13 | CBC-MAC의 한계와 보완책은? | 4.3 |
| 14 | 솔트와 키 스트레칭은 각각 무엇을 막나? | 5.1 |
| 15 | /etc/shadow의 $6$은 무엇을 뜻하나? | 5.1 |
부록 B. 자주 하는 실수 · 함정
| 실수 | 바로잡기 |
|---|---|
| "해시는 복호화할 수 있다" | ❌ 일방향 . 비교만 함 |
| "해시함수는 비밀키를 쓴다" | ❌ 키를 쓰는 것은 MAC |
| "CRC도 무결성용 암호 해시" | ❌ CRC는 우연한 오류 탐지용 |
| "약한 충돌 저항성 = 충돌 저항성" | ❌ 약한 = 제2역상 (x가 주어짐), 강한 = 아무 쌍 |
| "역상 저항성 = 약한 충돌 저항성" | ❌ 역상은 해시값 이 주어짐 |
| "생일 공격은 해시 요구사항" | ❌ 요구사항이 아니라 공격 |
| "128비트 해시는 2^128 시도해야 충돌" | ❌ 생일 공격으로 2^64 |
| "HAS-160은 128비트" | ❌ 160비트 |
| "SHA-512 블록은 512비트" | ❌ SHA-512 블록은 1024비트 , 80라운드 |
| "SHA-3는 SHA-2를 늘린 것" | ❌ Keccak 스펀지 구조 , 설계가 다름 |
| "MAC은 부인방지를 제공" | ❌ 공유키라 불가 . 부인방지는 전자서명 |
| "MAC을 쓰면 재전송도 막힌다" | ⚠️ 순서번호 · 타임스탬프 · Nonce를 함께 넣어야 함 |
| "솔트는 비밀로 숨겨야 한다" | ⚠️ 솔트는 해시와 함께 저장해도 됨 . 목적은 사전 계산 방지 |
| "패스워드가 길면 shadow 해시값도 길어진다" | ❌ 해시 출력 길이는 고정 |
| "Blowfish는 해시" | ❌ Blowfish는 블록 암호 |
부록 C. AI · NotebookLM 복습 프롬프트
이 20번 노트만 근거로 4지선다 7문제를 내줘. 노트 밖 지식은 쓰지 마.
"세 가지 저항성 구분", "생일 공격 계산", "해시 출력 길이 표", "MDC·MAC·전자서명 비교",
"HMAC 구조", "솔트와 레인보우 테이블"은 반드시 포함해줘.
내가 답하면 채점하고, 틀린 보기가 왜 틀렸는지 노트의 판별 축과 절 번호로 설명해줘.
LangTailor