Tải bản đầy đủ (.pdf) (36 trang)

Ứng dụng an toàn socket programming

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (6.15 MB, 36 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TỒN THƠNG TIN
----

BÁO CÁO MƠN HỌC
KỸ THUẬT LẬP TRÌNH
ĐỀ TÀI
ỨNG DỤNG AN TỒN SOCKET PROGRAMMING

Hà Nội, 3-2023


HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TỒN THƠNG TIN
----

BÁO CÁO MƠN HỌC
KỸ THUẬT LẬP TRÌNH
ĐỀ TÀI
ỨNG DỤNG AN TỒN SOCKET PROGRAMMING
Nhóm thực hiện: Nhóm 7
Sinh viên thực hiện:

Hà Nội, 2-2023

ii


MỤC LỤC
MỤC LỤC .............................................................................................................................................. iii
TÓM TẮT NỘI DUNG ĐỀ TÀI .......................................................................................................... iv


LỜI NÓI ĐẦU ........................................................................................................................................ v
CHƯƠNG 1: SOCKET PROGRAMMING ....................................................................................... 1
1.

Khái niệm và mục đích của Socket programming. ............................................................ 1

2.

Cơ chế hoạt động của Socket programming. ...................................................................... 2

3.

Các ứng dụng của Socket programming. ............................................................................ 3

4.

Các thư viện và ngôn ngữ hỗ trợ Socket programming. .................................................... 4

CHƯƠNG 2: ỨNG DỤNG AN TOÀN SOCKET PROGRAMMING ............................................. 6
1.

Các nguy cơ bảo mật trong Socket programming. ............................................................. 6

2.

Các phương pháp bảo mật Socket programming. ............................................................. 6

2.1.

Xác thực người dung trong Socket programming ....................................................... 6


2.2.

Advanced Encryption Standard (AES) ........................................................................ 8

2.3.

Giao thức SSL/TLS ..................................................................................................... 10

CHƯƠNG 3: THỰC NGHIỆM ......................................................................................................... 11
1.

Mơ hình xây dựng. .............................................................................................................. 11

2.

Kịch bản. .............................................................................................................................. 12

2.1. Xây dựng Client và Server với thư viện socket ............................................................. 12
2.2. Xây dựng xác thực người dùng trong Socket. ................................................................ 14
2.3. Advanced Encryption Standard (AES) .......................................................................... 18
2.4. Giao thức SSL/TLS ......................................................................................................... 24
KẾT LUẬN .......................................................................................................................................... 29

iii


TÓM TẮT NỘI DUNG ĐỀ TÀI
Giới thiệu tổng quát về Socket Programming và cách sử dụng.
Trình bày một số ứng dụng an toàn Socket Programming.

Triển khai thực hiện các ứng dụng an toàn nêu trên.

iv


LỜI NĨI ĐẦU
Socket programming là kỹ thuật lập trình được sử dụng để truyền tải dữ liệu giữa các
máy tính thông qua mạng. Tuy nhiên, việc truyền tải dữ liệu qua mạng cũng mang theo
nhiều rủi ro về bảo mật, bao gồm nguy cơ bị tin tặc đánh cắp thông tin hay xâm nhập
vào hệ thống. Do đó, để đảm bảo tính bảo mật và tính xác thực của dữ liệu trong quá
trình truyền tải qua mạng, việc sử dụng các công nghệ bảo mật là cần thiết.

Bài báo cáo này sẽ trình bày các cơng nghệ bảo mật như SSL/TLS, access control,
authentication và AES và cách sử dụng chúng trong socket programming để đảm bảo
tính bảo mật và tính xác thực trong quá trình truyền tải dữ liệu qua mạng. Ngồi ra, bài
báo cáo cũng sẽ trình bày một thực nghiệm đơn giản để minh họa cho việc sử dụng các
công nghệ bảo mật này trong socket programming.

Với bài báo cáo này, mục đích của chúng ta là hiểu rõ hơn về các công nghệ bảo mật
được sử dụng trong socket programming và cách sử dụng chúng để đảm bảo tính bảo
mật và tính xác thực của dữ liệu trong quá trình truyền tải qua mạng. Chúng ta hy vọng
bài báo cáo này sẽ cung cấp cho bạn đọc một cái nhìn tổng quan về chủ đề này và hữu
ích cho các nhà phát triển và chuyên gia an tồn thơng tin.

v


CHƯƠNG 1: SOCKET PROGRAMMING
1.
Khái niệm và mục đích của Socket programming.

Socket programming là một kỹ thuật lập trình được sử dụng để kết nối và trao đổi dữ
liệu giữa các ứng dụng đang chạy trên các máy tính khác nhau thông qua mạng
internet. Socket là một đối tượng trong lập trình mạng, nó cho phép các ứng dụng
truyền và nhận dữ liệu qua mạng internet.

Cụ thể, socket là một cổng mà các ứng dụng có thể sử dụng để truyền và nhận dữ liệu.
Các ứng dụng có thể liên kết với socket và truyền và nhận dữ liệu thông qua socket đó.
Socket sử dụng giao thức TCP hoặc UDP để truyền và nhận dữ liệu.
Ví dụ, một ứng dụng trị chuyện trực tuyến có thể sử dụng socket programming để kết
nối và trao đổi dữ liệu giữa các người dùng trên các máy tính khác nhau. Mỗi người
dùng sẽ có một socket client để kết nối đến socket server của ứng dụng trò chuyện.
Khi một người dùng gửi tin nhắn, socket client của người đó sẽ truyền tin nhắn đó đến
socket server. Socket server sẽ chuyển tiếp tin nhắn đến socket client của người nhận
tin nhắn.


Tóm lại, socket programming là kỹ thuật lập trình sử dụng socket để kết nối và trao
đổi dữ liệu giữa các ứng dụng trên mạng internet. Các ứng dụng có thể sử dụng socket
để truyền và nhận dữ liệu một cách dễ dàng và hiệu quả.
2.

Cơ chế hoạt động của Socket programming.

Cơ chế hoạt động của socket programming gồm các bước chính như sau:


Tạo socket: Đầu tiên, ứng dụng phải tạo một socket trên máy tính của mình

bằng cách sử dụng một hàm tạo socket. Ứng dụng có thể tạo socket sử dụng các giao
thức khác nhau như TCP hoặc UDP.

 Liên kết socket và cổng: Sau khi socket được tạo, ứng dụng phải liên kết socket
này với một địa chỉ IP và một cổng trên máy tính của mình. Điều này cho phép socket
truyền dữ liệu đến một máy tính khác trên mạng.
 Lắng nghe các kết nối: Khi socket đã được liên kết, ứng dụng có thể bắt đầu
lắng nghe các kết nối đến từ các máy tính khác trên mạng. Nếu một kết nối được thực
hiện, socket sẽ chấp nhận kết nối và bắt đầu truyền dữ liệu giữa các máy tính.


Truyền dữ liệu: Sau khi kết nối được thiết lập, các máy tính có thể truyền dữ

liệu qua socket để trao đổi thông tin giữa các ứng dụng.
Khi sử dụng các giao thức như TCP và UDP, socket programming sử dụng các
trường cờ (flag fields) để định nghĩa các thông tin liên quan đến kết nối và truyền dữ
liệu.

2


Trong trường hợp sử dụng giao thức TCP, socket programming sử dụng cơ chế "threeway handshake" để thiết lập kết nối giữa các máy tính. Khi thiết lập kết nối, các gói tin
SYN và ACK được sử dụng để xác nhận các bên đang trao đổi thông tin. Sau khi kết
nối được thiết lập, các gói tin được truyền qua socket theo thứ tự được xác định và
được đảm bảo đến đích một cách chính xác.
Trong trường hợp sử dụng giao thức UDP, socket programming không yêu cầu thiết
lập kết nối trước khi truyền dữ liệu. Các gói tin được truyền qua socket mà không cần
xác nhận hay đảm bảo đến đích một cách chính xác như TCP. Thay vào đó, các gói tin
UDP được truyền qua mạng một cách nhanh chóng và có thể bị mất hoặc nhận sai thứ
tự.
Để sử dụng các giao thức TCP và UDP trong socket programming, ứng dụng cần sử
dụng các hàm khác nhau để thiết lập và quản lý kết nối. Ví dụ, hàm ‘connect()’ được
sử dụng để thiết lập kết nối TCP giữa các máy tính, trong khi hàm ‘sendto()’ được sử

dụng để truyền dữ liệu qua socket UDP.
3.
Các ứng dụng của Socket programming.
Socket programming là một công nghệ quan trọng được sử dụng trong nhiều ứng dụng
khác nhau để truyền dữ liệu qua mạng. Dưới đây là một số ví dụ về các ứng dụng của
socket programming:
 Truyền tệp: Socket programming có thể được sử dụng để truyền các tệp hoặc dữ
liệu lớn giữa các máy tính. Ví dụ, một ứng dụng FTP (File Transfer Protocol) sử
dụng socket để truyền tệp giữa máy tính nguồn và đích.
 Trị chuyện trực tuyến: Socket programming cũng có thể được sử dụng để xây dựng
các ứng dụng trò chuyện trực tuyến như Skype, Zoom hoặc Microsoft Teams. Các
giao thức như TCP hoặc UDP được sử dụng để truyền dữ liệu giữa các người dùng.
 Truyền tin nhắn: Socket programming cũng được sử dụng trong các ứng dụng nhắn
tin như WhatsApp, Messenger hay Telegram. Với socket programming, người dùng có
thể gửi và nhận tin nhắn nhanh chóng và hiệu quả.
 Chia sẻ tài nguyên: Socket programming có thể được sử dụng để chia sẻ tài nguyên
như máy in hoặc tệp giữa các máy tính trong cùng một mạng. Việc sử dụng socket
giúp các máy tính có thể truy cập vào tài nguyên chia sẻ một cách nhanh chóng và dễ
dàng.
3


 Đa phương tiện: Socket programming cũng được sử dụng trong các ứng dụng đa
phương tiện như YouTube, Netflix hoặc Spotify. Với socket programming, người
dùng có thể truyền các tệp âm thanh và video giữa các máy tính một cách nhanh chóng
và hiệu quả.
Tóm lại, socket programming là một cơng nghệ quan trọng được sử dụng trong nhiều
ứng dụng khác nhau để truyền dữ liệu qua mạng. Các ứng dụng của socket
programming bao gồm truyền tệp, trò chuyện trực tuyến, truyền tin nhắn, chia sẻ tài
nguyên và đa phương tiện.

4.

Các thư viện và ngôn ngữ hỗ trợ Socket programming.
Socket programming được hỗ trợ bởi nhiều thư viện và ngôn ngữ lập trình khác

nhau. Sau đây là một số thư viện và ngôn ngữ phổ biến được sử dụng để triển khai
socket programming:


C/C++: C/C++ là ngơn ngữ lập trình cổ điển được sử dụng rộng rãi trong socket

programming. Các thư viện như Winsock và BSD Socket cung cấp các chức năng cần
thiết để tạo, kết nối và truyền dữ liệu giữa các socket trong C/C++.


Python: Python là một ngôn ngữ lập trình phổ biến trong socket programming.

Python cung cấp một số thư viện như socket và asyncio để triển khai socket
programming. Thư viện socket cung cấp các chức năng cần thiết để tạo, kết nối và
truyền dữ liệu giữa các socket trong Python. Thư viện asyncio cung cấp một cách tiếp
cận đồng thời và không đồng bộ cho socket programming.

Java: Java cũng là một ngơn ngữ lập trình phổ biến cho socket programming.
Java cung cấp các thư viện như java.net để triển khai socket programming. Các lớp
Socket và ServerSocket cung cấp các chức năng cần thiết để tạo, kết nối và truyền dữ
liệu giữa các socket trong Java.


PHP: PHP là một ngơn ngữ lập trình phía máy chủ được sử dụng rộng rãi trong


socket programming. PHP cung cấp các thư viện như socket để triển khai socket
programming. Thư viện socket cung cấp các chức năng cần thiết để tạo, kết nối và
truyền dữ liệu giữa các socket trong PHP.


Ruby: Ruby là một ngơn ngữ lập trình đa năng được sử dụng rộng rãi trong

socket programming. Ruby cung cấp các thư viện như socket để triển khai socket
programming. Thư viện socket cung cấp các chức năng cần thiết để tạo, kết nối và
truyền dữ liệu giữa các socket trong Ruby.


JavaScript: JavaScript là một ngơn ngữ lập trình phổ biến cho các ứng dụng

web và socket programming. Node.js cung cấp một số thư viện như net và socket.io để
triển khai socket programming trong JavaScript. Thư viện net cung cấp các chức năng
4


cần thiết để tạo, kết nối và truyền dữ liệu giữa các socket trong Node.js. Thư viện
socket.io cung cấp một cách tiếp cận đồng thời và không đồng bộ cho socket
programming.
Trong Python, để triển khai socket programming, ta có thể sử dụng thư viện socket.
Đây là một thư viện chuẩn của Python và được cài đặt sẵn trong các phiên bản Python
từ 2.0 trở lên. Để sử dụng thư viện socket trong Python, ta có thể làm như sau:
1.

2.

Import thư viện socket:


Tạo một socket:

AF_INET là họ địa chỉ cho IPv4
SOCK_STREAM là kiểu socket dùng để truyền dữ liệu liên tục.
3.

Liên kết socket với một cổng cụ thể:

4.

Lắng nghe các kết nối đến socket:

5.

Chấp nhận kết nối đến socket và truyền dữ liệu:

Trong đó, accept() sẽ chấp nhận một kết nối đến socket và trả về một đối tượng socket
mới (client_socket) để truyền dữ liệu với client. Sau đó, ta có thể sử dụng các phương
thức recv() và sendall() để nhận và truyền dữ liệu giữa server và client.

5


CHƯƠNG 2: ỨNG DỤNG AN TOÀN SOCKET PROGRAMMING

1.
Các nguy cơ bảo mật trong Socket programming.
Khi sử dụng Socket Programming,có một số nguy cơ bảo mật mà người dùng cần lưu
ý:

a)

