Bảo mật tầng socket

Giao tiếp qua mạng internet, hay nói cách khác là giao tiếp thông qua socket đều là những môi trường chứa đựng rất nhiều rủi ro. Giữa một rừng các thiết bị từ router cho đến switch hay các modem wifi, thêm vào nữa là sự kiểm soát của các nhà cung cấp mạng internet (ISP - Internet Service Provider) và chính phủ làm cho thông tin của chúng ta cực kì thiếu an toàn, chính vì vậy cần phải có một cơ chế bảo mật để bảo vệ chúng ta khỏi những nguy cơ:

  1. Bị nghe lén: một người nào đó có thể xen vào cuộc hội thoại của chúng ta và nghe lén, từ đó họ sẽ lợi dụng các thông tin này để chuộc lợi, đặc biệt các thông tin nhạy cảm như mật khẩu, token, thông tin hộ chiếu hay chứng minh nhân dân
  2. Bị thay đổi thông tin: một người nào đó có thể xen ngang vào cuộc trò chuyện, thay đổi nội dung cuộc trò truyện để gửi các mã độc hại
  3. Bị giả mạo: một người nào đó có thể giả mạo người gửi để phát tán các thông tin nguy hiểm

Ý tưởng ban đầu

Thật may mắn cho chúng ta là các nhà khoa học tài ba đã sáng tạo ra RSA, thuật toán mã hoá bất đối xứng thần thánh. Với cặp khoá bí mật và công khai, chúng ta có thể thoải mái trao đổi khoá công khai mà không sợ bị lộ khoá bí mật. Quy trình khá đơn giản như sau:

  1. Client và server connect với nhau
  2. Client gửi đến server yêu cầu bắt tay: ở bước này client gửi khoá công khai của mình đến server
  3. Server lưu lại khoá công khai của client và gửi khoá công khai của mình cho client
  4. Sau khi client và server đã có khoá công khai của nhau, 2 bên sẽ sử dụng public key để mã hoá dữ liệu gửi đi và sử dụng private key của mình để giải mã dữ liệu nhận được

Ý tưởng cải tiến

Nhìn các bước trao đổi ở trên thì có vẻ khá đơn giản và hay ho, nhưng lại có vấn đề đó là tốc độ mã hoá và giả mã của RSA rất chậm, nếu cứ sử dụng phương pháp này thì hiệu năng sẽ bị giảm thê thảm. Vậy nên chúng ta sẽ cần cải tiến như sau:

  1. Client và server connect với nhau
  2. Client gửi đến server yêu cầu bắt tay: ở bước này client gửi khoá công khai của mình đến server
  3. Server lưu lại khoá công khai của client và gửi khoá công khai của mình kèm theo session key (khoá cho mã hoá đối xứng, có thể là AES) cho client. Session key này sẽ được mã hoá với khoá công khai của client. Ở bước này server có thể không cần thiết phải gửi khoá công khai của mình cho client nếu client không có nhu cầu sử dụng.
  4. Sau khi client nhận được Session key nó sẽ giải mã bằng private key của mình và lưu lại, từ đây client và server có thể sử dụng session key để mã hoá và giải mã dữ liệu, tốc độ vì thế mà sẽ được cải thiện đáng kể.

An toàn nhưng chưa đủ

Một trong những môi trường nguy hiểm nhất đó chính là môi trường web. Bất kì ai cũng có thể tạo ra một website với một tên miền, và trong thế giới với hàng trăm triệu trang web như hiện nay thì không thể biết đâu là thật đâu là giả để mà tin, chính vì vậy chúng ta sẽ cần có sự tham gia của bên thứ 3 để chứng thực, chúng ta gọi đó là CA (Certificate Authority), mình sẽ nói ở bài sau nhé.

Tham khảo

  1. Wiki
  2. RSA
  3. AES