Hiểu về HTTPS trong 5 phút

Nhắc tới web, chúng ta không thể không biết tới giao thức HTTP và HTTPS. Chúng ta đều biết HTTP là giao thức để client và server trao đổi dữ liệu với nhau. Điểm yếu của HTTP là những dữ liệu trao đổi được truyền dưới dạng thuần văn bản, dẫn tới bảo mật dữ liệu không cao. HTTPS ra đời để giải quyết vấn đề này, với kí tự S được viết tắt từ Security (nghĩa là bảo mật). Mặc dù đã có nhiều tài liệu nói về giao thức này nhưng hầu hết chúng thường được mô tả bằng ngôn ngữ kĩ thuật tương đối phức tạp, vì vậy sẵn tiện mình viết một bản tóm tắt nhỏ về giao thức bảo mật này theo cách đơn giản nhất có thể.

Về cơ bản, HTTP hay HTTPS là những phương thức giao tiếp giữa 2 bên (giữa client và server), không cần đi quá sâu vào chi tiết, hãy hình dung việc giao tiếp này là một cuộc trao đổi thư từ giữa 2 người. Lấy ví dụ với chàng Romeo và người yêu là nàng Juliet. Như vậy, quá trình trao đổi gồm 3 đối tượng chính: 2 người cần trao đổi thư từ (Romeo & Juliet) + người giao thư.

Bắt đầu với cách trao đổi thư đơn giản nhất

Nếu Romeo muốn gửi thư cho Juliet, rất đơn giản, anh ta chỉ cần viết nội dung vào một lá thư, sau đó nhờ người đưa thư giao cho Juliet. Khi Juliet nhận được thư, nàng đọc, và như vậy là quá trình liên lạc hoàn tất trọn vẹn.

http 1
Trường hợp gửi thư thông thường – HTTP (Đơn giản nhưng dễ bị tấn công man-in-the-midle)

Nhưng, sẽ thế nào nếu ông Capulet (cha của Juliet) chen ngang vào đoạn giữa – trước khi người đưa thư trao thư cho Juliet (Kiểu tấn công man-in-the-middle). Với HTTP, nội dung thư không được mã hoá, ông Capulet có thể sửa nội dung thư trước khi trao lại cho con gái mình, Juliet sẽ không thể biết được lá thư mình nhận đã bị sửa hay chưa. Như vậy, quá trình trao đổi có thể xuất hiện sai lệch không thể kiểm tra được (điều này thực sự nguy hiểm).

Đây chính là vấn đề mà HTTPS muốn giải quyết.

Romeo và Juliet phải mã hoá thông tin

Romeo và Juliet đã nghĩ ra 1 cách để che giấu đi thông điệp mà 2 người trao đổi, họ sẽ mã hoá lá thư trước khi gửi. Cách mã hoá như sau: dịch bảng chữ cái về phía sau 1 kí tự (mã hoá tức là biến đổi thông tin theo 1 cách nào đó để nó khác đi so với ban đầu). Như vậy, nếu thông điệp là “I love you”, thì Romeo sẽ viết thành “J mpwf zpv”.

Chỉ có Romeo và Juliet biết được cách để giải mã, và như vậy, ông Capulet sẽ bất lực khi muốn thay đổi nội dung lá thư, bất cứ sự thay đổi nào cũng sẽ bị cả 2 phát hiện. Với quy ước đã định (ta gọi cách giải mã là khoá – key), nàng Juliet chỉ cần dịch chuyển bảng chữ cái đi là sẽ giải mã ra được thông điệp ban đầu, là “I love you”.

https 1

Quá trình mã hoá này được gọi là “mã hoá đối xứng” (symmetric key cryptography), tức là: khi biết được cách mã hoá, sẽ biết được cách giải mã.

Vấn đề đã được giải quyết chưa? Vẫn chưa …

Làm thế nào để Romeo và Juliet thống nhất được khoá (key)?

Cách mã hoá đối xứng tương đối an toàn nếu khoá chỉ được giữ bởi 2 bên nhận và gửi. Vấn đề là: Bởi vì Romeo và Juliet không thể gặp trực tiếp nhau, làm sao họ nói cho nhau biết được cách họ sẽ mã hoá là gì (khoá là gì)?

Bởi vì vấn đề này, ta sẽ phải thay đổi hoàn toàn cách để gửi và nhận thư giữa 2 người: dùng hộp bí mật.

Chiếc hộp bí mật

Romeo và Juliet quyết định sẽ thực hiện việc trao đổi theo một cách hoàn toàn mới. Khi mà Romeo muốn gửi thư cho Juliet, họ sẽ thực hiện theo quy trình sau:

  • Romeo nói với người đưa thư rằng anh muốn gửi thư cho Juliet, và người đưa thư sẽ nói với Juliet điều đó (Thông điệp riêng tư vẫn chưa được gửi)
  • Juliet đưa cho người đưa thư một chiếc hộp với tình trạng mở khoá, chỉ có nàng nắm giữ chiếc khoá mở.
  • Người đưa thư quay trở lại với Romeo, và Romeo sẽ bỏ lá thư cần gửi vào chiếc hộp và khoá lại. Chiếc hộp với tình trạng khoá sẽ được người đưa thư chuyển ngược lại cho Juliet.
  • Cuối cùng, Juliet nhận được chiếc hộp, nàng mở ra và đọc nội dung mà Romeo đã gửi.

