20/34 HTTPS và TLS Các chương

HTTPS mã hoá dữ liệu như thế nào?

Làm sao mật khẩu đi qua Internet mà người ở giữa không đọc được?

Bạn nhập:

email=tung@example.com
password=matkhau123

rồi bấm Đăng nhập.

Dữ liệu đó không đi thẳng từ laptop tới máy chủ. Nó có thể qua Wi-Fi, router, mạng của nhà cung cấp Internet và nhiều router khác.

Nếu nội dung đi qua những chỗ đó ở dạng đọc được, người đứng giữa cũng có thể đọc mật khẩu.

Làm sao gửi nó đi mà không để lộ nội dung?

HTTP không tự mã hoá dữ liệu

Một yêu cầu HTTP có thể chứa:

POST /dang-nhap HTTP/1.1
Host: example.com

email=tung@example.com&password=matkhau123

HTTP tự nó không có bước mã hoá nội dung này.

Cookie đăng nhập, dữ liệu form, đường dẫn và nội dung trang cũng tương tự.

HTTPS giải quyết chuyện đó bằng cách đặt HTTP bên trong một lớp bảo vệ gọi là TLS.

HTTP + TLS = HTTPS

TLS mã hoá dữ liệu trước khi nó rời máy.

Cùng một lần đăng nhập, sự khác nhau giữa HTTP và HTTPS trông như thế này:

So sánh HTTP và HTTPS: với HTTP người đứng giữa đọc được email và mật khẩu; với HTTPS dữ liệu đi qua mạng ở dạng đã mã hoá nên người đứng giữa không đọc được nội dung

Với HTTP, người quan sát đường truyền có thể đọc nội dung.

Với HTTPS, họ vẫn thấy dữ liệu đang đi qua, nhưng phần HTTP bên trong đã được mã hoá.

Hai bên lấy khoá mã hoá ở đâu?

Để mã hoá và giải mã, trình duyệt và máy chủ cần có cùng một khoá phiên (session key).

Nhưng không thể gửi thẳng khoá đó qua Internet. Nếu làm vậy, người nghe lén cũng lấy được.

TLS giải quyết việc này bằng một bước gọi là bắt tay (handshake).

Trong TLS hiện đại, trình duyệt và máy chủ trao đổi một số dữ liệu công khai. Từ những dữ liệu đó, mỗi bên tự tính ra các khoá phiên giống nhau.

Khoá phiên không được gửi nguyên vẹn qua mạng.

Trình duyệt và máy chủ gửi cho nhau dữ liệu công khai; người đứng giữa thấy cả hai phần dữ liệu đó. Mỗi bên lấy dữ liệu nhận từ bên kia cộng với bí mật riêng không bao giờ rời máy, và tự tính ra cùng một khoá phiên. Người đứng giữa không có bí mật riêng nên không tính được khoá

Thực tế TLS tạo nhiều khoá khác nhau: mỗi chiều gửi một khoá, lúc bắt tay một bộ, lúc gửi dữ liệu một bộ khác. Gọi chung là khoá phiên vẫn đủ để hiểu cơ chế.

Sau khi bắt tay xong, trình duyệt dùng khoá đó để mã hoá HTTP. Máy chủ có khoá tương ứng nên mở lại được.

Nhưng mã hoá thôi vẫn chưa đủ.

Nếu dữ liệu bị sửa trên đường thì sao?

Người đứng giữa có thể không đọc được dữ liệu, nhưng vẫn có thể thử thay đổi vài byte trước khi chuyển tiếp.

TLS vì vậy còn kiểm tra tính toàn vẹn của dữ liệu.

Nếu dữ liệu bị thay đổi trên đường, việc xác thực không còn khớp và bên nhận loại dữ liệu đó.

TLS lúc này làm được hai việc:

Nghe lén  → không đọc được nội dung
Sửa dữ liệu → bên nhận phát hiện được

Hai việc đó chỉ có ích khi chúng phủ hết những gì cần giấu. Mật khẩu chưa phải thứ duy nhất.

HTTPS phải bảo vệ cả phiên đăng nhập

Chỉ mã hoá trang nhập mật khẩu vẫn chưa đủ.

Sau khi đăng nhập, trình duyệt thường nhận một cookie phiên:

session=7fd92ab...

Cookie này giúp máy chủ nhận ra bạn trong những yêu cầu tiếp theo.

Nếu mật khẩu đi bằng HTTPS nhưng cookie sau đó lại đi bằng HTTP, người lấy được cookie có thể chiếm phiên đăng nhập mà không cần biết mật khẩu.

Năm 2010, tiện ích Firefox Firesheep cho thấy vấn đề này rất rõ trên những mạng Wi-Fi nơi lưu lượng HTTP có thể bị quan sát.

Vì vậy HTTPS cần được dùng cho toàn bộ phiên, không chỉ trang đăng nhập.

Các trình duyệt cũng ngày càng cảnh báo rõ với HTTP; Chrome bắt đầu đánh dấu mọi trang HTTP là Not secure từ Chrome 68 năm 2018.

HTTPS vẫn để lộ một số thông tin

HTTPS không làm kết nối biến mất.

Router vẫn phải biết gói tin cần được chuyển tới đâu, nên người quan sát mạng vẫn có thể thấy những thứ như:

IP đích
thời điểm kết nối
thời lượng kết nối
lượng dữ liệu được truyền

Tên miền đôi khi cũng có thể bị lộ hoặc suy ra từ DNS, địa chỉ IP hoặc thông tin của quá trình kết nối, tuỳ các cơ chế bảo vệ đang được sử dụng.

Nhưng phần HTTP bên trong, như:

/dang-nhap
password=matkhau123
Cookie: session=...
nội dung HTML
dữ liệu API

được TLS bảo vệ.

HTTPS không ngăn dữ liệu đi qua các mạng trung gian.

Nó cho phép những mạng đó chuyển dữ liệu mà không cần đọc được nội dung bên trong.

SSL và TLS khác nhau thế nào?

SSL là tên các giao thức cũ, do Netscape làm từ những năm 1990. SSL 3.0 là nền của TLS, và từ năm 2015 đã bị cấm dùng. HTTPS ngày nay chạy TLS. Cụm “SSL certificate” vẫn còn được dùng phổ biến, nhưng không có nghĩa website đang chạy SSL.

Nếu kẻ đứng giữa có mặt ngay từ lúc bắt tay?

Kẻ đứng giữa giờ không đọc, không sửa được dữ liệu.

Nhưng giả sử hắn đứng giữa ngay từ đầu và nhận bắt tay thay cho máy chủ. Hắn cũng đưa ra được dữ liệu công khai của riêng mình.

Trình duyệt sẽ tính ra khoá phiên với chính hắn. Mật khẩu vẫn được mã hoá cẩn thận, và gửi thẳng cho kẻ giả mạo.

Làm sao trình duyệt biết đầu bên kia đúng là example.com?

Nguồn bài viết (6)

  1. RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3 · IETF
  2. RFC 9849 — TLS Encrypted Client Hello · IETF
  3. Firesheep (Eric Butler, 24/10/2010) · codebutler.com
  4. A secure web is here to stay (8/2/2018) · Chromium Blog
  5. RFC 6101 — The Secure Sockets Layer (SSL) Protocol Version 3.0 · IETF
  6. RFC 7568 — Deprecating Secure Sockets Layer Version 3.0 · IETF