Rate this post

Xác thực thông điệp là một cơ chế cho phép chúng ta có thể kiểm soát tính toàn vẹn của thông điệp. Xác thực một thông điệp tức là chúng ta phải bảo đảm trong quá trình truyền thông, thông điệp tại đầu nhận phải giống y hệt như khi nó được gửi đi. Điều đó có nghĩa là phải kiểm soát được thông điệp có bị sửa đổi, thêm bớt, tẩy xoá hoặc lặp lại trong quá trình trao đổi trên đường truyền hay không. Xác thực thông điệp còn phải kiểm tra được tính hợp lệ của người gửi. Tóm lại, xác thực một thông điệp bao gồm các thành phần sau:

  • Kiểm tra tính toàn vẹn của thông điệp;
  • Xác nhận tính hợp lệ của người gửi.

Tiếp theo sau đây chúng ta sẽ lần lượt khảo sát chi tiết thành phần của xác thực bao gồm các yêu cầu, mức độ và các tiếp cận khác nhau trong vấn đề xác thực.

Các bài viết liên quan:

Vấn đề về xác thực

Mô hình xác thực tổng quát được mô tả bằng hình vẽ sau:

Trong mô hình này, giả sử Alice gửi một thông điệp xác thực cho Bob thì ngoài thông điệp M, Alice cần gửi thêm một giá trị xác thực Auth (authentication) kèm theo để xác thực. Giá trị Auth được tính như sau:

Giữa Alice và Bob đã chia sẻ với nhau trước một giá trị bí mật k. Auth được tính theo công thức: Auth = A(k, M), trong đó A là một hàm số được công bố công khai. Giá trị Auth sẽ được gắn kèm với thông điệp M để gửi đến cho Bob.

Để xác thực thông điệp, Bob sẽ tính giá trị xác thực mới AuthB = A(k, M), sau đó Bob sẽ so sánh giá trị này với Auth để đối chứng. Nếu Auth = AuthB thì có thể khẳng định thông điệp không bị thay đổi trên đường truyền và thông điệp được gửi từ Alice. Lý do ở đây là hai giá trị Auth và AuthB đều được tạo nên bởi hàm A và giá trị k.

Giá trị k chỉ có Alice và Bob biết nên kẻ gian không thể tính được các giá trị tương ứng nếu không có chúng. Hơn nữa, nếu thông điệp M bị thay đổi trên đường truyền thì giá trị Auth B tính được sẽ không còn giống như Auth nữa.

Tuy nhiên, hệ thống này có thể bị tấn công bằng cách thay đồng thời “M 🡪 M” và “Auth 🡪 Auth” sao cho A(k, M‟) = Auth”. Hàm công khai A cần phải được thiết kế để tránh tấn công dạng này. Trong nhiều trường hợp, người ta hay sử dụng một hàm băm thay cho hàm A và không sử dụng giá trị bí mật k.

Vấn đề xác thực cần được đặt ra cùng với yêu cầu xác thực cao hay thấp của dữ liệu. Người ta thường sử dụng các cơ chế xác thực thông điệp sau:

  • Mã hóa thông điệp (Message encryption): Bản thân việc mã hoá đã có sử dụng khoá mã hoá và đó chính là thông tin dùng để xác thực
  • Mã xác thực thông điệp (Message Authentication Code – MAC): sử dụng hàm công khai và khóa bí mật tạo ra một giá trị có độ dài cố định cho phép xác thực thông điệp.
  • Hàm băm (Hash function): Sử dụng hàm băm công khai có biến thông điệp ban đầu độ dài tùy ý thành một chuỗi bit có độ dài cố định (giá trị băm) và dùng nó để xác thực thông điệp ban đầu.

Xem thêm Hàm băm (hash function) là gì?

Xác thực thông điệp bằng mã hoá

Trường hợp mã hóa đối xứng sử dụng khóa phiên mà chỉ có người gửi và người nhận biết, thông điệp cũng đã được xác thực. Lý do là ở đây chỉ có người gửi và người nhận mới có khoá bí mật và mới có khả năng tạo ra thông điệp. Mọi sự can thiệp đều làm thay đổi thông điệp và có thể được phát hiện trong quá trình giải mã thông điệp. Tuy nhiên, ở đây không thể tạo ra được tính không chối cãi (non-repudiation) do không thể xác nhận được chính xác người tạo ra thông điệp.

