1.1 Mục đích Sinh viên hiểu về cơ chế client/server và có thể tự lap trinh 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.. Mô hì
Trang 1
HỌC VIÊN CÔNG NGHỆ BƯU CHÍNH VIỄN THONG
KHOA AN TOAN THONG TIN
BAO CAO THUC HANH BAI 15:LAP TRINH
AN TOAN
MON THUC TAP CO SO
Giang viên hướng dẫn : Nguyễn Ngọc Điệp
Ho và tên sinh viên : Phạm Thị Thanh Ngoan
Mã sinh viên : B2IDCA T145
Lớp : D21CQATOI-B
Nhóm :02
Hà Nội - 2024
Trang 2
1.1 Mục đích
Sinh viên hiểu về cơ chế client/server và có thể tự lap trinh 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 1.2 Nội dung thực hành
1.2.1 Tìm hiểu lý thuyết
SocKet là một giao diện lập trình (API —- Application Program Interface) ứng dụng mạng thông qua giao diện này có thê lập trình điều khiển việc truyền thông giữa 2 máy
sử dụng các giao thức mức thấp như TCP,UDE , Có thể tưởng tượng nó như một thiết bị truyền thông 2 chiều tương tự như tệp tin, chúng ta gửi/nhận dữ liệu giữa 2 máy, tương tự như việc đọc ghi trên tệp tin
Mô hình khách chủ TCP TcPsewer
TCP client socket()
[sew
Connection
request
Send
next request Wait next request
Các bước đề tạo lên 1 chương trình phía server:
©_ Tạo socket với hàm socket (int family, int type, int protocol) các tham số trong
đó theo thứ tự là họ giao thức, kiêu socket, kiểu giao thức
e Gan dia chi cho socket bind (int sockfd, const struct sockaddr *sockaddr, socklen_t addrlen) các tham số lần lượt là mô tả socket vừa tạo, con trỏ chỏ đến địa chỉ socket, độ lớn địa chỉ
e Chỉ định socket lắng nghe két ndi listen (int sockfd, int backlog) trong do sockfd là mô ta socket vira tao, backlog la số lượng tối đa các kết nối đang chờ
Trang 3e Chờ/chấp nhận kết nối accept (int sockfd, struct sockaddr *cliaddr, socklen t
*addrlen) lần lượt có các tham số là mô tả socket vừa tạo, con trỏ tới cấu trúc địa chỉ socket của tiến trình kết nói đến, độ lớn cấu trúc địa chỉ
© Thiét lap két noi voi may chu TCP connect (int sockfd, const struct sockaddr
*servaddr, socklen_t addrlen)
Các bước đề tạo lên 1 chương trình phía client
©_ Tạo socket với hàm socket (int family, int type, int protocol) các tham số trong
đó theo thứ tự là họ giao thức, kiểu socket, kiểu giao thức
e Connect téi dia chi server voi ham connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)
© Doc dir ligu tir server va ghi vao bién buffer read( sock , buffer, 1024)
1.2.2 Chuẩn bị môi trường
o Môi trường Python hoặc Java để chạy được ứng dụng client/server đã lập
trình
o Phần mềm Wireshark
1.2.3 Các bước thực hiện và kết quả cần đạt
1.2.3.1 Lập trình client và server với TCP socket
a) Các bước thực hiện
o Lap trinh client
Trang 4=4 Sao
1ent recv(1924) decode
„ data server
o Lập trình server
Trang 5import
HOST =
SERVER_PORT
FORMAT =
server | et(socket.AF_INET, socket.SOCK_STREAM
server.bind((HOST, SERVER_PORT)
server.listen(1
addr = server.accept
while True:
data_client = conn.recv(1024) decode( FORMAT
if data_client == "3
break
data = input erver gui 1
conn.sendall(data.encode( FORMAT)
finally:
server.close
o Chay server sau do chay client
o Client gtri théng diép cá nhận hóa cho server: “Hello, I am <ma sinh vién>
client.”
$ Ngoan clientpy X
TT
conn, addr = server
¬ c : et AF_TNET, et.SOCK_STREAM
e True
ïT, SERVER_PORT - data_client = conn.re
ere
client
No
h
CN eC at
Trang 6o Server nhận được hiển thị thơng điệp nhận được và gửi lại client thơngđiệp: server gửi lại “Hello, I am <mã sinh viên> server”
DU
o Sử dụng Wireshark đề bắt các thơng tin đã gửi từ client đến server và ngược lại
[“
_ [tp TEES +)+
Time Source Destination Protocol Length Info
2.014762 fe80: : 86fF:6a01:2f0 fe80: :80fF:6a01:2F0 TCP 64 8391 + 59567 [ACK] Seq=1611 Ack=5938 Win=2154496 Len=0 28.015326 fe80: :80ff:6aØ1:2f9 fe80: :80ff:6a01:2f0 TLSv1.2 1612 Application Data
J9 015362 fe80: :80ff:6aØ1:2f9 fe80: :80ff:6a01:2f9 TCP 64 59567 + 8391 [ACK] Seq=5938 Ack=3159 Win=2157312 Len=0
31.919528 127.0.0.1 127.0.0.1 TCP 56 59568 + 65432 [SYN] Seq=9 Min=65535 Len=@ MSS=65495 WS=256 SA 31.919574 127.0.0.1 127.0.0.1 TCP 56 65432 + 59568 [SYN, ACK] Seq=@ Ack=1 Win=65535 Len=8 MSS=6549 31.919690 127.0.0.1 127.0.0.1 TCP 44 59568 + 65432 [ACK] Seq=1 Ack=1 Win=327424 Len=@
47 364013 127.0.0.1 127.8.0.1 TCP 72 59568 + 65432 [PSH, ACK] Seq=1 Ack=1 Win=327424 Len=28
47.364065 127.0.0.1 127.0.0.1 TCP 44 65432 + 59568 [ACK] Seq=1 Ack=29 Win=2161152 Len=0
50 022639 fe80: :80ff:6a01:2f0 fe80: : 80ff:6a01:2f0 TCP 64 59553 + 8391 [FIN, ACK] Seq=1 Ack=1 Win=8427 Len=0
5@.022690 fe80: : 80ff:6a01:2f0 fe8O: :80FF:6a01:2f0 TCP 64 8391 + 59553 [ACK] Seq=1 Ack=2 Win=8416 Len=0
5@.022920 fe80: :80FF:6a01:2f0 fe80: :80fF:6a01:2f0 TCP 64 8391 + 59553 [FIN, ACK] Seq=1 Ack=2 Win=8416 Len=@
p@.822979 fe80: : 80FF:6a01:2f0 fe80: :80FF:6a01:2f0 TCP 64 59553 + 8391 [ACK] Seq=2 Ack=2 Win=8427 Len=@
b0.211811 127.0.0.1 127.0.0.1 TCP 72 65432 + 59568 [PSH, ACK] Seq=1 Ack=29 Win=2161152 Len=28
b9 211862 127.0.0.1 127.0.0.1 TCP 44 59568 + 65432 [ACK] Seq=29 Ack=29 Win=327424 Len=0 71.725425 127.0.0.1 127.0.0.1 TCP 48 59568 + 65432 [PSH, ACK] Seq=29 Ack=29 Win=327424 Len=4 71.725469 127.0.0.1 127.0.0.1 TCP 44 65432 + 59568 [ACK] Seq=29 Ack=33 Win=2161152 Len=0
71.725526 127.0.0.1 127.0.0.1 TCP 44 59568 + 65432 [FIN, ACK] Seq=33 Ack=29 Win=327424 Len=0
71.725538 127.0.0.1 127.0.0.1 TCP 44 65432 + 59568 [ACK] Seq=29 Ack=34 Win=2161152 Len=0
7.727231 127.0.0.1 127.0.0.1 TCP 44 65432 + 59568 [FIN, ACK] Seq=29 Ack=34 Win=2161152 Len=0
1.2.3.2 Trao déi thong diép giữa client va server và đảm bảo tính tồn vẹn của thơng điệp khi trao đỗi
a) Các bước thực hiện
+ Từ client và server, sửa đổi sao cho: khi gửi thơng diệp sẽ kèm theo giá trị hàm băm của (thơng điệp+key) để phía bên kia kiểm tra xác minh tính tồn vẹn Hai bên cĩ thê thống nhây một giá trị key trước
Trang 7Đề sửu đôi client và server để gửi kèm giá trị băm của (thông điệp +key) và kiểm tra tính toàn vẹn, và cho phép client thay đổi giá trị key và phát hiện được tính toàn vẹn của dữ liệu, bạn có thể sử dụng tự viện haslib để tính toán gia tri hang bam va su dung một giá trị key chung gitra client va server
+ Key la: mysecretkey
- Code client
$ Ngoan clent2pypy X #
message_with_new_key = message + key
ear a256(message_with_new_key.encode()
message_hash_new_key = h.he Ề
s.send(message_hash_new_key
result_new_key =
f result_new key =z
nt
- Code sever
Trang 8s = socke ket
Pe 0U ai:
s.listen(1
message = data+key
h = hash1ib sha256(message encode( )
Creer
+ Server vaf client déu su dung chung 1 key để tính toán giá trị băm của (thông điệp+key) Server sẽ gửi lại giá tri bam cho client, va client sé kiém tra tính toàn vẹn của dữ liệu bằng cách so sánh giá trị băm nhận được tử server với giá trị băm của (thông điệp +key) mà nó đã tính toán trước đó
+ Nếu tính toàn vẹn khéng duoc dam bao, client sé in ra thông báo “ The rêcrved message has lot its integrity.”
© Chạy thanh công client và server theo mục tiêu ban đầu
Trang 9i
Derry
+ Sau đó, client yêu cầu người dùng đăng nhập giá trị key mới và tính toán lại giá trị băm của thông điệp + key mới Nó gửi giá trị băm mới đến server và kiểm tra tính toàn vẹn đữ liệu của key mới
+ Nếu tính toàn vẹn được đảm bao, client dé in ra thong bao”Data integrity verified with new key”, néu khéng client sẽ in ra thong bao “The received mesagr has lost its integrity with new key” Với tính năng này, client có thể thay đôi giá trị key và kiểm tra tính toàn vẹn của dữ liệu khi key mới được thay đôi
Trang 10message with new key “ message + key
nat nessage_with_new_key encode(
new_key = h Ps
nd(message_hash_new_key.encode()
result_new key = s.r«
nt + message
o Thay đôi giá trị key tại client và thực hiện gửi lại, nếu không đáp ứng tính
toàn vẹn cân thông bao: “The received message has lost its integrity.”
Trang 11
4
Bdé ROCesoeFaz=aaan
No Time Destination Protocol Length Info
25 14.617670 :6a01:2f0 fe8O: :80FF:6a01:2F0 TCP 64 61327 + 8391 [ACK] Seq=222 Ack=55 Win=8227 Len=0
26 14.617792 36a01:2f0 fe8O: :8OfF:6a01:2F0 TLSv1.2 4061 Application Data
27 14.017832 :6a01:2f0 fe89: :8Øff:6að1:2f0 TCP 64 8391 + 61327 [ACK] Seq=55 Ack=4219 Win=8291 Len=0
28 14.618720 :6a01:2f0 fe80: :8@ff:6a01:2f0 TLSv1.2 1612 Application Data
29 14.618755 :6a01:2f0 fe8O::8OFF:6a01:2F0 TCP 64 61327 + 8391 [ACK] Seq=4219 Ack=1603 Win=8221 Len=0
30 33.918768 127.0.0.1 127.0.0.1 TCP 56 62198 + 50@@ [SYN] Seq=@ Win=65535 Len=@ MSS=65495 WS
31 33.918846 127.0.0.1 127.0.0.1 TCP 56 5908 + 62198 [SYN, ACK] Seq=@ Ack=1 Win=65535 Len=@ I
32 33.918891 127.0.8.1 127.0.0.1 TCP 44 62198 + 5908 [ACK] Seq=1 Ack=1 Win=327424 Len=0
33 50.519340 127.0.9.1 127.0.0.1 TCP 108 62198 + 50@@ [PSH, ACK] Seq=1 Ack=1 Win=327424 Len=64
34 50.519462 127.0.6.1 127.0.0.1 TCP 44 59008 + 62198 [ACK] Seq=1 Ack=65 Win=2161152 Len=0
35 5.519762 127.0.0.1 127.0.0.1 TCP 108 5008 + 62198 [PSH, ACK] Seq=1 Ack=65 Win=2161152 Len=
36 59.519793 127.0.0.1 127.0.0.1 TCP 44 62198 + 5000 [ACK] Seqg=65 Ack=65 Win=327168 Len=0
37 68.358061 127.0.6.1 127.0.0.1 TCP 198 62198 + 5909 [PSH, ACK] Seq=65 Ack=65 Nin=2161152 Len
38 68.358111 127.0.6.1 127.0.0.1 TCP 44 5900 + 62198 [ACK] Seq=65 Ack=129 Win=2161152 Len=0
39 68.358413 127.0.0.1 127.0.0.1 ICP 198 5008 + 62198 [PSH, ACK] Seq=65 Ack=129 Win=2161152 Le
40 68.358439 127.0.9.1 127.0.0.1 TCP 44 62198 + 5000 [ACK] Seq=129 Ack=129 Win=2161152 Len=0
41 74.626618 8OFF:6a01:2F0 Fe8O: :8OFF:6a01:2F0 TLSv1.2 285 Application Data
42 74.826674 @: :89ff :6a81:2f0 fe8@: :88ff:6a81:2f9 TCP 64 8391 + 61327 [ACK] Seq=1603 Ack=4440 Win=829@ Len=0
43 74.027493 fe80: :80ff:6a01:2f0 fe80: :8@ff:6a81:2f09 TLSv1.2 118 Application Data