Cuộc tấn cơng từ bên ngồi: Khi triển khai Socket Programming, các ứng dụng

có thể trở thành mục tiêu của các cuộc tấn cơng từ bên ngồi, bao gồm tấn cơng từ
chối dịch vụ (DoS) và tấn công tràn bộ đệm (Buffer Overflow). Để ngăn chặn các cuộc
tấn công này, người dùng cần thiết lập các cơ chế bảo mật như tường lửa (firewall) và
giới hạn tần suất truy cập.
b)

Cuộc tấn công từ người dùng không hợp lệ: Người dùng không hợp lệ có thể

tấn cơng hệ thống bằng cách gửi các gói tin độc hại hoặc xâm nhập vào hệ thống. Để
ngăn chặn các cuộc tấn công này, người dùng cần sử dụng các phương thức xác thực
và phân quyền cho người dùng.
c)

Các lỗ hổng bảo mật trong phiên bản cũ của Socket: Phiên bản cũ của Socket có

thể bị các lỗ hổng bảo mật, ví dụ như lỗ hổng mã độc shellshock trên Unix. Để giảm
thiểu các lỗ hổng bảo mật này, người dùng cần cập nhật phiên bản Socket mới nhất và
áp dụng các bản vá lỗi bảo mật khi có.
d)