Mô hình sẽ bảo đảm được tính bí mật vì chỉ có A và B có khóa K dùng để giải thông điệp mã. Mô hình trên cũng bảo đảm được tính xác thực vì khi B giải mã và đọc được nội dung thông điệp thì B có thể khẳng định chỉ có thể là A mã hoá, vì ngoài B chỉ A có khoá mật mã. Tuy nhiên, cần có quy ước bổ sung (ví dụ như thông điệp nguồn M là văn bản có nghĩa để B có thể biết được là mình đã giải mã đúng).

Ta xem xét một vài mô hình mã hoá:

Trường hợp mật mã bất đối xứng (mật mã khoá công khai) sẽ xảy ra hai trường hợp: (1) người gửi dùng khoá công khai của người nhận mã hoá thông điệp; người nhận dùng khoá cá nhân của mình để giải mã (mã hoá xuôi), (2) người gửi dùng khoá cá nhân của mình mã hoá thông điệp và người nhận sẽ dùng khoá công khai của người gửi để giải mã (mã hoá nghịch). Trường hợp đầu ta có:

Mô hình trên sẽ bảo đảm được tính bí mật vì chỉ B có khóa KRB dùng để giải thông điệp mã được mã hoá bằng khoá KUB. Mô hình trên không bảo đảm được tính xác thực bởi vì không chỉ A mà mọi người khác cũng có khoá KUB để tạo ra thông điệp mã.

Trường hợp mã hoá nghịch:

Mô hình mã hoá nghịch không bảo đảm được tính bí mật vì không chỉ B mà mọi người khác cũng có khoá KUA để giải thông điệp mã được mã  hoá bằng khoá KRA. Mô hình trên bảo đảm được tính xác thực vì khi B dùng khoá KUA giải mã và đọc được nội dung thông điệp thì B có thể khẳng định chủ nhân thông điệp chính là A vì chỉ A mới có khoá KRA để mã hoá thông điệp. Tuy nhiên, cũng giống như trên, cần có quy ước bổ sung để B có thể biết được là mình đã giải mã đúng (ví dụ như thông điệp nguồn M là văn bản có nghĩa).

Trong thực tế, người ta sử dụng kết hợp mã hoá xuôi và nghịch để bảo đảm cả tính bí mật lẫn tính xác thực thông điệp:

Hình 8.5 Mô hình kép của mật mã khoá công khai

Mô hình kép như trên sẽ bảo đảm được cả tính bí mật lẫn tính xác thực thông điệp. Tuy nhiên, quá trình mã hoá và giải mã phải thực hiện nhiều lần bằng mật mã khoá công khai nên sẽ rất chậm. Do vậy, mô  hình này thường dùng để mã hoá những dữ liệu bé như các loại khoá mật mã, giá trị băm,…

Xem thêm Kiểm tra lỗ hổng bảo mật Weak Encryption

Mã xác thực thông điệp

Mã xác thực thông điệp (MAC) là một chuỗi bit được gửi kèm với thông điệp. Chuỗi bit này được tạo ra bởi một hàm của thông điệp và khóa bí mật, chỉ có người gửi và người nhận biết. Độ dài thông điệp có thể tùy ý,   còn MAC thường có độ dài cố định (ví dụ 128 bit).

Để tạo ra MAC, người ta có thể sử dụng hàm băm (hash function) thu gọn thông điệp đến kích thước cần thiết và dùng giá trị băm này kiểm soát tính toàn vẹn của thông điệp. Các hàm băm không sử dụng giá trị bí mật chia sẻ giữa người gửi và người nhận nên có ứng dụng rộng rãi hơn.

Như vậy, mã xác thực thông điệp chính là một kỹ thuật sử dụng khóa bí mật để tạo ra một khối bit độ dài cố định, gọi là checksum hoặc MAC,  sau đó, khối này được ghép vào thông điệp để gửi cho người nhận nhằm xác thực thông điệp đính kèm.

