본문 바로가기
Computer Engineering/Computer networks

comnet-04 security

by coco88 2025. 4. 30.

Chapter 8. Security in Computer Networks

 

network security

네트워크 보안이란?
네트워크 상에서 데이터가 안전하고 신뢰할 수 있도록 보호하는 것
Confidentiality(기밀성): 오직 송신자와 수신자만 메시지 내용을 이해할 수 있어야 한다. (메시지를 암호화/복호화)
Authentication(인증): 송신자와 수신자가 서로의 신원을 확인(검증)하는 과정
Message Integrity(무결성): 메시지가 전송 중 변경되지 않았음을 보장하는 것, 변조(조작) 여부 탐지
Access and Availability(가용성): 네트워크 서비스가 항상 접근 가능하고 사용할 수 있어야 한다는 것
 
 
Alice와 Bob은 보안 통신을 원하고, Trudy는 공격자로, 메시지를 가로채거나 변조, 삭제, 추가할 수 있는 존재이다. 

Alice가 평문 메시지(plain text, m)를 암호화(Encryption)하여 Trudy를 피해 Bob에게 보낸다. 
Bob은 복호화(Decryption)하여 원래 메시지를 읽는다.
이때 Trudy는 ciphertext(KA(m))를 가로채고, 복호화를 시도하거나 메시지를 조작할 수 있다. 
m=KB(KA(m))
KA(m): Alice의 encryption key, KB(m): Bob의 decryption key
 
암호화를 깨려는 Trudy의 공격 방법
1. Ciphertext-only attack: 암호문만 가지고 공격을 시도하는 것(통계 분석, brute force 등)
2. Known-plaintext attack: 암호문과 평문을 알고 있을 때, 암호화 알고리즘을 알아내는 방식
3. Chosen-plaintext attack: 특정 평문을 선택해서 그에 대한 암호문을 얻는 방식
 
 
<여러 가지 암호화 방식>
 
1. Symmetric key cryptography(대칭 키 암호화 방식)
송신자와 수신자가 동일한 key(K(S))를 공유하는 방법이다. 
하지만 안전한 방식으로 같은 키를 공유하는 것은 어려운 문제이다.
 
2. Simple encryption scheme, DES, AES
Subtitution cipher(치환 암호): 알파벳 하나하나를 다른 알파벳으로 치환한다. 하지만 쉽게 추론이 가능하다. 
DES: 56bit key, 64bit 블록 암호화
AES: 128,192,256 bit key, 128bit 블록
 
3. Public Key Cryptography(공개키 암호화)
대칭키 암호화의 키를 공유하는 문제를 공개키 암호화는 해결하였다. 
공개키는 모두에게 공개되어 누구나 암호화 가능하고, 개인키(비밀키)는 오직 수신자만 소유하고 복호화는 수신자만 가능하다. 
 

Alice가 Bob에게 보낼 메시지 m을 Bob의 공개키 KB+(m)로 암호화한다.
Bob은 자신의 개인키 K-B로 복호화한다. KB-(KB+(m)))=m
즉, 암호화-복호화는 키 쌍을 통해서만 가능하다. 공개키로는 개인키를 추측할 수 없어야 한다. 
public key: KB+(m), private key: KB-(m)
 
공개키 암호화의 대표적인 알고리즘: RSA
모듈러 연산을 이용한다. x mod n은 x를 n으로 나눈 나머지

알고 있어야 하는 성질

 
RSA 키 생성 과정
1. 두 소수 p, q 선택 
2. n=pq, z=(p-1)(q-1) 계산
3. e 선택 (e <n, e와 z는 서로소)
4. ed mod z = 1을 만족하는 d를 계산 즉, ed-1이 z로 나누어 떨어지도록 하는 d (d=! e)
5. 공개키(KB+)=(n,e), 개인키(KB-)=(n,d)
 
RSA 암호화/복호화 알고리즘
암호화: c = m^e mod n
복호화: m = c^d mod n
(c: 암호문, m: 평문)
 