Bằng cách này, ông Capulet (vai trò man-in-the-midle) dù có lấy được chiếc hộp cũng không thể mở ra để đọc nội dung lá thư bên trong. Juliet lúc này có thể yên tâm rằng nội dung thư trao đổi được bảo mật và an toàn.

https 2.JPG
Kĩ thuật trao đổi có mã hoá bất đối xứng

Một cách kĩ thuật, ta có thể gọi cách mã hoá này là “mã hoá bất đối xứng” (asymetric key cryptography), tức là người thực hiện mã hoá chưa chắc đã giải mã ngược lại được (Romeo khoá hộp lại được nhưng không thể mở ra lại, vì Juliet là người duy nhất giữ khoá). Có thể hình dung nôm na rằng, chiếc hộp là public key, và chìa khoá là private key.

Làm thế nào biết được chiếc hộp là của Juliet mà không phải giả mạo?

Nếu bạn tinh ý, thì có thể nhận ra rằng, cách giao tiếp ở trên vẫn tồn tại 1 vấn đề còn khúc mắc: bởi vì 2 người không có cơ hội gặp trực tiếp, làm thế nào Romeo biết được chiếc hộp kia là của Juliet mà không phải của một man-in-the-midle nào khác?

Câu trả lời là: Juliet sẽ tạo 1 chữ kí (signature) ở chiếc hộp, và Romeo sẽ kiểm tra xem chiếc hộp gửi đến có tồn tại chữ kí của nàng Juliet hay không. Lại một câu hỏi nữa: Làm thế nào biết được chữ kí là thật?

Thay đổi cách làm ở trên 1 chút, ta sẽ có cách giải quyết: thay vì Juliet sẽ kí tên, thì một người khác (có uy tín cao) sẽ kí tên xác nhận rằng chiếc hộp đúng là của Juliet. Người thực hiện kí tên thay mặt này phải là một người có uy tín cao và được mọi người công nhận, ta giả sử rằng trong trường hợp Romeo và Juliet, người cấp xác thực cho chiếc hộp chính là Cha sở nhà thờ (nếu bạn có đọc qua truyện Romeo & Juliet thì sẽ biết có một vị cha sở có uy tín trong vùng đã làm chứng cho 2 người kết hôn).

Khi cấp chứng chỉ xác thực, cha sở sẽ kiểm tra chiếc hộp đúng là của Juliet, và sẽ đánh dấu xác thực vào chiếc hộp này. Khi đó Romeo và Juliet sẽ biết chính xác rằng chiếc hộp là bí mật và hợp lệ giữa 2 người mà không cần phải gặp nhau trực tiếp để xác nhận.

https 4.JPG
Mô hình HTTPS trong thực tế

Trong thực tế kĩ thuật, người cha sở trong ví dụ này chính là các “đơn vị cung cấp chứng thực số” (certification authority), các chữ kí xác thực chính là các “chứng chỉ số” (certificate) mà nhà cung cấp dịch vụ xác thực cấp cho website của bạn. Bởi vì tính chất định danh, mỗi “chứng chỉ số” là riêng biệt và duy nhất.

Romeo trong thực tế chính là trình duyệt web của bạn, và Juliet chính là các trang web mà bạn truy cập đến. Khi bạn thực hiện truy vấn tới trang web nào đó, server sẽ trả về thông tin mã hoá và chứng chỉ số cho browser. Các browser có hỗ trợ HTTPS sẽ tự động kiểm chứng các certificate này.

Đến đây thì hẳn là bạn đã hình dung được tổng quan về HTTPS là gì rồi.

Chiếc hộp và vấn đề về hiệu suất

Nói thêm một chút, mặc dù việc gửi nhận các nội dung thư từ thông qua chiếc hộp bí mật đã giải quyết được vấn đề về độ bảo mật, nhưng cách này có vẻ như đã tăng số bước lên nhiều lần so với thông thường, có cách nào để hạn chế việc dùng hộp mà thông tin vẫn được đảm bảo hay không?

Câu trả lời là: Kết hợp cả 2 kiểu mã hoá đối xứng (gửi thông điệp trực tiếp đã được mã hoá) và bất đối xứng (gửi thông điệp thông qua chiếc hộp bí mật):

  • Mã hoá bất đối xứng được thực thi lần đầu tiên khi ta tạo kết nối giữa client và server, lần “giao tiếp” đầu tiên này 2 bên sẽ thống nhất cách thức của mã hoá đối xứng được dùng cho các lần giao tiếp tiếp theo.
  • Khi đã thống nhất cách mã hoá đối xứng rồi, các lần giao tiếp sau chỉ cần sử dụng cách mã hoá này mà không cần dùng thêm chiếc hộp bí mật nữa.

Hết rồi, tổng quan về HTTPS chỉ có bấy nhiêu đó thôi. Chúc vui!

Tham khảo:

  1. HTTPS explained with carrier pigeons

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s