⚠️ 들어가기 앞서
경북대학교 컴퓨터학부 COMP0414-001 컴퓨터망 과목을 공부하며 정리한 글입니다.
TLS( Transport Layer Security)은 컴퓨터 네트워크에 통신 보안을 제공하기 위해 설계된 암호 규약이다. (위키백과)
TLS는 클라이언트/서버 응용 프로그램이 네트워크로 통신을 하는 과정에서 도청, 간섭, 위조를 방지하기 위해서 설계되었다. 그리고 암호화를 해서 최종단의 기밀성(confidentiality), 인증(authentication), 무결성(integrity)을 제공한다.
기밀성은 대칭키 암호화를 통해, 무결성은 암호 해싱(cryptographic hashing)을 통해, 인증은 공개키 암호화를 통해 보장 가능하다.
전송 계층에서의 보안을 위해서는 4가지가 필요하다.
handshake
: 각자의 인증서, 개인키를 이용해 서로를 인증하거나 공유 비밀키를 만듦key derivation
: 공유 비밀키를 이용해 키 집합을 유도함data transfer
: 데이터를 주고 받음connection closure
: 연결을 안전하게 닫기 위한 특별한 메시지를 사용한다.master secret
을 보낸다. 이 master secret은 TLS 세션에 필요한 나머지 모든 키를 생성하는 데 사용된다.그러나 이 과정은 클라이언트가 데이터를 받을 수 있을 때까지 3RTT (round trip time) 이 소요되므로 다소 오래 걸린다는 단점이 있다.
두 개 이상의 암호 함수에 같은 키를 사용하는 것은 좋지 않다. 따라서 authentication 작업에 MAC (Message Authentication Code)
을 사용하고 그리고 암호화에 서로 다른 키를 사용한다.
메시지 인증 코드(Message Authentication Code, 약칭 MAC)는 메시지의 인증에 쓰이는 작은 크기의 정보이다. MAC 알고리즘은 비밀 키를 입력받고, 출력으로써 MAC을 출력한다. MAC 값은 검증자(비밀 키를 소유한 사람)의 허가에 의해서 메시지의 데이터 인증과 더불어 무결성을 보호한다. (위키백과)
클라이언트가 서버에게 보내는 데이터를 위한 암호화 키와 MAC 키, 그리고 서버가 클라이언트에게 보내는 데이터를 위한 암호화 키와 MAC 키 총 4개의 키를 사용한다.
이 키들은 KDF (Key Derivation Function)
에 의해 얻을 수 있다.
새 키를 얻기 위해 master secret이, 때때로 추가적인 랜덤 데이터가 사용된다.
TCP 소켓 안에 담겨진 data instream을 암호화 할 수 있을까?
data stream을 'record' 단위로 분해함으로써 해결할 수 있다.
각각의 레코드는 Mc(client -> server에 사용되는 MAC)을 이용해서 만들어진 MAC을 포함한다. 그리고 아래 그림처럼 대칭 키 Kc로 암호화되며 TCP로 전달된다.
이 과정에서 man-in-middle 이 공격을 할 여지가 있다.
re-ordering
: TCP segment들을 가로채어 암호화되지 않은 헤더의 sequence number를 수정함으로써 record 간의 순서를 뒤섞는 것replay
해결책으로는 TLS sequence number를 사용하는 것과 nonce를 사용하는 것이 있다.
공격자가 TCP connection close segment을 위조하여 강제로 연결을 닫으려 할 수 있다.
이에 대한 해결책으로는 레코드에 타입을 지정해 주는 것으로, 그 타입들 중 하나를 closure로 사용하는 것이다. 예컨대 0 타입은 일반 데이터, 1 타입은 close로 사용하는 것이다.
그러면 이제 MAC은 데이터, 타입, 그리고 seq #을 이용해 계산된다.
암호화 스위트(Cipher Suite)는 전송 계층 보안(Transport Layer Security, TLS)에서 쓰이는 인터넷 보안 보조 알고리즘이다. (위키백과)
다시말해 키 교환 알고리즘, 암호화/복호화, 인증 등에 사용되는 기술들 중 어떤 기술을 사용할지 정해둔 통신 프로토콜이다. Cipher Suite는 TLS_DHE_RSA_AES128_SHA1
처럼 나타낸다.
TLS 버전이 1.2에서 1.3으로 업그레이드 되면서 지원하는 Cipher Suite의 개수가 줄어들었다. 취약점이 있다고 생각되는 사이퍼 수트는 제거하고 5개만을 지원하고 있다.
TLS 1.3에서는 키 교환에서 Diffie-Hellman
을 사용하고 암호화와 인증 알고리즘을 혼합한 형태를 사용한다.
전에 살펴보았던 3 RTT handshake를 개선하여 1 RTT 만에 handshake를 할 수 있는 방법이 고안되었다.
client TLS hello
message : key agreement protocol, parameter 등을 추측하고, 지원하는 cipher suite를 표시한다.server TLS hello
message : key agreement protocol, parameter, cipher suite를 선택한다. 서버 인증서도 함께 보낸다.심지어 0 RTT만에 바로 handshake를 수립할 수도 있다.
처음에 client가 보내는 hello message에 암호화된 application data를 포함하여 보낸다.
이전에 수립했던 connection을 resume
하고 있다. 이전 연결에서 정의하였던 master secret을 통해 application data를 암호화한다.
디피-헬먼 키 교환(Diffie–Hellman key exchange)은 암호 키를 교환하는 하나의 방법으로, 두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다. (위키백과)
공개된 통신망에서 암호 키를 교환하는 방식을 나타낸다.
DH 알고리즘의 핵심은 상대방의 공개키와 나의 개인키를 이용하여 계산을 하면 비밀키가 나온다는 것이다. 그 후 나와 상대방은 비밀키를 사용하여 데이터를 암호화한 후 전달하면 된다.
이는 이산 대수 문제(Discrete Logarithm Problem)(혹은 이산 로그)라는 방식을 이용한다.
y = g^x mod p
일 때 g, x, p를 안다면 y는 쉽게 알 수 있으나 g, y, p를 알 때 x를 구하기는 어렵다는 방식에 착안하였다.