Trong lập trình mạng, sockets được sử dụng để thiết lập các kết nối truyền thông dữ liệu qua mạng, bao gồm cả Internet.. Lắng nghe Listen cho kết nối đến: Sử dụng hàm listen để bắt đầu l
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA AN TOÀN THÔNG TIN
Môn học: THỰC TẬP CƠ SỞ
BÀI THỰC HÀNH SỐ 15
Lập trình client/server để trao đổi thông tin an toàn
Sinh viên thực hiện: Nguyễn Khắc Hưng
Mã sinh viên: B21DCAT099 Giảng viên: Ninh Thị Thu Trang
Số điện thoại:0974299896
~ Hà Nội, tháng 5/2024 ~
Trang 21
1 Mục đích 2
2 Tìm hiểu lý thuyết 2
3 Kết quả thực hành 4
3.1 Lập trình client và server với TCP socket 4
3.2.Trao đổi thông điệp giữa client và server và đảm bảo tính toàn vẹn của thông điệp khi trao đổi 8
3.2.1.Phía Client 8
3.2.2.Phía Server
3.2.3.Kiểm nghiệm 10
4 Tài liệu tham khảo 13
Trang 32
BÀI 15: Lập trình client/server để trao đổi thông tin an toàn
1 Mục đích
• Sinh viên hiểu về cơ chế client/server và có thể tự lập trình client/server dựa trên socket, sau đó thực hiện ca đặt giao thức đơn giản để trao đổi thông tin an toàn
Socket là một giao diện lập trình ứng dụng (API) cho việc tạo và quản lý kết nối mạng giữa các thiết bị Trong lập trình mạng, sockets được sử dụng để thiết lập các kết nối truyền thông dữ liệu qua mạng, bao gồm cả Internet Các ứng dụng có thể sử dụng sockets để gửi và nhận dữ liệu qua mạng thông qua giao thức TCP/IP hoặc các giao thức mạng khác
Mô hình máy khách, máy chủ TCP
Hình 2.1 Mô hình máy khách máy chủ TCP
Trang 43
Các bước tạo nên 1 chương trình phía server
Import thư viện cần thiết: Đầu tiên, bạn cần import các thư viện hoặc module
cần thiết cho việc lập trình sockets Trong Python, bạn sẽ thường import socket
Tạo socket: Sử dụng hàm socket() để tạo một đối tượng socket Bạn cần chỉ định
loại socket (ví dụ: socket.AF_INET cho IPv4) và loại giao thức (ví dụ:
socket.SOCK_STREAM cho TCP) khi tạo socket
Bind socket tới một địa chỉ và cổng: Sử dụng hàm bind() để liên kết socket với
một địa chỉ IP và cổng cụ thể trên máy chủ Điều này cho phép máy chủ lắng nghe các kết nối đến địa chỉ và cổng đó
Lắng nghe (Listen) cho kết nối đến: Sử dụng hàm listen() để bắt đầu lắng nghe
các kết nối đến từ phía máy khách Bạn cần chỉ định số lượng tối đa của các kết nối đang chờ đợi (thường được gọi là backlog)
Chấp nhận (Accept) kết nối: Sử dụng hàm accept() để chấp nhận kết nối từ một
máy khách Khi có một yêu cầu kết nối đến, hàm này trả về một đối tượng socket mới được sử dụng để truyền dữ liệu giữa máy chủ và máy khách
Xử lý dữ liệu: Khi kết nối được thiết lập, bạn có thể gửi và nhận dữ liệu qua socket được tạo ra từ bước trước
Đóng kết nối: Sau khi hoàn thành việc giao tiếp, đóng kết nối bằng cách gọi hàm
close() trên đối tượng socket
Các bước tạo nên 1 chương trình phía client
Import thư viện cần thiết: Đầu tiên, bạn cần import các thư viện hoặc module
cần thiết cho việc lập trình sockets Trong Python, bạn sẽ thường import socket
Tạo socket: Sử dụng hàm socket() để tạo một đối tượng socket Bạn cần chỉ định
loại socket (ví dụ: socket.AF_INET cho IPv4) và loại giao thức (ví dụ:
socket.SOCK_STREAM cho TCP) khi tạo socket
Kết nối tới máy chủ: Sử dụng hàm connect() để kết nối tới máy chủ thông qua
địa chỉ IP và cổng cụ thể của máy chủ
Gửi dữ liệu: Khi kết nối được thiết lập, bạn có thể gửi dữ liệu tới máy chủ sử
dụng hàm send() trên đối tượng socket
Nhận dữ liệu: Có thể nhận dữ liệu từ máy chủ sử dụng hàm recv()
Xử lý dữ liệu và hiển thị kết quả: Sau khi nhận dữ liệu từ máy chủ, bạn có thể
xử lý và hiển thị kết quả
Trang 54
Đóng kết nối: Khi hoàn thành việc giao tiếp, đóng kết nối bằng cách gọi hàm
close() trên đối tượng socket
*Chuẩn bị môi trường :
• Môi trường Python hoặc Java để chạy được ứng dụng client/server đã lập trình
• Phần mềm Wireshark
- Lập trình Server tại máy Kali linux
Hình 3.1 Lập trình Server tại máy Kali linux -Lập trình máy Client tại máy Windows 10
Trang 65
Hình 3.2 Lập trình máy Client tại máy Windows 10
*Tiến hành thử nghiệm
Kết quả của thử nghiệm:
-Server sẽ mở cổng và cho phép kết nối tới
-Sau khi chạy thì Server sẽ mở cho đến khi nào có Client kết nối tới
Trang 76
Hình 3.4 Khởi động Server chờ đợi kết nối -Chạy Client.py bên máy sẽ nhận được thông báo kết nối tới Server có ip như hình
Hình 3.5 Kết nối tới máy Server
Hình 3.6 Từ máy Client gửi tin nhắn “Hello, I am B21DCAT099 Client.”
Trang 87
Hình 3.7 Máy Clinet sau khi gửi thông điệp thì sẽ nhận lại thông điệp từ Server -Thử gửi thông điệp để bắt gói tin với WireShark
Hình 3.8 Thử gửi thông điệp để bắt gói tin với WireShark
-Lọc thông tin trên WireShark với cổng = 3333
-Bắt được thông tin đã được gửi từ máy Client
Trang 98
Hình 3.9 Bắt được gói tin gửi từ máy Client
khi trao đổi
-Khởi tạo 1 hàm để mã hóa với key = “B21DCAT099” và sử dụng hàm băm SHA256 để hash
-Tạo 1 hàm Encrypt để băm giá trị gửi đi từ phía client
-Giá trị được dùng để hash =bằng với message + với key
-Gửi toàn bộ đến phía server
-Nếu giá trị nhận được ừ pht ía bên server là như trên thì in ra ã kđ ết nối thành công
-Còn nếu không thì tự động hủy hết nối với server
-Thay đổi cổng vào từ 3333 sang 4444 để thử nghiệm trên nhiều cổng khác nhau
Trang 109
Hình 3.8 Khởi tạo hàm b m và g tin nhă ửi ắn đến máy Server
-Thêm 1 phần để tách 2 giá trị message và hash để kiểm tra xem dữ liệu có đúng không
-2 biến message và hashkey được dùng để lấy message từ phía gửi và hashkey
để kiểm tra xem dữ liệu đúng hay không
-Tiến hành hash ra tương tự phía Client với đầu vào là message + key
-Nếu đúng thì gửi về phía Client kết nối thành công
-Nếu sai thì in ra thông báo vào óng k nđ ết ối với Client
-Thay đổi ổng ết ối từ 3333 c k n -> 4444
Trang 1110
Hình 3.9 Khởi tạo hàm b m vă à nhận tin nhắn từ Client và kiểm tra
Hình 3.10 ở kết nối v M à nhận được tin nhắn ừ Clientt
Trang 1211
Hình 3 11 Nhận thông báo kết nối thành công từ máy Server
*Thử sửa lại key sao cho 2 bên Client và Server ác nhau kh
-Sửa lại key thành B21DCAT0100 ở phía Clie nt
Hình 3.12 Sửa lại key ở phía Client -Sau khi mở kết nối vào Client k t nế ối vào , gửi 1 tin nhắn và máy server thấy không trùng , Server tự động n ắt g
Hình 3.12 Server tự ngắt kết nối với Client sau khi nhận ra bất thường
Trang 1312
-Phía Client sau khi bị ngắt thì tin nhắn cũng không thể đến Server và dẫn đến lỗi
Hình 3.12 Client Không thể gửi tin nhắn đến Server
*Th bử ắt thông tin bằng WireShark
-Bắt thành công gói tin gửi từ Client đến Server với thông tin gồm message và hash
Hình 3.13 Bắt thành công gói tin
Trang 1413
• Chapter 2: Application Layer V8.1 13
• http://gaia.cs.umass.edu/kurose_ross/ppt.php
• The classical client/server model is used by C-IoT proposed model | Download Scientific Diagram (researchgate.net)