Lỗ hổng bảo mật về dữ liệu: Khi truyền dữ liệu giữa các máy tính, dữ liệu có

thể bị đánh cắp hoặc sửa đổi trong quá trình truyền. Để ngăn chặn các lỗ hổng bảo mật
này, người dùng cần sử dụng các phương thức mã hóa dữ liệu để bảo vệ thông tin
được truyền đi. Các phương thức này bao gồm TLS/SSL, SSH, và VPN.
e)


Lỗ hổng bảo mật về phần mềm: Nếu phần mềm triển khai Socket Programming

có lỗ hổng bảo mật, người dùng có thể dễ dàng bị tấn công bởi hacker. Để giảm thiểu
các lỗ hổng bảo mật này, người dùng nên sử dụng phần mềm có nguồn gốc đáng tin
cậy và cập nhật thường xuyên.
2.

Các phương pháp bảo mật Socket programming.

2.1. Xác thực người dung trong Socket programming
Phương pháp xác thực người dùng trong socket programming là q trình xác
minh danh tính của người dùng trước khi cho phép họ truy cập vào hệ thống. Điều này
6


là rất quan trọng trong việc bảo vệ hệ thống và ngăn chặn các cuộc tấn cơng từ phía
người dùng không được ủy quyền.
Ứng dụng: Phương pháp xác thực người dùng trong socket programming được sử
dụng rộng rãi trong các ứng dụng như trò chuyện trực tuyến, trò chơi trực tuyến, hệ
thống quản lý, các ứng dụng web và nhiều ứng dụng khác.
Ưu điểm:
 Bảo vệ hệ thống trước các cuộc tấn cơng từ phía người dùng.
 Có thể cung cấp các quyền truy cập khác nhau cho người dùng tùy thuộc vào