예제)
p=5, q=7 
n=36, z=24
e=5 선택
d=29 계산
메시지 m이 12일때, 암호화는 c=12^5 mod 35=17, 복호화는 m=17^29 mod 35=12 

 
RSA는 Bob의 공개키 (n, e)를 알아도 개인키 d를 알아내려면 n을 소인수분해해야 한다. n=pq에서 큰 소수의 곱을 분해하는 건 현재 컴퓨터로도 사실상 불가능하다. 따라서 RSA는 '소인수분해가 어려운 수학 문제'에 기반한 암호체계이다. 
 
실제로 RSA는 계산량이 너무 크기 때문에 속도가 매우 느리다. 그래서 세션 키 KS만 안전하게 교환할 때 사용하고 실제 데이터 암호화는 세션 키(KS) 기반의 대칭키 암호화로 수행하는 것이 가장 효율적이다. 
 
 
Digital signatures (디지털 서명)
디지털 환경에서 문서에 '서명'을 남기는 방식으로, 서명자가 누구인지 증명하고 메시지를 위조할 수 없게 한다. 
 
Bob(보낸 사람)이 메시지 m에 서명하려면, 자신의 개인키 KB-로 m을 암호화한다. KB-(m)
이때 서명된 메시지는 (m, KB-(m))이다. 
Alice는 메시지와 함께 받은 KB-(m)을 Bob의 공개키 KB+(m)로 복호화한다.
KB+(KB-(m))=m 이 조건이 참이 되면, 이 메시지는 위조되지 않았고 Bob의 개인키로 서명된 것이 맞다는 것이 증명된다. 
Bob의 개인키가 없으면 절대 KB-(m)을 만들 수 없어 위조 불가(non-forgeable)이고, Bob은 자신이 나중에 안 보냈다고 말할 수 없다. (non-repudation, 부인 방지)
 
 
Message Digests (해시 요약본)
공개키 암호화로 긴 메시지를 직접 암호화하면 속도도 느리고 연산량이 너무 크기 때문에, 메시지를 짧게 고정된 길이의 요약본(fingerprint)으로 바꾼 다음에 그 요약본을 디지털 서명에 사용하는 것이다.
메시지 m을 해시 함수 H에 통과시키면 고정 길이의 요약본 H(m)이 나온다. 
 
해시함수의 속성
1. Many-to-one 매핑: 서로 다른 긴 메시지들이 동일한 해시 값을 가져 충돌할 수 있다.
2. Fixed-length output: 입력 메시지 길이와 상관없이 항상 같은 길이의 해시를 출력한다.
3. 역산 불가능성: H(m)이 주어졌을 때, 원래 메시지 m을 거꾸로 계산하기가 매우 어렵다. 
해시함수의 알고리즘에는 MD5, SHA 등이 있다. 
 
<Bob이 서명해서 보내는 과정>

Bob의 원본 메시지 m에 해시 함수를 적용하여 짧은 고정 길이 H(m)으로 요약한다.
Bob의 개인키로 해시값을 암호화한다. KB-(H(m)) 이것이 바로 디지털 서명이다.
Bob은 원본 메시지 m과 디지털 서명 KB-(H(m)) 두 가지를 Alice에게 전송한다. 
 
<Alice가 검증하는 과정>

Bob에게 메시지 m과 서명 KB-(H(m))을 받는다. 
원본 메시지 m에 해시함수를 적용하여 H(m)을 생성한다. 
Bob의 공개키로 서명을 복호화한다. KB+(KB-(H(m))) = H(m)
위의 두 값을 비교하여 같은 값을 가지면 Bob이 직접 서명한 것이 확실해진다. 
 
 
공개키 인증기관(CA, Certification Aithority)
공개키와 어떤 사용자의 정체성(신원)을 증명해 주는 신뢰기관이다. 
 
