Thiết kế và xây dựng ứng dụng nhắn tin an toàn trên nền tảng iOS sử dụng thư viện CryptoKit

MỤC LỤC

PHÂN TÍCH THIẾT KẾ HỆ THỐNG 1.1 Lấy yêu cầu người dùng

Nhìn chung, CryptoKit là một công cụ mạnh mẽ dành cho các nhà phát triển xây dựng hệ thống nhắn tin an toàn, tính dễ sử dụng và hỗ trợ nhiều thuật toán mã hóa làm cho nó trở thành một bổ sung có giá trị cho bất kỳ bộ công cụ nào của nhà phát triển. ● Đăng ký và đăng nhập: Người dùng có thể đăng ký tài khoản mới và đăng nhập vào tài khoản hiện có. ● Thiết kế thân thiện với người dùng: Ứng dụng nên có giao diện thân thiện với người dùng, tối giản mà vẫn phải đầy đủ chức năng, đảm bảo người dùng không gặp khó khăn khi tương tác với hệ thống.

- Mọi người dùng: Họ muốn sử dụng ứng dụng để trò chuyện, trao đổi thông tin một cách an toàn và bảo mật. Họ chính là người sẽ tạo tài khoản và thực hiện cuộc trò chuyện trờn ứng dụng bằng cỏch thực hiện đăng ký tài khoản, theo dừi và nhắn tin. Thông tin bắt buộc cần nhập: Tên sử dụng, email, mật khẩu và nhập lại mật khẩu.

4 Hệ thống kiểm tra thông tin, hệ thống tiếp nhận thông tin và kiểm tra định dạng trường email, trường tên , trường mật khẩu, trường nhập lại mật khẩu. + Nếu hợp lệ hệ thống tiến hành lưu trữ thông tin và đưa ra thông báo đăng ký thành công. Mô tả Tại giao diện ứng dụng di động, người dùng có thể thực hiện quá trình đăng nhập bằng cách click vào button đăng nhập.

Hệ thống kiểm tra thông tin, nếu thông tin trùng khớp tiến hành đăng nhập và thông báo thành công. Người dùng có tài khoản đã đăng ký hoặc tài khoản gmail, tại giao diện màn cá nhân của một tài khoản. Mã Use Case UC04 Tên Use Case Gửi tin nhắn Tác nhân Người sử dụng Mô tả Người click chọn chat.

1 Truy cập click button chat tại màn cá nhân của tài khoản, hoặc chọn tài khoản tại tab chat. Mã Use Case UC05 Tên Use Case Nhận tin nhắn Tác nhân Người sử dụng Mô tả Có tài khoản gửi tin nhắn.

Bảng 1: Đặc tả ca sử dụng đăng ký
Bảng 1: Đặc tả ca sử dụng đăng ký

LẬP TRÌNH PHÁT TRIỂN ỨNG DỤNG 3.1 Môi trường phát triển và lập trình phát triển ứng dụng

Để thực hiện việc này, hàm lặp đi lặp lại việc tạo ra một số ngẫu nhiên có độ dài cố định (PRIME_NUMBER_LENGTH là biến hằng số) bằng cách sử dụng hàm BigUInteger.randomInteger(withExactWidth:), và sau đó kiểm tra xem số này có phải là số nguyên tố không bằng cách sử dụng hàm isPrime(). Bằng cách tạo ra các số nguyên có độ dài lớn và ngẫu nhiên, trở nên khó khăn hơn cho kẻ tấn công đoán được hoặc đoán số, từ đó nâng cao tính bảo mật của hệ thống. Sau đó, hàm tạo ra hai cặp giá trị khác nhau, mỗi cặp bao gồm một số nguyên ngẫu nhiên (a và b) nhỏ hơn p, và tính toán hai giá trị mới (A và B) bằng cách sử dụng phép tính mũ modular (g.power()).

Hàm verifySignature trong đoạn mã trên được sử dụng để xác minh tính hợp lệ của một chữ ký điện tử (ECDSA) bằng cách sử dụng khóa công khai tương ứng. Phương thức này nhận vào chữ ký và một biểu diễn của khóa công khai (publicKey.rawRepresentation) và trả về giá trị true nếu chữ ký hợp lệ và false nếu không hợp lệ. Việc kiểm tra hai khóa chung có giống nhau là cần thiết để đảm bảo rằng quá trình trao đổi khóa được thực hiện thành công và khóa chung được tính toán chính xác.

● Tốc độ xử lý nhanh: AES-128 có tốc độ xử lý rất nhanh, phù hợp cho ứng dụng chat mobile có thể chuyển đổi giữa các giao tiếp trực tiếp và gián tiếp trong thời gian thực. ● Độ tin cậy cao: Vì là một thuật toán đối xứng, nghĩa là khóa mã hóa và khóa giải mã là cùng một khóa, do đó, đảm bảo rằng các tin nhắn được giải mã một cách chính xác và tin cậy. ● Hỗ trợ rộng rãi: Được hỗ trợ bởi hầu hết các nền tảng di động hiện nay, giúp đơn giản hóa quá trình triển khai mã hóa trong ứng dụng chat mobile.

Các tham số tiếp theo được truyền vào để cấu hình quá trình mã hóa: khóa (là khóa chung sau thỏa thuận khóa Diffie-Hellman), độ dài khóa (trong trường hợp này, giá trị của keyLength là kCCKeySizeAES128, tương đương với độ dài khóa là 128 bit), dữ liệu đầu vào, kích thước khối mã hóa(trong trường hợp này, giá trị của blockSize là. kCCBlockSizeAES128, tương đương với kích thước của một block là 128 bit). Sử dụng chế độ padding này giúp đảm bảo tính đồng nhất của kích thước dữ liệu trước khi mã hóa, giúp cho quá trình giải mã được thực hiện chính xác và đáng tin cậy. ● options: Chỉ định các tùy chọn cho quá trình mã hóa, trong trường hợp này là sử dụng PKCS#7 Padding (kCCOptionPKCS7Padding) để bảo đảm độ dài đầy đủ của các khối dữ liệu.

Sau khi nhận dữ liệu message từ cơ sở dữ liệu trong đó bao gồm key và nội dung tin nhắn bị mã hóa, ta sẽ sử dụng chúng như các tham số để phục vụ cho hàm giải mã dưới đây. Hàm symetricDecrypt được sử dụng để giải mã một chuỗi dữ liệu đã được mã hóa đối xứng với thuật toán AES-128 với một khóa bí mật được cung cấp. Để tích hợp chat bot vào ứng dụng nhắn tin trên thiết bị di động, em sử dụng tính năng chat bot trong ứng dụng sử dụng API của OpenAI có thể cung cấp khả năng tương tác và trò chuyện tự động với người dùng.

Xử lý ngôn ngữ tự nhiên: Tính năng chat bot sử dụng khả năng xử lý ngôn ngữ tự nhiên của OpenAI để hiểu và phản hồi đúng câu hỏi của người dùng. Kiểm soát và giám sát: Tính năng chat bot cần có các cơ chế kiểm soát và giám sát để đảm bảo rằng nó đưa ra các câu trả lời phù hợp và không vi phạm các quy tắc và chính sách của ứng dụng.

Hình 36: Mã hoá tin nhắn sử dụng mã hoá đối xứng AES-128
Hình 36: Mã hoá tin nhắn sử dụng mã hoá đối xứng AES-128