quyền của họ.
 Giúp ngăn chặn sự lạm dụng thông tin và giả mạo dữ liệu.
Nhược điểm:
 Độ chính xác của phương pháp này có thể bị ảnh hưởng bởi sự mất mát của
thông tin đăng nhập.
 Sử dụng tên người dùng và mật khẩu là phương pháp xác thực đơn giản, nhưng

không phải là phương pháp bảo mật cao.
 Điều kiện tiên quyết cho phương pháp này là người dùng phải nhớ mật khẩu
của họ. Nếu họ không nhớ, họ sẽ không thể đăng nhập vào hệ thống.
Cách dùng: Phương pháp xác thực người dùng thông thường sử dụng tên người
dùng và mật khẩu để xác thực. Để đăng nhập vào hệ thống, người dùng sẽ cung cấp
thông tin đăng nhập của họ (tên người dùng và mật khẩu) cho server. Sau đó, server sẽ
kiểm tra thơng tin này với cơ sở dữ liệu của hệ thống để xác định xem thơng tin đăng
nhập có hợp lệ hay không. Nếu thông tin đăng nhập hợp lệ, người dùng sẽ được phép
truy cập vào hệ thống, ngược lại, họ sẽ bị từ chối truy cập.
Kết luận: Phương pháp xác thực người dùng trong socket programming là rất
quan trọng để bảo vệ hệ thống khỏi các cuộc tấn công từ phía người dùng khơng được
ủy quyền. Tuy nhiên, để đảm bảo tính bảo mật cao của hệ thống, cần phải sử dụng các
phương pháp xác thực mạnh hơn như SSL/TLS, AES,... Ngoài ra, cần lưu ý rằng
phương pháp xác thực bằng tên người dùng và mật khẩu không đảm bảo tính bảo mật
cao và có thể bị tấn cơng bằng các phương pháp như tấn cơng đoạn mã hóa (brute
force attack) hoặc tấn cơng phishing. Do đó, cần phải sử dụng các biện pháp bảo mật
khác như mã hóa thông tin truyền tải hoặc sử dụng giao thức xác thực mạnh hơn như
OAuth hoặc OpenID Connect để tăng tính bảo mật cho hệ thống.
Tóm lại, phương pháp xác thực người dùng trong socket programming là quan
trọng để bảo vệ hệ thống khỏi các cuộc tấn cơng từ phía người dùng không được ủy
7