인증서 발급 과정 
1. Bob이 자신의 공개키 KB와 본인의 신원 정보를 CA에 제출한다.
2. CA는 제출된 정보가 진짜라는 걸 확인한 후, Bob의 공개키와 신원정보를 묶어서 디지털 서명을 한다. 서명할 때 CA의 개인키 KCA-를 사용한다. 
3. 이 과정을 통해 생성된 인증서는 CA가 KB를 KCA-로 암호화한 것이다. 죽, 이 공개키 KB는 진짜 Bob이라는 것을 CA가 서명한 것이다. 

 
Alice가 Bob의 공개키를 확인하는 과정
1. Alice는 Bob의 인증서를 받는다. 인증서는 KCA-(KB)로 구성되어 있다. 
2. Alice는 CA의 공개키 KCA+로 인증서를 복호화한다. KCA+(KCA-(KB)) = KB 
이렇게 해서 Bob의 진짜 공개키 KB를 안전하게 획득하고 Bob이 보낸 메시지임을 검증할 수 있다. 
 

Transport layer security (TLS)

인터넷상에서 데이터를 안전하게 전송하기 위한 표준 보안 프로토콜이다. 전송 계층(transport layer) 위에서 동작하며 주로 HTTPS(port 443)에서 사용된다.
TLS는 confidentiality(기밀성), integrity(무결성), authentication(인증) 등의 기능을 제공한다. 
 
TLS의 핵심 요소
Handshake: 클라이언트와 서버가 서로의 신원을 확인하고, 공유된 비밀(Shared secret)을 만들기 위한 절차
Key Derivation: handshake 과정에서 생성된 공유 비밀을 바탕으로 암호화/복호화, 무결성 검증에 사용할 세션 키들을 만들어냄
Data Transfer: 본격적으로 암호화된 데이터를 주고받는 단계
Connection Closure: 연결을 종료할 때도 공격자가 중간에 끼어들지 못하도록 안전하게 마무리
 
t-tls(toy TLS)로 단순화한 TLS 모델이다. 
 
t-tls: initial handshaking

MS: 공유 비밀, EMS: 암호화한 결과

1. TCP 연결 형성
클라이언트(Bob)와 서버(Alice) 사이에 먼저 TCP 연결을 한다. (3-handshake) 
2. TLS Hello
Bob가 "t-tls hello" 메시지를 보낸다. 
3. 서버 인증 및 공유 키 교환
Alice는 자신의 인증서(KCA(KA))를 보낸다. 그 안에 Alice의 공개키(KA+)가 들어있고, Bob은 그걸 검증한 뒤에 Alice의 공개키로 공유 비밀을 암호화해서 전송한다. 즉, Bob이 만든 공유 비밀을 KA+로 암호화해서 전송한다.
4. Server reply로 핸드셰이크 종료
 
암호화용 키와 MAC용 키가 같으면 공격자가 구조를 예측할 수 있기 때문에, TLS에서는 용도별로 다른 키를 사용한다. 

모두 MS를 기반으로 KDF(Key derivation function)을 통해 생성된다. 
MAC은 메시지가 변조되지 않았고, 올바른 송신자에게서 왔음을 검증하는 코드이다. 
 
t-tle: encrypting data
TCP는 byte stream이라 데이터를 전부 받기 전까지는 무결성을 검증할 수 없다.
따라서, 데이터를 레코드로 나눠서 처리하는 방법이 있다. 

하나의 레코드는 length+data+MAC으로, 이 전체를 클라이언트의 암호화 키(KC)로 암호화하여 TCP에 넘긴다. 
(MAC은 MC키를 사용하여 생성한다.)
 
공격자는 TCP의 순서를 바꿔버리거나(re-ordering), 종료 메시지(SIN)를 위조해서 종료를 미리 끊어버릴 수 있다.(truncation attack) 
해결 방법으로는 MAC 계산 시 데이터 순서 번호(Sequence number)를 함께 포함하거나, 데이터인지 연결 종료 메시지인지 Recode type을 추가하는 방법이 있다. (type 0: data, type 1: close)

