(tiếp theo và hết)
III. Ứng dụng thực tiễn
Trong việc mã hoá truyền thông trên Internet, nổi bật hiện nay là giao thức SSL (Secure Socket Layer), áp dụng cả 3 kĩ thuật mã hoá trên.
SSL là giao thức đa mục đích được thiết kế để tạo ra các giao tiếp giữa hai chương trình ứng dụng trên một cổng định trước (socket 443) nhằm mã hoá toàn bộ thông tin đi/đến, mà ngày nay được sử dụng rộng rãi cho giao dịch điện tử như truyền số hiệu thẻ tín dụng, mật khẩu, số bí mật cá nhân (PIN) trên Internet.
Điểm cơ bản của SSL được thiết kế độc lập với tầng ứng dụng để đảm bảo tính bí mật, an toàn và chống giả mạo luồng thông tin qua Internet giữa hai ứng dụng bất kỳ, thí dụ như webserver và các trình duyệt khách (browsers), do đó được sử dụng rộng rãi trong nhiều ứng dụng khác nhau trên môi trường Internet.
Chúng ta chỉ phân tích cơ chế để hiểu rõ thêm ứng dụng của các kĩ thuật mã hoá vào giao thức này.
Để dễ hiểu, phần này sẽ trình bày qua ví dụ cụ thể: Alice trao đổi thông tin với Bob bằng công nghệ khóa chung. Type_of_key{message} có nghĩa là message được mã hóa hoặc giải mã bằng với loại thuật toán đang dùng (Type_of_key).
Alice cần chắc chắn là mình sẽ nói chuyện với Bob mà không phải là một ai khác. Alice sẽ tiến hành xác thực (authenticate) Bob. Bob có một cặp khóa gồm một khoá công khai (public key) và một khóa riêng (private key). Bob cho Alice biết trước khoá công khai (public key) của mình (sẽ nói sau bằng cách nào). Alice sẽ tạo ra một thông điệp ngẫu nhiên (random message) và gởi nó đến Bob:
A->B Random_message
Bob dùng khóa riêng (private key) của mình để mã hóa thông điệp vừa nhận được và gởi trả lại cho Alice:
B->A private_Bob(Random_message)
Alice nhận được message từ Bob, dùng khoá công khai (public key) của Bob để giải mã message này và sau đó so sánh message vừa giải mã được với Random_message đã gởi đi. Nếu giống nhau, Alice có thể tin chắc rằng mình đang nói chuyện với Bob.
1. Digest
Thay vì phải mã hóa toàn bộ message nhận được từ Alice, Bob có thể xây dựng một bản tóm tắt (digest) của message bằng hàm băm một chiều (hash one-way), sau đó mã hóa digest bằng khóa riêng (private key) của mình và gởi cho Alice. Alice sẽ dùng khoá công khai (public key) của Bob để giải mã digest do Bob gởi tới và tính digest của message đã được gởi đi, sau đó so sánh hai digest này với nhau. Nếu trùng nhau, có nghĩa Alice có thể tin chắc là mình đang nói chuyện với Bob.
Digest thực chất là chỉ là một số nguyên (integer). Hai thuật toán phổ biến được dùng để tạo digest là MD5 hash 128bit, SHA hash 160 bit. Ai đó có được digest của Bob cũng không thể nào suy luận ra được message nguyên bản(original) vì digest chỉ là giá trị hash một chiều. Hai message khác nhau sẽ có digest khác nhau, khả năng trùng nhau xấp xỉ là 0.
2. Chữ kí điện tử (digital signature)
Theo cách ở trên thì Bob đã kí (sign) message do Alice gởi tới, nhưng nếu như ai đó đã thay đổi message này thì sao? Vì vậy cần thay đổi một chút như sau:
A->B Chào, Có phải Bob đó không?
B->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
Như bạn thấy Bob không hề kí message của Alice. Thay vào đó, Bob sẽ gởi một mesage khác (không bị mã hóa) và digest của của message này (đã được mã hóa bằng khóa riêng (private key) của Bob) đến cho Alice. Bob chỉ tin tưởng vào chính mình. Alice dễ dàng thẩm tra Bob bằng cách dùng khoá công khai (public key) của Bob giải mã digest nhận được, sau đó tính digest của message nhận từ Bob và so sánh hai digest này với nhau. Digest mà Bob gởi tới Alice chính là một chữ kí điện tử. Nó kí cho message “Alice, Mình là Bob đây!” để đảm bảo chắc chắn là message này không bị ai đó thay đổi gì khi đến Alice. Nếu thay đổi Alice sẽ biết ngay qua việc thẩm tra digest.
3. Trao khoá công khai (public key)
Bob trao khoá công khai (public key) của mình cho Alice bằng cách nào? Bạn hãy xem thử giao thức sau:
A->B Xin chào!
B->A Chào, Mình là Bob. Đây là public key của mình!
A->B Hãy đưa bằng chứng đi!
B->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
Với cách này thì ai cũng có thể giả mạo Bob và trao khoá công khai (public key) của họ cho Alice, làm cho Alice tưởng lầm là mình đang nói chuyện với Bob.
Để giải quyết vấn đề này, Alice và Bob có thể dùng giấy chứng nhận điện tử
4. Giấy chứng nhận điện tử (digital certificate)
Giấy chứng nhận điện tử dùng để chứng nhận khoá công khai (public key) của một cá nhân nào đó. Một giấy chứng nhận điện tử thường bao gồm các thứ sau:
- Tên cơ quan cấp giấy chứng nhận (issuer’s name)
- Tên thực thể (entity) được cấp giấy chứng nhận(còn được gọi là đối tượng – subject)
- Khoá công khai (public key) của subject
- Tem thời gian (time-stamps) cho biết thời gian có hiệu lực của giấy chứng nhận
Chỉ có các cơ quan có thẩm quyền Certificate Authority (thường được gọi tắt là CA) mới đươc phép cấp giấy chứng nhận. Giấy chứng nhận được kí bằng khóa riêng (private key) của người cấp. CA cũng được tổ chức theo dạng cây “hierarchy” tương tự như domain-name. Dĩ nhiên bạn cũng có thể tạo ra một CA mới cho riêng cho mình.
Chúng ta hãy xem giao thức mới này:
A->B Xin chào!
B->A Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
A->B Hãy đưa bằng chứng đi!
B->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
Bằng cách gửi Giấy chứng nhận điện tử (digital certificate) của mình cho Alice (có nghĩa là alice sẽ biết khoá công khai của Bob) thì bắt buộc thông điệp phải được mã hoá bằng chính private key của Bob thì Alice mới xác nhận được.
Ai đó dùng giấy chứng nhận của Bob để giả mạo Bob sẽ bị Alice phát hiện ngay!
A->M Xin chào
M->A Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
A->M Hãy đưa bằng chứng đi!
M->A ???
Mallet không biết khóa riêng (private key) của Bob nên không thể xây dựng được message để Alice có thể tin mình là Bob.
5. Trao đổi khóa bí mật (secret-key)
Sau khi Alice đã xác thực mình đang nói chuyện với Bob, Alice sẽ gởi cho Bob một message đã bị mã hóa bằng khoá công khai (public key) của Bob:
A->B public_Bob{“khóa_bí_mật”}
Bằng cách này, chỉ có Bob mới có thể giải mã message trên và lấy được khóa bí mật bởi vì chỉ có Bob mới biết được khóa riêng (private key) để giải mã. Trao đổi khóa bí mật bằng công nghệ khoá công khai (public key) cực kì an toàn. Không một ai ngoại trừ Alice và Bob biết được khóa bí mật. Trong SSL, khóa bí mật này chính là khóa phiên giao dịch giữa 2 người ở thời điểm đó (session key). Kể từ đây Alice và Bob sẽ dùng khóa phiên để trao đổi dữ liệu cho nhau. Khóa phiên được tạo ra trong mỗi phiên kết nối SSL và hoàn toàn bí mật (chỉ có Alice và Bob biết) nên rất an toàn. Công nghệ chuyên chở khóa phiên bằng khoá công khai (public key) và dùng khóa phiên như một khóa đối xứng bí mật để trao đổi dữ liệu cho nhau còn được biết đến với cái tên là hybrid, tức là kết hợp cả hai phương pháp mã hóa dùng kĩ thuật mã hoá đối xứng và mã hoá bất đối xứng.
Đây là giao thức mới:
A->B Xin chào!
B->A Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
A->B Hãy đưa bằng chứng đi!
B->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
A->B Ok Bob, Đây là khoá bí mật của chúng ta public_Bob{“khóa_bí_mật”}
B->A khóa-bí-mật{message 1}
B->A khóa-bí-mật{message 2}
…
6. Tấn công man-in-the-middle
Giao thức trên chưa phải là an toàn tuyệt đối. Mallet ngồi giữa Alice và Bob có thể chơi trò tấn công man-in-the-middle như sau:
A->M Xin chào!
M->B Xin chào!
B->M Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
M->A Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
A->M Hãy đưa bằng chứng đi!
M->B Hãy đưa bằng chứng đi!
B->M Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
M->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
A->M Ok Bob, đây là khoá bí mật của chúng ta public_Bob{“khóa_bí_mật”}
M->B Ok Bob, đây là khoá bí mật của chúng ta public_Bob{“khóa_bí_mật”}
B->M khóa-bí-mật{something}
M->A Editted [khóa-bí-mật{something}]
Mallet sẽ chuyển tiếp dữ liệu giữa Alice và Bob cho đến khi họ trao đổi khóa bí mật. Tại thời điểm này Alice nghĩ rằng mình đang nói chuyện với Bob nên tin tưởng hoàn toàn vào các message do Bob gởi tới. Thực chất không phải là như vậy. Mallet mặc dù không biết khóa bí mật nhưng hoàn toàn có thể xén, thêm hoặc sửa đổi gì đó trên các dữ liệu được gởi từ Bob đến Alice.
7. Mã xác thực thông điệp (MAC)
Để ngăn chặn cuộc tấn công man-in-the-middle trên, Alice và Bob có thể dùng thêm mã xác thực thông điệp (Message Authentication Code) thường được gọi tắt là MAC. Thuật toán tạo MAC khá đơn giản:
Code:
MAC = Digest[some message, khóa bí mật]
Mallet không biết khóa bí mật nên không tài nào tính đúng giá trị digest của message.
Đây là toàn bộ giao thức:
A->B Xin chào!
B->A Chào, Mình là Bob. Đây là giấy chứng nhận của mình!
A->B Hãy đưa bằng chứng đi!
B->A Alice, Mình là Bob đây!
private_Bob{digest[“Alice, Mình là Bob đây!”]}
A->B Ok Bob, đây là khoá bí mật của chúng ta public_Bob{“khóa_bí_mật”}
khóa-bí-mật{something, MAC}
Toàn bộ cấp độ bảo mật và an toàn của thông tin/dữ liệu phụ thuộc vào một số tham số:
(i) Số nhận dạng theo phiên làm việc ngẫu nhiên (session ID);
(ii) Cấp độ bảo mật của các thuật toán bảo mật áp dụng cho SSL;
(iii) Độ dài của khoá chính (key length) sử dụng cho lược đồ mã hoá thông tin.
IV. Các công cụ mã hoá
BitLocker: BitLocker là ứng dụng mã hóa tích hợp sẵn trong Vista Enterprise và Vista Ultimate có chức năng bảo vệ toàn diện này. BitLocker nằm trong Windows Security Control Panel.
TrueCrypt (www.truecrypt.org) – Free source code
Ohos Mini Drive (http://www.rohos.com) – Shareware
PGP Desktop (http://na.store.pgp.com) – 99USD
Encrypt & Decrypt MD5 Hashes – http://md5encryption.com/
….
*Tài liệu tham khảo
Applied Cryptography, Second Edition Protocols, Algorthms, and Source Code in C – Bruce Schneier
Cryptography & Network Security Principles & Practices_4thEd -William_Stallings
Cryptography – An Introduction To Cryptography – Network Associates, Inc.
Wikipedia
-fov-
Kĩ thuật Mã hoá trong Mạng máy tính – P1
Kĩ thuật Mã hoá trong Mạng máy tính – P2
Thanks
Pingback: Kĩ thuật Mã hoá trong Mạng máy tính - VOV's world