quyền. Tuy nhiên, để đảm bảo tính bảo mật cao, cần sử dụng các phương pháp xác
thực mạnh hơn và kết hợp với các biện pháp bảo mật khác để giảm thiểu rủi ro tấn
công.
2.2.

Advanced Encryption Standard (AES)


2.2.1.

Tổng quan về Advanced Encryption Standard (AES):

Khi truyền dữ liệu qua mạng sử dụng Socket Programming, dữ liệu có thể bị tấn
cơng và đánh cắp nếu khơng được bảo vệ. Do đó, để dữ liệu được an toàn trên đường
truyền cần sử dụng các biện pháp an toàn dữ liệu, một trong số các biện pháp an tồn
có thể nhắc đến thuật tốn mã hố Advanced Encryption Standard (AES) để mã hóa
dữ liệu trước khi truyền đi. Khi dữ liệu đến đích, nó sẽ được giải mã bằng cùng một
khóa để lấy lại dữ liệu gốc.
Advanced Encryption Standard (AES) là một thuật toán mã hóa đối xứng được sử
dụng rộng rãi trong an tồn thơng tin. Nó được chấp nhận bởi Chính phủ Hoa Kỳ và
được sử dụng để bảo vệ các dữ liệu nhạy cảm, chẳng hạn như thông tin tài khoản ngân
hàng, thơng tin cá nhân, thơng tin tài sản trí tuệ và được sử dụng rộng rãi trong các
ứng dụng bảo mật như truyền thơng an tồn, truyền file an toàn, và bảo vệ mật khẩu.
Cách thức hoạt động của AES là sử dụng một khối dữ liệu đầu vào có kích thước cố
định, được chia thành các khối con bằng cách sử dụng một khóa mã hóa cố định. Sau
đó, các khối dữ liệu con này được xử lý thơng qua một số vịng lặp của phép thay thế,
hốn vị, và thêm trộn để tạo ra dữ liệu mã hóa.
AES được coi là một thuật tốn mã hóa đối xứng mạnh mẽ, bởi vì nó cung cấp một
mức độ bảo mật cao và có khả năng chống lại các cuộc tấn công bằng cách sử dụng
các kỹ thuật tiên tiến, chẳng hạn như tấn cơng dị mã và tấn công bằng lực brute.
Các đặc điểm của AES bao gồm kích thước khóa dài từ 128 đến 256 bit, cùng với
sự hiệu quả và tính di động. Nó cũng có khả năng được sử dụng cho các ứng dụng với
các mức độ bảo mật khác nhau, từ bảo vệ cơ bản đến bảo vệ cao cấp.
Ứng dụng của AES trong an tồn thơng tin rất đa dạng, được sử dụng rộng rãi trong
các ứng dụng an tồn:


Mã hóa dữ liệu cá nhân: AES được sử dụng để bảo vệ dữ liệu cá nhân trong các


ứng dụng như lưu trữ đám mây, trao đổi email, trao đổi tập tin qua mạng, hoặc truyền
tải thông tin cá nhân trên các kênh truyền thông.


Bảo mật mạng: AES được sử dụng để bảo vệ các kết nối mạng, bao gồm mạng

VPN, mạng LAN và WAN, và các giao thức truyền tải như HTTPS, SSH, FTPS.
8




Bảo mật phần mềm: AES được sử dụng để bảo vệ các phần mềm và ứng dụng

khỏi việc truy cập trái phép, sao chép hoặc thay đổi bởi các hacker hoặc nhân viên
không được ủy quyền.


Bảo mật phần cứng: AES được sử dụng trong các sản phẩm điện tử như USB, ổ

đĩa cứng, thẻ nhớ, và các sản phẩm bảo mật khác để bảo vệ dữ liệu khỏi mất mát hoặc
truy cập trái phép.

Bảo mật tài khoản và mật khẩu: AES được sử dụng để mã hóa các tài khoản và
mật khẩu, ngăn chặn việc truy cập trái phép vào các hệ thống, ứng dụng hoặc trang
web
Với tính năng mã hóa mạnh mẽ và độ an tồn cao, AES là một giải pháp bảo mật
được sử dụng rộng rãi trong nhiều lĩnh vực. Nếu đang phát triển các sản phẩm hoặc
dịch vụ có liên quan đến bảo mật dữ liệu, AES là một công nghệ không thể thiếu trong

các giải pháp.
2.2.2.

Mô tả tổng quát cách thực hiện

