암호화와 복호화
- 암호화(Encryption) : 사람이 읽을 수 있는 데이터를 해독 불가능한 형태로 변환하는 과정
- 복호화(Decryption) : 암호문을 다시 평문으로 되돌리는 과정
이때 Key를 어떻게 관리하느냐에 따라 암호화 방식이 나뉩니다.
대칭키 vs 비대칭키 암호화
- 대칭키 암호화(Symmetric Encryption) : 암호화와 복호화 키가 같은 암호화 방식
- 장점 : 매우 빠르고, 대용량 데이터 처리에 적합함
- 단점 : 키를 전달하다가 탈취되면 큰일남
- 대표적인 알고리즘 : AES
- 비대칭키 암호화(Asymmetric Encryption) : 암호화와 복호화 키가 다른 암호화 방식
- 공개키 : 모두에게 공개해도 되는 키로, 암호화 할 때 사용함
- 개인키 : 오직 나만 갖고 있어야 하는 절대 비밀 키로, 복호화 할 때 사용함
- 장점 : 키를 전달하는 과정에서 탈취되는 것에 문제가 없고, 인증 및 서명이 가능함
- 단점 : 복잡한 수학적 연산이 필요하기 때문에 속도가 느리고, 대용량 처리에 부적합함
- 대표적인 알고리즘 : RSA
암호화 & 복호화 과정
A가 B에게 비밀 문자를 보낸다고 해보자. (A ----비밀문자----> B)
- A는 B가 공개한 공개키를 통해 문자를 암호화한다.
- 암호화된 문자를 전송한다.
이때 중간에 문자를 탈취당해도 B의 공개키로 절대 복호화 할 수 없다. - B는 암호화된 문자를 받고 B만 갖고 있는 개인키로 복호화한다.
여기에서 중요한 부분은, 복호화를 할 수 있는 개인키는 공개키와 한쌍이라는 점입니다.
개인키와 쌍을 이루는 공개키는 딱 하나로, 1 : 1 매칭이 성립됩니다.
비대칭키 암호화 예시 : 인증서
일반적으로 사용하는 카카오 인증서나 토스 인증서를 발급받고 어떻게 사용되는지를 예시로 하겠습니다.
- 처음 인증서를 발급받을 때 내부적으로 개인키와 공개키 쌍이 생성된다.
개인키는 하드웨어 보안 영역에 깊숙히 저장되고, 공개키는 서버로 전송된다.
최종으로 공개키 정보가 포함된 인증서가 발급된다. - 이후 홈택스와 같은 곳에서 [간편인증 로그인]을 요청하면, 랜덤한 숫자나 문구를 디바이스로 전송한다. 이때 Face ID나 비밀번호를 입력하면 내부적으로 문구를 개인키로 암호화해서 전송한다.
- 암호화된 문구를 받으면, 인증 플랫폼에 공개키를 요청해서 공개키로 암호화된 문구를 복호화하여 문구가 일치한지 확인한다.
복호화된 내용이 처음에 보낸 문구와 일치하면 인증에 성공한다.
일반적인 비대칭키 암호화와 달리, 신원 증명을 위한 “전자 서명”의 경우 반대로 개인키로 암호화하고 공개키로 복호화를 할 수도 있습니다.
대칭키 암호화 예시 : HTTPS 통신
서버와 클라이언트가 통신하는 과정을 예시로 하겠습니다.
- 클라이언트에서 서버에게 접속을 요청한다.
코드 상으로 API를 호출했을 때 내장 네트워크 프레임워크에서 TLS 핸드쉐이크 과정을 거친다. (= 보안 터널 생성)
이때 서로 난수를 주고 받음으로써 각자 대칭키를 생성한다. 참고로 난수를 전달할 때에는 비대칭키 암호화 방식을 사용한다. - 이제 Body의 모든 데이터를 대칭키로 암호화하여 전송한다.
사실 HTTPMethod, URL Path, Headers까지 포함된 모든 HTTP 메시지 전체가 암호화되어 전송된다.