Tìm hiểu về giao thức HTTP và HTTPS và các lỗ hổng bảo mật có thể có của nó.

Tổng quan về giao thức của máy tính.

  1. Giao thức là gì ? -Giao thức (protocol) là một tập hợp tiêu chuẩn để trao đổi thông tin giữa hai hệ thống máy tính hoặc hai thiết bị máy tính với nhau được gọi là giao thức. Các giao thức còn được gọi là các nghi thức hoặc định ước của máy tính.
  2. Giao thức được tạo ra như thế nào ? -Như chúng ta đã biết, trong mô hình OSI hoặc TCP/IP, giao thức được tạo ở các tầng khác nhau và khá phức tạp. Chúng được dùng với những mục đích khác nhau và khá phức tạp. Ở đây, tôi chỉ lấy giao thức HTTP ở tầng Application minh họa giúp các bạn dễ hiểu. -Khi lập trình mạng, chúng ta thường sử dụng các SOCKET để tạo kết nối giữa 2 máy tính gồm SOCK_DGRAM (UDP) và SOCK_STREAM (TCP). HTTP được implement dựa trên SOCK_DGRAM, thay vì gửi từng byte sang máy tính khác với giao thức TCP, chúng ta sẽ gửi theo một định dạng gồm Header và body. Header sẽ chứa đường dẫn chúng ta muốn thực hiện và phương thức (GET, POST,...) và các field gồm các cặp key-value như User-agent, Content-Type, Cookie,.... Body sẽ gồm data chúng ta muốn gửi đi (thường là html, xml hoặc json)
    • Như vây chỉ cần sử dụng giao thức TCP (SOCK_STREAM), chúng ta đã có thể implement giao thức HTTP.
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('www.python.org', 80)
client_socket.connect(server_address)

request_header = 'GET / HTTP/1.0\r\nHost: www.python.org\r\n\r\n'
client_socket.send(request_header)

response = ''
while True:
    recv = client_socket.recv(1024)
    if not recv:
        break
    response += recv 

print response
client_socket.close()    

Giao thức HTTPS

HTTPS đảm bảo liên lạc an toàn giữa hai bên bằng cách sử dụng giao thức mã hóa có tên TLS (Transport Layer Security) - kế thừa của SSL. TLS giúp hai bên (Máy khách và Máy chủ) sẽ đàm phán kết nối có trạng thái bằng cách sử dụng quy trình bắt tay. Trong giai đoạn này, một khóa phiên phải được tạo để mã hóa tất cả các gói tin trong phiên giao tiếp. Nói chung, để tạo khóa này, khách hàng sử dụng trao đổi khóa Diffie-Hellman, một thuật toán cho phép hai bên trao đổi khóa mật mã qua kênh công khai.

Giao thức SSL

  • Mã hóa đối xứng (Symmetric encryption) : Gồm một khóa private 2 bên A và B giữ và mã hóa trước khi gửi và giải mã sau khi nhận. Hay nói cách khác một khóa được sử dụng vừa mã hóa, vừa giải mã. (Ko an toàn). Có các loại như AES, DES,....

    • Ưu điểm : Nhanh, dễ sử dụng,...
    • Nhược điểm : Dễ bị tấn công, sniffing, MITM,....
  • Mã hóa bất đối xứng (Asymmetric encryption): Gồm một khóa công khai (public) và một khóa bí mật (private). Mỗi bên sẽ có một cặp khóa bất đối xứng. Khóa công khai sẽ dùng để mã hóa và khóa bí mật dùng để giải mã. Loại mã hóa điển hình và sử dụng nhiều nhất là RSA.

    • Ví dụ: Bên A gồm một cặp (publicA, privateA). Khi ai giao tiếp với A, sẽ dùng khóa publicA để mã hóa dữ liệu và gửi cho A. Khi A nhận được sẽ dùng khóa privateA để giải mã và đọc được nội dung (plaintext)
    • Ưu điểm : Bảo mật, khó bị tấn công,....
    • Nhược điểm : Chậm,...
  • Giao thức SSL sử dụng cả hai loại mã hóa để mã hóa, mã hóa bất đối xứng để trao đổi key (symetric key), và sử dụng mã hóa đối xứng để mã hóa.

  • Ban đầu, server sẽ có 1 cặp public+private key của mã hóa bất đối xứng, client có khóa private key của mã hóa đối xứng.

  1. Phía server gửi public key (khóa công khai của mã hóa bất đối xứng) của server cho bên client
  2. Trình duyệt tạo khóa đối xứng và mã hóa nó với public key của server vừa đưa. Nhằm đảm bảo key đó ko bị nghe lén trong quá trình trao đổi key (vì sử dụng mã hóa đối xứng nên nếu hacker nghe lén được khóa đối xứng sẽ có thể giải mã tất cả thông điệp trong quá trình truyền giữa client và server).
  3. Server sử dụng private key của mình ddể giải mã khóa client vừa gửi. Giờ đây server và client đã có được khóa đối xứng mà ko bị nghe lén.
  4. Server và client sử dụng khóa đối xứng để mã hóa và giải mã dữ liệu.
  • Tuy mã hóa bất đối xứng server sử dụng key có độ dài 512-bit nhưng vẫn có khả năng bị tấn công, điển hình là lỗ hổng bảo mật (CVE-2015-4000). Hơn thể nữa, các cặp public + private key đang dần được lưu lại và trang web giúp chúng ta có thể tìm được các cặp public / private key.
  • Các loại mã hóa hiện đại nhất như RSA, AES vẫn tồn tại các lỗ hổng bảo mật ngày càng nhiều.
  • Điển hình như RSA gồm có Wiener attack, RSA Factorization Attack Using Fermat's Algorithm,.....
  • Và AES cũng có AES CBC bit-flipping, AES block cipher attack,...
  • Ở bài viết sau, chúng ta sẽ tìm hiểu về các loại attack này. Và cách phòng chống nó.