Để sử dụng AES trong socket programming để đảm bảo an tồn thơng tin, cần thực
hiện các bước sau:
1) Thực hiện mã hóa và giải mã dữ liệu sử dụng AES Trước tiên, cần phải tạo các
chức năng để mã hóa và giải mã dữ liệu sử dụng thuật tốn AES. Có thể sử
dụng các thư viện mã hóa AES được cung cấp bởi ngơn ngữ lập trình, chẳng
hạn như PyCrypto hoặc PyCryptodome cho Python.
2) Thực hiện kết nối giữa client và server bằng socket Sử dụng socket
programming để tạo kết nối giữa client và server. Có thể sử dụng module socket
trong Python để thực hiện điều này.
3) Thực hiện mã hóa và giải mã dữ liệu khi truyền qua socket Sau khi đã tạo được
kết nối giữa client và server, có thể sử dụng các chức năng mã hóa và giải mã
dữ liệu để đảm bảo an tồn thơng tin khi truyền qua socket. Để thực hiện việc
này, có thể đóng gói dữ liệu được mã hóa vào một gói tin và truyền nó qua
socket.
2.2.3.

Kết luận

AES là một thuật tốn mã hóa mạnh mẽ được sử dụng để bảo vệ dữ liệu truyền tải
trong socket programming. Nó có thể giúp giảm thiểu rủi ro bị tấn công mạng và đánh
cắp dữ liệu.
Tuy nhiên, việc sử dụng AES khơng đảm bảo hồn tồn tính bảo mật của hệ thống.
Các lỗ hổng bảo mật khác như tấn công tràn bộ đệm, tấn công từ chối dịch vụ (DoS)
hay tấn cơng trung manh có thể tiếp tục tồn tại.
9



Để cải thiện tính bảo mật của hệ thống socket programming, ta có thể sử dụng các
biện pháp bảo mật khác như kiểm sốt truy cập, mã hóa các thơng tin nhạy cảm, thiết
lập các chính sách bảo mật, kiểm tra định kỳ hệ thống để phát hiện lỗ hổng bảo mật và
áp dụng các bản vá an ninh cập nhật cho phần mềm hệ thống.
Ngoài ra, việc giảm thiểu sự phụ thuộc vào các thư viện mã nguồn mở, đảm bảo
tính bảo mật của các phần mềm và hệ thống, đào tạo nhân viên về các vấn đề an ninh
cũng là các yếu tố quan trọng để tăng cường bảo mật cho hệ thống socket
programming.
2.3.

Giao thức SSL/TLS
Giao thức SSL/TLS (Secure Sockets Layer/Transport Layer Security) là một

giao thức bảo mật được sử dụng để mã hóa và bảo mật thơng tin truyền tải giữa các
máy tính trên mạng Internet. Giao thức này giúp bảo vệ thông tin của người dùng khi
truy cập các trang web, gửi email hoặc thực hiện các giao dịch trực tuyến. SSL/TLS sử
dụng một loạt các thuật tốn mã hóa và xác thực để đảm bảo tính bảo mật của thơng
tin truyền tải.
Trong socket programming, SSL/TLS được sử dụng để tạo một kênh truyền thông bảo
mật giữa các ứng dụng trên mạng. Việc sử dụng SSL/TLS giúp bảo vệ thơng tin truyền
tải giữa các máy tính trên mạng khỏi bị đánh cắp hoặc giả mạo.
Ứng dụng: Giao thức SSL/TLS được sử dụng rộng rãi trong các ứng dụng trên mạng
như truyền tải email, truy cập các trang web bảo mật, thực hiện các giao dịch trực
tuyến và truyền tải dữ liệu nhạy cảm. Trong socket programming, SSL/TLS được sử
dụng để tạo kênh truyền thông bảo mật giữa các ứng dụng trên mạng.
Ưu điểm:
 Đảm bảo tính bảo mật của thông tin truyền tải.
 Tạo kênh truyền thông bảo mật giữa các ứng dụng trên mạng.

 Cung cấp tính năng xác thực và ủy quyền.
 Có tính khả chuyển cao, có thể sử dụng trên nhiều nền tảng và các ngơn ngữ lập
trình khác nhau.
Nhược điểm:
 Tốn tài ngun máy tính hơn so với truyền thơng thơng thường.
 Có thể làm chậm tốc độ truyền tải dữ liệu.
Cách dùng:
-

Để sử dụng SSL/TLS trong socket programming, cần có một chứng chỉ số (SSL
certificate) để xác thực cho máy chủ và các ứng dụng trên mạng. Chứng chỉ số
10


-

-

này cung cấp thông tin về người sở hữu của máy chủ và đảm bảo rằng thông tin
được truyền tải giữa các ứng dụng trên mạng được mã hóa và bảo mật.
Sau khi có chứng chỉ số, các ứng dụng trên mạng có thể sử dụng thư viện
SSL/TLS để tạo kênh truyền thông bảo mật. Thư viện SSL/TLS cung cấp các
hàm để tạo và quản lý các kết nối SSL/TLS, xác thực chứng chỉ số, mã hóa và
giải mã dữ liệu truyền tải.
Để tạo kết nối SSL/TLS, các ứng dụng trên mạng cần thực hiện các bước sau:

1) Tạo socket để kết nối đến máy chủ.
2) Xác thực chứng chỉ số của máy chủ.
3) Tạo kết nối SSL/TLS giữa các ứng dụng trên mạng.
4) Truyền tải dữ liệu giữa các ứng dụng trên mạng qua kênh truyền thông bảo mật.

