(작성 중 - 암호화 로직(소인수분해, 이산대수), 디피헬만 작성하기)
읽기 전에
비대칭키 암호화(public/private key), 대칭키 암호화(shared key)에 대해 알고 있어야 합니다.
대칭키 암호화
암호화와 복호화를 할 때 같은 키를 사용하는 암호화 방식입니다.
Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.
- Alice와 Bob이 shared key를 공유합니다.
- Alice는 shared key로 메시지를 암호화합니다.
- 해당 암호문을 Bob에게 전달합니다.
- Bob은 전달받은 암호문을 shared key로 해독합니다.
비대칭키 암호화
암호화와 복호화를 할 때 다른 키를 사용하는 암호화 방식입니다. 공개키-개인키가 한 쌍을 이루며, 공개키로 암호화한 암호문은 개인키로만, 개인키로 암호화한 암호문은 공개키로만 복호화할 수 있다는 특징이 있습니다.
Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.
- Bob이 자신의 public key를 공개합니다.
- Alice는 Bob의 public key로 메시지를 암호화합니다.
- 해당 암호문을 Bob에게 전달합니다.
- Bob은 전달받은 암호문을 자신의 private key로 해독합니다.
종단간 암호화
일반 채팅의 메시지 전송
일반 채팅 어플리케이션들은 전송 중에만 메시지가 암호화됩니다. 아래 예시로 그 과정을 살펴보겠습니다.
Alice가 Bob에게 메시지를 보낸다고 가정했을 때 프로토콜은 아래와 같습니다.
- Alice가 "충성!"이라는 메시지를 보내면 SSL로 암호화되어 서버로 전달됩니다.
- 서버에서는 SSL로 메시지를 복호화하고, Alice가 보낸 메시지가 서버에 평문으로 저장됩니다.
- 서버가 Bob에게 SSL로 메시지를 암호화하고, Bob에세 전달됩니다.
- Bob은 SSL로 메시지를 복호화합니다.
전송 과정 중에는 SSL로 암호화되지만 서버 DB에는 평문으로 저장됩니다. 이 경우, Man in the middle 공격이나 서버 DB가 해킹당할 경우 메시지가 유출됩니다.
종단간 암호화를 사용해 이 문제를 해결할 수 있습니다. 먼저 비대칭키 암호화 방식을 통해 사용자들이 공개키를 교환하고, 메시지 전송/수신 시 공개키를 이용해 암호화/복호화를 진행합니다.
공개키 교환
먼저 종단간 암호화를 적용하기 앞서, 안전하게 대칭키를 교환합니다. 그 과정은 다음과 같습니다.
- 채팅방을 생성하는 사용자의 기기에서 공개키를 생성합니다.
- 초대자는 서버에 있는 피초대자의 공개키로 대칭키를 암호화하고 서버에 전송합니다.
- 피초대자는 서버에 올라가 있는 암호문을 받아와 개인키로 복호화합니다.
결과적으로 피초대자는 초대자의 공개키를 전달받습니다. Man in the middle 공격이나 서버 DB가 해킹당하더라도 해당 공개키는 암호화된 상태이기 때문에 안전합니다.
메시지 전송
채팅방에 참가하는 사용자들이 비대칭키 암호화로 공개키를 교환한 이후에 메시지 전송이 시작됩니다. 그 과정은 대칭키 암호화 방식과 동일합니다.
취약점
이런 종단간 암호화에도 취약점이 몇 가지 있습니다.
모든 경우의 수로 계산하기
- key의 크기를 키워서 대응 가능
공개키 공개 시
- A가 B에게 메시지를 전송한다고 가정합시다.
- A가 B의 공개키를 받아오겠다고 요청합니다.
- C가 B의 공개키를 대신 받아오고, C가 A에게 C의 공개키를 넘겨줍니다.
- A는 C가 보낸 공개키가 B의 공개키인 것처럼 생각하게 됩니다.
- A가 C의 공개키로 암호화한 후 메시지를 전송합니다. 이 메시지는 C에게 갑니다.
- C는, A가 보낸 메시지를 복호화하고 B의 공개키로 평문을 다시 암호화해서 보냅니다.
- B도 A가 보낸 메시지를 받게 됩니다.
이러한 과정을 거치면 A와 B는 안전하게 메시지를 교환하는 것처럼 보이지만, 실제로는 C가 그 내용을 보고 있습니다.
이를 막기 위해서는 디피-헬만 알고리즘을 이용해 공개키의 교환도 안전하게 해야 합니다.
참고자료
ios-security 60p, IOS에서 E2EE는 같은 방식으로 구현됩니다. public key를 서버에 올리고, 메시지를 보낼 때 보낼 대상의 public key로 암호화해서 전송합니다.
이 방법 이외에도 텔레그램에서 사용하고 있는 디피-헬만 알고리즘 (shared key를 생성 및 전달하는 방법)도 있습니다. 그러나 이 경우 man in the middle(간단하게 스니핑이라고 생각하면 됩니다)에 취약합니다.
'CS > Security' 카테고리의 다른 글
[Security] 복무하며 사용한 Spring Secure Coding (0) | 2023.02.06 |
---|