Skip to content

종단간 암호화 (End to end Encryption)

hyelie edited this page Oct 28, 2022 · 4 revisions

읽기 전에

비대칭키 암호화(public/private key), 대칭키 암호화(shared key)에 대해 알고 있어야 합니다.

대칭키 암호화

암호화와 복호화를 할 때 같은 키를 사용하는 암호화 방식입니다.

Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.

  1. Alice와 Bob이 shared key를 공유합니다.
  2. Alice는 shared key로 메시지를 암호화합니다.
  3. 해당 암호문을 Bob에게 전달합니다.
  4. Bob은 전달받은 암호문을 shared key로 해독합니다.

비대칭키 암호화

암호화와 복호화를 할 때 다른 키를 사용하는 암호화 방식입니다. 공개키-개인키가 한 쌍을 이루며, 공개키로 암호화한 암호문은 개인키로만, 개인키로 암호화한 암호문은 공개키로만 복호화할 수 있다는 특징이 있습니다.

Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.

  1. Bob이 자신의 public key를 공개합니다.
  2. Alice는 Bob의 public key로 메시지를 암호화합니다.
  3. 해당 암호문을 Bob에게 전달합니다.
  4. Bob은 전달받은 암호문을 자신의 private key로 해독합니다.

미어캣의 종단간 암호화

일반 채팅의 메시지 전송

일반 채팅 어플리케이션들은 전송 중에만 메시지가 암호화됩니다. 아래 예시로 그 과정을 살펴보겠습니다.

Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.

  1. Alice가 "충성!"이라는 메시지를 보내면 SSL로 암호화되어 서버로 전달됩니다.
  2. 서버에서는 SSL로 메시지를 복호화하고, Alice가 보낸 메시지가 서버에 평문으로 저장됩니다.
  3. 서버가 Bob에게 SSL로 메시지를 암호화하고, Bob에세 전달됩니다.
  4. Bob은 SSL로 메시지를 복호화합니다.

전송 과정 중에는 SSL로 암호화되지만 서버 DB에는 평문으로 저장됩니다. 이 경우, Man in the middle 공격이나 서버 DB가 해킹당할 경우 메시지가 유출됩니다.

미어캣은 종단간 암호화를 사용해 이 문제를 해결합니다. 먼저 비대칭키 암호화 방식을 통해 사용자들이 공개키를 교환하고, 메시지 전송/수신 시 공개키를 이용해 암호화/복호화를 진행합니다.

미어캣의 공개키 교환

미어캣은 대화방 생성 및 초대 시 비대칭키 암호화 방식을 통해 안전하게 대칭키를 교환합니다.

그 과정은 다음과 같습니다.

  1. 채팅방을 생성하는 사용자의 기기에서 공개키를 생성합니다.
  2. 초대자는 서버에 있는 피초대자의 공개키로 대칭키를 암호화하고 서버에 전송합니다.
  3. 피초대자는 서버에 올라가 있는 암호문을 받아와 개인키로 복호화합니다.

결과적으로 피초대자는 초대자의 공개키를 전달받습니다. Man in the middle 공격이나 서버 DB가 해킹당하더라도 해당 공개키는 암호화된 상태이기 때문에 안전합니다.

미어캣의 메시지 전송

채팅방에 참가하는 사용자들이 비대칭키 암호화로 공개키를 교환한 이후에 메시지 전송이 시작됩니다. 그 과정은 대칭키 암호화 방식과 동일합니다.

참고자료

ios-security 60p, IOS에서 E2EE는 같은 방식으로 구현됩니다. public key를 서버에 올리고, 메시지를 보낼 때 보낼 대상의 public key로 암호화해서 전송합니다.

이 방법 이외에도 텔레그램에서 사용하고 있는 디피-헬만 알고리즘 (shared key를 생성 및 전달하는 방법)도 있습니다. 그러나 이 경우 man in the middle(간단하게 스니핑이라고 생각하면 됩니다)에 취약합니다.

whatsapp-security

diffie-hellman algorithm wikipedia

diffie-hellman algorithm for multiple people