Kết luận:
Giao thức SSL/TLS là một giao thức bảo mật được sử dụng rộng rãi trên mạng
Internet để bảo vệ thông tin truyền tải giữa các máy tính. Trong socket programming,
SSL/TLS được sử dụng để tạo kênh truyền thông bảo mật giữa các ứng dụng trên
mạng. Việc sử dụng SSL/TLS giúp bảo vệ thơng tin truyền tải giữa các máy tính trên
mạng khỏi bị đánh cắp hoặc giả mạo. Tuy nhiên, việc sử dụng SSL/TLS cũng có
nhược điểm là tốn tài ngun máy tính hơn so với truyền thơng thơng thường và có thể
làm chậm tốc độ truyền tải dữ liệu.

CHƯƠNG 3: THỰC NGHIỆM
1. Mơ hình xây dựng.
Sử dụng ngơn ngữ Python để xây dựng một ứng dụng Socket programming đơn
giản giữa 2 thiết bị, ví dụ như một Client và Server.

Sử dụng các thư viện liên quan để triển khai bảo mật trong quá trình gửi và nhận
dữ liệu giữa Client và Server.
11


2. Kịch bản.
2.1. Xây dựng Client và Server với thư viện socket
Client và Server là hai khái niệm quan trong với vai trò là hai thành phần cơ
bản để truyền thông tin giữa các thiết bị trong mạng. Python cung cấp cho bạn module
để tạo một ứng dụng máy khách (Client) và máy chủ (Server) là module socket.
Để bắt đầu xây dựng Server và Client , chúng ta cần phải nhập thư viện sau:

Xây dựng Server
Để xây dựng một Server trong Python , bạn có thể thực hiện các bước sau:
- Tạo socket – sử dụng hàm socket () để tạo socket.
- Liên kết socket – sử dụng hàm bind() để liên kết socket với địa chỉ IP và cổng

- Lắng nghe kết nối – sử dụng hàm listen() để Server có thể chấp nhận các kết
nối từ client
- Chấp nhận kết nối – sử dụng hàm accept() để server chấp nhận kết nối từ
client . Mỗi khi một client yêu cầu kết nối , hàm accept() sẽ trả về một đối
tượng socket mới được cấp phát để sử dụng cho kết nối mới đó
- Xử lý dữ liệu – sử dụng các hàm send() và recv() để gửi và nhận dữ liệu giữa
các client và Server
Code:

12


Xây dựng Client
Để xây dựng một Client trong Python , các bước sẽ tương tự như sau:
- Tạo socket – sử dụng hàm socket() để tạo socket.
- Kết nối socket – sử dụng hàm connecnt() để kết nối tới một địa chỉ IP và cổng
- Gửi và nhận dữ liệu – sử dụng các hàm send() và recv() để gửi và nhận dữ liệu
giữa client và Server
Code:

13


Server và Client đều được sử dụng hàm socket() để tạo socket.
Đối với server, socket sẽ được liên kết với một địa chỉ IP và cổng cụ thể sử dụng hàm
bind(). Sau đó, Server sử dụng hàm listen() để lắng nghe các kết nối từ client và hàm
accept() để chấp nhận kết nối.
Đối với client, socket sẽ được kết nối đến một địa chỉ và cổng cụ thể sử dụng hàm
connect(). Sau đó , client sử dụng hàm send() để gửi dữ liệu tới Server và hàm recv()
để nhận phản hồi từ Server


2.2. Xây dựng xác thực người dùng trong Socket.
2.2.1. Mục tiêu.
Ở phương pháp này , các bên trao đổi dữ liệu qua socket đều là đối tượng hợp
lệ và có quyền truy cập vào nội dung được trao đổi
2.2.2. Thực hiện.
14


SERVER:
Bước 1: Tạo socket , liên kết socket, lắng nghe kết nối
Ta sử dụng các hàm socket(), bind(), listen()
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((localhost,PORT))
s.listen()
Bước 2: Chấp nhận kết nối từ Client
Ta sử dụng hàm accept() để chấp nhận kết nối, và địa chỉ của Client.
Connect, address = s.accept()
Print(“address client : ”,address)
Bước 3: Xác thực thơng tin từ Client
Ở đây Client cần có tài khoản, mật khẩu để đăng nhập truy cập vào
Server.
Vậy Server có 2 bước thực hiện xác thực thơng tin là:
 Nhận thông tin về đăng nhập về client
 Xác thực , kiểm tra thơng tin đăng nhập đã có sẵn trong Server
Nếu được client nhập tài khoản , mật khẩu thỏa mãn trong Server.
-> Vậy Server sẽ đồng ý cho Client truy cập vào
Nếu không đúng về tài khoản hoặc mật khẩu.
-> Vậy Server sẽ không đồng ý cho Client truy cập vào
account = connect.recv(1024).decode(FORMAT)