TLS는 Transport layer 위에서 작동한다.

 
 
TLS: 1.3 cipher suite
cipher suite는 TLS에서 사용하는 암호 알고리즘들의 조합이다. 즉, 어떤 키 교환, 어떤 암호화 방식, 어떤 MAC 방식, 어떤 서명을 쓸지를 묶어놓은 암호 정책 세트라고 할 수 있다. 
TLS 1.2에서는 RSA, DH 등 다양한 키 교환 방식을 사용했는데, TLS 1.3에서는 무조건 Diffie-Hellman 기반을 사용해야 한다. 
 
 
Diffie-Hellman (DH) key exchange 
인터넷처럼 오픈된 네트워크 환경에서도, 중간자에게 노출되지 않으면서 두 사람이 같은 비밀 키(shared secret)를 만들어내는 방법이다. 

‼️ 매우 중요 ‼️

 
1. Alice는 p(아주 큰 소수), g(a generator mod p), a(랜덤한 정수)를 선택한다. 
(generator g는 g^x mod  p로 가능한 모든 값을 한 번씩 만들어낼 수 있는 기초 생성자 숫자의 역할을 의미한다)
2. A = g^a mod p를 계산하여 g, p와 함께 Bob에게 전송한다. 
3. Bob은 랜덤한 정수 b를 이용해 B = g^a mod p를 계산하고 Alice에게 전송한다. 
4. Alice는 K = B^a mod p를, Bob은 K = A^b mod p를 계산한다. K = g^ab mod p라는 동일한 값으로, shared secret을 가지게 된다. 
 
a나 b를 역으로 구하는 건 이산 로그 문제(discrete log problem)때문에 계산상 불가능에 가깝다. 
 
즉, Diffie-Hellman은 공개된 정보만 주고받으면서도 둘만 아는 비밀 키를 안전하게 생성하는 키 교환 알고리즘이다. 
 
 
TLS 1.3 handshake: 1 RTT
클라이언트와 서버가 처음 통신할 때, TLS 1.2보다 훨씬 빠르게 보안 연결을 완료하는 방식이다. 
TCP 연결 완료 후 단 1-RTT 만에 TLS 키 교환, 인증, 데이터 전송을 시작한다. 

1. client hello (클라이언트가 먼저 보내는 메시지)
자신이 지원하는 cipher suite와 DH 키 교환 파라미터(공개키 포함)를 전송한다. 
2. sever hello (서버 응답)
실제로 선택된 cipher suite, DH 파라미터, 서버 인증서를 전송한다. 알고리즘을 선택하고 자신이 진짜 서버임을 증명하는 과정이다.
3. 클라이언트는 서버 인증서를 검증하고 공유 비밀 키를 계산한 뒤에 바로 애플리케이션 요청을 보낸다. 
 
0-RTT
과거에 한 번 TLS 연결을 했던 클라이언트가 이전 연결에서의 정보를 재사용해서 바로 데이터를 보내는 방식이다. 

1. client hello 
지원하는 cipher suite, DH 파라미터, 애플리케이션 데이터까지 포함해서 서버에게 전송한다. 
2. sever hello
선택된 cipher suite, DH 파라미터, 애플리케이션 데이터에 대한 응답을 포함해 전송한다. 
 
이전에 서버와 TLS 연결을 한 적이 있어야 하고 그때 공유 비밀을 기억하고 있어야 가능하다. 
클라이언트가 보낸 요청을 누군가 재전송해서 서버가 또 처리하게 만들 수 있어서 (reply attack), 서버 상태를 바꾸는 요청에는 0-RTT 사용이 위험할 수 있다. 

'Computer Engineering > Computer networks' 카테고리의 다른 글

comnet-06  (0) 2025.04.30
comnet-05  (1) 2025.04.30
comnet-03 sockprog  (0) 2025.04.30
comnet-02  (1) 2025.04.30
comnet-01  (0) 2025.04.30