- 6) B가 A에게 통신을 하자는 뜻의 답을 보낸다. 이 때 B는 아까 받았던 A의 Nonce값과 자신이 생성한 Nonce값을 붙여서 메세지를 보낸다.
아까 1,2 번 방법들에 비해 훨씬 진보됐다. 하지만 여전히 문제가 존재한다.
- 키를 교환하기 위해 메세지가 7번이나 왔다갔다 해야한다. 물론 서로가 이전에 통신했던 적이 있어서 서로의 키를 알고 있다면 처음의 4단계는 스킵할 수 있다.
- Authority에게 의존적이다. 이녀석이 bottle-neck 이 될 수 있다. 모든 유저가 authority와 통신하기 원할 때 이녀석은 폭발해 버릴 수 있다.
- 2번과 마찬가지로 Single point failure 문제를 갖고있다.
그럼 도대체 뭘 어떻게 더 개선해야 한단 말인가!
짠~~
4. Public-key certificates📑🔐
한국말로 하면 인증서. 그렇다. 우리를 괴롭히는 그 공인인증서다. 하지만 이것도 나왔을 당시 획기적인 것이라 칭송되어 쓰기 시작해 우리나라가 여전히 사용하고 있는 것이다.
인증서 기법은 CA(Certificate Authority) 라 불리는 authority에 의해 관리되지만 authority 를 거칠 필요 없이 당사자들끼리 키 교환을 안전하게 할 수 있는 기법이다.
인증서는 다음과 같은 항목들로 구성되어 있다.
- public key
- 인증서 주인
- CA의 서명
- 생성시간, 만료일 등등
인증서 만들기
우선 각 유저는 각자의 public key를 CA에게 안전한 방법을 통해 보낸다. 그걸 받은 CA는 자신(CA)의 비밀키를 이용해 유저들의 인증서를 만들어준다.(착하네)
인증서를 이용한 Key 교환
이번에도 A와 B가 키를 교환하고자 한다. A와 B는 서로의 인증서를 교환한다. 상대방의 인증서를 받은 후 CA의 공개키를 이용해 상대방의 인증서가 유효한지를 검증한다. 이러면 끝이다.
내가 지금까지 배운 방법들 중에서는 이게 최고의 키교환 방법이다. 하지만… 대칭키를 쓴다 하면 다른 방법이 또 있다!
Secret-Key Distribution
대칭키 기법도 양자간의 키 교환이 필요하다. 근데 이 키교환을 위해 공개키 기법이 사용될 수 있다.
Simple Secret key Distribution
이번에도 A가 B랑 대화하고 싶어한다.🤙
- A가 자신의 public/private key를 생성한다.
- A가 B에게 자신의 public key와 자신의 신원을 나타낼 수 있는 값을 보낸다.
- B는 그 메세지를 보고 발신자가 A임을 확인하고 함께 사용할 비밀키 K를 생성한다.
- B는 비밀키 K를 A의 공개키로 암호화해 A에게 보낸다.
- A는 자신의 비밀키로 B가 보낸 메세지를 해독해서 K를 알아낸다.
- 이제 A, B는 얘기하고 싶을 때마다 K로 암호화한 메세지를 보낸다👨❤️💋👨
깔끔해보이지? 근데 이건 취약해…
Man in the middle attackMan in the middle attack이라고 불리는 공격이며 이런 모양을 가지고 있다
공격자 E가 중간에서 통신을 가로채는 것! A에게는 B인 것처럼, B에게는 A인 것처럼 행동한다.
그렇기 때문에 이 결점을 보강하기 위해 통신시 서로를 확인하는 과정을 추가해야 한다.
![](https://cdn-images-1.medium.com/max/1280/1*NNqeKHx9pzBFwkMESUrhPA.png)
위에 써있듯이 (1)~(3)과정은 서로를 확인하는 과정이다.
(1) A가 자신의 ID와 임의로 생성한 Nonce를 B의 비밀키로 encrpyt해서 B에게 전송한다
(2) B가 메세지를 복호화 해서 Nonce를 알아내고 거기에 자신이 생성한 Nonce를 덧붙여서 A의 비밀키로 암호화해 A에게 전송한다
(3) A는 이를 자신의 비밀키로 복호화해서 B에게 보낸다. 이 과정에서 A는 B를 신뢰할 수 있게된다.
(4) B가 이 메세지를 보고 A가 맞음을 확인한다. 👨❤️💋👨
참고로 여기서 (1)~(3) 과정은 공개키 교환 방법에서 마지막 세 과정과 같다. 이 방법으로 confidentiality, authentication 모두 얻을 수 있다~