password = connect.recv(1024).decode(FORMAT)
if account == “admin” and password == “password” :
connect.sendall(b“Truy cap cho phep \n”)
else :
connect.sendall(b“Truy cap khong cho phep \n”)

CLIENT:
15


Bước 1 : Tạo socket và kết nối với địa chỉ IP và cổng
Ta sử dụng hàm socket() để tạo và hàm connect() để kết nối
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((localhost, PORT))

Bước 2: Nhập và gửi thông tin đăng nhập đến Server:
account = input(“Account: ”)
client.sendall(account.encode(FORMAT))
password = input(“Password: ”)
client.sendall(password.encode(FORMAT))

Bước 3 : Nhập phản hồi từ server về việc có thể truy cập hay khơng:
response = client.recv(1024).decode(FORMAT)
print(“Response: ”,response)

SERVER:
16


CLIENT:


2.2.3. Kết quả và đánh giá.
17


Nhận xét :
Về Server:
Trong ví dụ này, máy chủ cho phép truy cập đối với những người dùng nằm trong
danh sách “valid_user”. Khi có yêu cầu truy cập từ máy khách , máy chủ sẽ yêu
cầu người dùng đăng nhập thông tin đăng nhập và kiểm tra xem thông tin có hợp
lệ khơng. Nếu thơng tin đăng nhập hợp lệ , máy chủ sẽ gửi lại phản hồi
Về Client:
Trong ví dụ này, client sử dụng hàm input() để yêu cầu người nhập thông tin đăng
nhập và sử dụng hàm sendall() để gửi thông tin của người dùng đến Server. Sau đó,
client sẽ nhận phản hồi từ Server để biết thơng tin có hợp lệ hay khơng.
2.3. Advanced Encryption Standard (AES)
2.3.1. Mục tiêu.


Hiểu cách sử dụng AES để bảo mật dữ liệu trong Socket programming.


Hiểu cách triển khai mã hóa AES trong Python sử dụng thư viện
PyCrypto.


Hiểu cách sử dụng Socket để gửi và nhận dữ liệu giữa Client và Server

2.3.2. Thực hiện.
Để sử dụng AES trong Python qua socket, cần cài đặt thư viện pycryptodome:

pip install pycryptodome
a) Xây dựng AES trong Python
 Mã hóa:
Bước 1: Sử dụng hàm AES.new(key,A ES_MODE_CBC,IV) để tạo đối tượng
AES với chế độ CBC để mã hóa tin nhắn
cipher = AES.new(key, AES.MODE_CBC, b'This is an IV456')
18


Bước 2: Đệm tin nhắn thành bội số của kích thước khối
padded_message = message + b'\0' * (AES.block_size - len(message) %
AES.block_size)
Bước 3: Trả về Ciphertext
ciphertext = cipher.encrypt(padded_message)

Code:
def encrypt(message):
cipher = AES.new(key, AES.MODE_CBC, b'This is an IV456')
padded_message = message + b'\0' * (AES.block_size - len(message) %
AES.block_size)
ciphertext = cipher.encrypt(padded_message)
return ciphertext
 Giải mã
Bước 1: Sử dụng hàm AES.new(key,AES_MODE_CBC,IV) để tạo đối tượng
AES với chế độ CBC để giải mã bản mã
plaintext = cipher.decrypt(ciphertext)
Bước 2: Loại bỏ bất kỳ phần đệm nào được thêm vào bản rõ
plaintext.rstrip(b'\0')

Code:

def decrypt(ciphertext):
cipher = AES.new(key, AES.MODE_CBC, b'This is an IV456')
plaintext = cipher.decrypt(ciphertext)
return plaintext.rstrip(b'\0')
b) Xây dựng AES với socket python
 Server:
Bước 1: Khai báo khóa và vector
19


Bước 2: Tạo socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5000))
server_socket.listen(1)
Bước 3: Kết nối với client
client_socket, client_address = server_socket.accept()
Bước 4: Nhận tin nhắn từ Client và giải mã nó
Ta sử dụng hàm recv() để nhận tin nhắn
Ta sử dụng def decrypt(ciphertext) mà ta đã xây dựng ở trên để giải mã tin
nhắn từ Client
Bước 5 : Gửi phản hồi được mã hóa đến cho Client
Ta sử dụng hàm def encrypt(ciphertext) để mã hóa
Ta sử dụng hàm sendall() để gửi tin nhắn đến Client
 Client
Bước 1: Tạo khóa và vector
Bước 2: Tạo socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 5000))
Bước 3: Gửi tin nhắn được mã hóa đến Server
Ta sử dụng hàm def encrypt(ciphertext) để mã hóa

Ta sử dụng hàm sendall() để gửi tin nhắn đến Server
Bước 4: Nhận tin nhắn từ Server và giải mã
Ta sử dụng hàm recv() để nhận tin nhắn từ Server
Ta sử dụng def decrypt(ciphertext) mà ta đã xây dựng ở trên để giải mã tin
nhắn được nhận

20


×