Giả sử A và B có chung một khóa bí mật K. Khi A cần gửi thông điệp xác thực M cho B, A tính: MAC = CK(M), với CK là hàm công khai sử dụng khoá K. Sau đó, MAC được gửi kèm với thông điệp M cho B.

B nhận được MAC và thông điệp M‟. B tính MAC‟ = CK(M‟); và so sánh,  nếu  MAC  =  MAC‟  thì  B  có  thể  khẳng  định  M  =  M‟,  tức  là  M  đã không bị thay đổi trên đường truyền và A là người gửi thông điệp M (Ở đây ta giả sử chỉ có A và B biết khóa K). Mô hình đơn giản sử dụng mã xác thực thông điệp được minh hoạ như sau:

Trong trường hợp trên, nội dung của thông điệp M được truyền dưới dạng plaintext nên có thể bị kẻ gian đọc được. Để bảo đảm tính bí mật cho thông điệp, ta có thể thực hiện việc mã hoá toàn bộ giá trị thông điệp đính kèm với MAC bằng một khoá bí mật dùng chung giữa người gửi và người nhận. Điều đó được minh hoạ trong hình dưới đây:

Trong mô hình trên có hai khoá bí mật chia sẻ giữa A và B đã được sử dụng: Khoá K1 dùng để tạo mã xác thực thông điệp, còn khoá K2 dùng để giữ bí mật thông điệp và mã xác thực thông điệp đính kèm.

Xem thêm Các Hash funtion đang được sử dụng

Xác thực bằng hàm băm

Như đã trình bày ở trên, hàm băm là trường hợp đặc biệt của mã xác thực thông điệp MAC. Hàm băm là hàm một chiều, được công bố công khai, sử dụng để “nén” một thông điệp M từ độ dài tùy ý thành giá trị có độ

dài cố định. Hàm băm được ký hiệu là H(M). Giá trị H(M) được gọi là bản tóm tắt (message digest) hoặc giá trị băm (hash value) của thông điệp M. Khác với mã xác thực thông điệp MAC, hàm băm H(M) không sử dụng khóa. Hàm băm H(M) phụ thuộc vào tất cả các bit của M, có khả năng kiểm tra tính toàn vẹn của M. Độ dài của giá trị băm phải đủ lớn để chịu được các tấn công. Thông thường, độ dài của giá trị băm 64 bit được coi là quá nhỏ và giá trị khoảng 128 – 512 bit được coi là thích hợp. Mô hình xác thực đơn giản sử dụng hàm băm như sau:

Trong mô hình trên, thông điệp M được băm thành một giá trị H(M) và giá trị này được gắn kèm với thông điệp M; tất cả được mã hoá bởi khoá bí mật K và được gửi cho người nhận B. Sau khi nhận được thông điệp, B  giải mã thông điệp bằng khoá K. Từ đó, B tách ra thông điệp M, băm nó thành giá trị H và so sánh với giá trị H(M) được đính kèm trong thông điệp nhận được. Nếu hai giá trị này bằng nhau thì thông điệp được xác định là toàn vẹn và đồng thời chủ nhân của nó được xác thực. Một biến thể quan trọng của việc sử dụng hàm băm trong xác thực thông điệp là sử dụng quy trình mật mã khoá công khai như minh hoạ trong sơ đồ sau:

Trong mô hình trên, giá trị băm H(M) được mã hoá bằng khoá cá nhân của người gửi và sau đó gắn kèm với thông điệp M và được gửi cho người nhận B. Sau khi nhận được thông điệp, B tách ra thông điệp M và giá trị EKRA(H(M). B băm phần thứ nhất thành giá trị H(M); phần thứ giải B giải

mã bằng khoá KUA. Tiếp theo, B so sánh hai kết quả tính được. Nếu chúng bằng nhau thì thông điệp được xác định là toàn vẹn và đồng thời chủ nhân của nó cũng được xác thực. Đây cũng là mô hình chữ ký số đơn giản mà ta sẽ xem xét kỹ hơn ở phần sau.

Xem thêm Mã hóa RSA

Leave a Reply

Call now
%d bloggers like this: