Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số giáo dục đại học (Higher Education Digital Transformation), việc số hóa quy trình quản lý học thuật là yêu cầu sống còn nhằm nâng cao hiệu suất vận hành và đảm bảo tính toàn vẹn dữ liệu. Theo các khảo sát thực tế tại nhiều cơ sở đào tạo chuyên ngành kỹ thuật, hơn 65% quy trình nghiệm thu đồ án tốt nghiệp vẫn phụ thuộc vào hồ sơ bản cứng, đĩa CD lưu trữ source code vật lý và bảng tính phân tán. Thực trạng này dẫn đến nguy cơ thất lạc dữ liệu nghiên cứu lên tới 18%, gây lãng phí trung bình 120 giờ làm việc của cán bộ quản lý mỗi kỳ tốt nghiệp và tiềm ẩn các lỗ hổng bảo mật nghiêm trọng liên quan đến kiểm soát quyền truy cập tài liệu mật.

Đồ án tốt nghiệp "Xây dựng website quản lý đồ án cho Khoa An toàn thông tin" do sinh viên Nghiêm Đình Giang thực hiện dưới sự hướng dẫn của ThS. Dương Xuân Hiệp tại Học viện Kỹ thuật Mật mã (KMA) giải quyết triệt để bài toán số hóa toàn diện quy trình vòng đời đồ án, đồng thời thiết lập chuẩn mực bảo mật cấp ứng dụng chuyên sâu cho môi trường học thuật.

Mục tiêu dự án

  1. Thiết kế và chuẩn hóa cơ sở dữ liệu quan hệ: Xây dựng mô hình dữ liệu tập trung quản lý toàn diện sinh viên, giảng viên hướng dẫn, giảng viên phản biện, hội đồng bảo vệ và các đợt nộp tiến độ đồ án.
  2. Hiện thực hóa quy trình nghiệp vụ tự động: Tự động hóa khâu nộp báo cáo, kiểm duyệt đề xuất đề tài, phân công ngẫu nhiên hoặc chỉ định giảng viên quản lý/phản biện và hội đồng chấm thi.
  3. Triển khai kiến trúc bảo mật đa tầng (Defense-in-Depth): Tích hợp cơ chế xác thực hai yếu tố (2FA), xác thực phân quyền qua JWT (JSON Web Token), mã hóa dữ liệu nhạy cảm AES-256, băm mật khẩu Bcrypt và chống tấn công Injection/XSS.
  4. Tối ưu hóa trải nghiệm người dùng: Xây dựng giao diện ứng dụng đơn trang (SPA) phản hồi nhanh, hỗ trợ nhập/xuất dữ liệu quy mô lớn thông qua tệp Excel (.xlsx).

Phương pháp tiếp cận và kết quả kỳ vọng

Giải pháp áp dụng mô hình phân tách hoàn toàn Frontend - Backend theo kiến trúc RESTful API. Hệ sinh thái kết hợp NestJS (Node.js/TypeScript) ở phía máy chủ và Angular (TypeScript) ở phía máy khách, vận hành trên nền tảng MySQL 8.0.

[ Angular 15 Client SPA ]
[ NestJS 9 Backend Core ]
[ MySQL 8.0 Relational Database & Daily Audit CSV Storage ]
  • Kết quả định lượng kỳ vọng:
    • Rút ngắn 85% thời gian xử lý thủ tục hành chính và thành lập hội đồng.
    • Đạt tỷ lệ số hóa 100% bản mềm tài liệu và nhật ký đánh giá tiến độ.
    • Tối ưu thời gian đáp ứng hệ thống (Latency) < 200ms cho 95% số lượng request thông thường.
    • 100% dữ liệu định danh và secret key được mã hóa an toàn ở trạng thái nghỉ (At-Rest).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí phân tích Phương pháp truyền thống (Bản cứng / Drive) Hệ thống quản lý đồ án KMA
Lưu trữ source code & báo cáo Đĩa CD vật lý, bản in giấy (dễ hư hỏng, thất lạc) Lưu trữ số hóa phân tầng theo folder_id, định dạng JSON
Phân công hội đồng/phản biện Họp bàn thủ công, nhập bảng tính Excel rời rạc Tự động phân công ngẫu nhiên hoặc tùy chỉnh thủ công 1-click
Theo dõi tiến độ đồ án Trao đổi qua email, không có cơ chế versioning Quản lý tiến độ đa kỳ (project_progress), nhận xét 5 tiêu chí
Bảo mật & Kiểm toán Không có log truy vết, chia sẻ file thiếu kiểm soát Xác thực 2FA (TOTP/Email), RBAC, ghi log CSV hằng ngày
Tốc độ truy xuất dữ liệu Mất từ 1 - 3 ngày tra cứu kho lưu trữ < 0.5 giây qua hệ thống tìm kiếm đa tiêu chí

Ma trận ưu tiên yêu cầu người dùng (MoSCoW)

  • Must Have (Bắt buộc): Xác thực JWT + Refresh Token; Xác thực 2FA (Google Authenticator/Email OTP); Quản lý đề tài, sinh viên, giảng viên; Phân quyền RBAC; Nộp báo cáo tiến độ và chấm điểm; Nhập/xuất file Excel; Lọc dữ liệu đầu vào chống XSS/SQL Injection.
  • Should Have (Nên có): Thành lập danh sách hội đồng tự động theo thuật toán ngẫu nhiên; Ghi nhật ký kiểm toán (Audit Log) theo ngày định dạng CSV; Khóa thiết bị 30 phút khi nhập sai OTP quá 3 lần.
  • Could Have (Có thể mở rộng): Thống kê trực quan số lượng đề tài theo khoa/học kỳ; Tích hợp công cụ xem trước tài liệu trực tiếp trên web.
  • Won't Have (Chưa triển khai kỳ này): Chấm điểm tự động source code (Auto-grading); Tích hợp cổng thanh toán thù lao chấm đồ án.

Thiết kế hệ thống

Danh mục công nghệ và phiên bản chuẩn (Technology Stack)

  • Backend Framework: NestJS v9.x (Node.js LTS v18.x) kết hợp TypeScript v4.9+.
  • Frontend Framework: Angular v15.x, RxJS v7.8, Angular Material.
  • Hệ quản trị CSDL: MySQL v8.0 Enterprise / Community Edition (Engine: InnoDB).
  • Thư viện an toàn & tiện ích: passport-jwt (v0.4), bcrypt (v5.1), otplib (v12.0 - RFC 6238 TOTP), sanitize-html (v2.11), mysql2 (v3.3), xlsx (v0.18).

Thiết kế cơ sở dữ liệu quan hệ (Relational Schema)

Hệ thống chuẩn hóa lược đồ dữ liệu với 11 bảng trọng tâm:

-- Trích đoạn cấu trúc bảng projects lưu trữ thông tin đồ án
CREATE TABLE `projects` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `status` ENUM('PENDING', 'APPROVED', 'REJECTED', 'IN_PROGRESS', 'DEFENDED') DEFAULT 'PENDING',
  `description` TEXT NULL,
  `requirement` TEXT NULL,
  `form_score` INT NULL,
  `content_score` INT NULL,
  `summarize_score` INT NULL,
  `answer_score` INT NULL,
  `conclusion_score` FLOAT NULL,
  `reason` VARCHAR(255) NULL,
  `semester_id` INT(11) NOT NULL,
  `department_id` INT(11) NOT NULL,
  `instructor_id` INT(11) NOT NULL,
  `reviewed_by_id` INT(11) NULL,
  `review_staff_id` INT(11) NULL,
  `examiner_council_id` INT(11) NULL,
  `manager_staff_id` INT(11) NULL,
  `folder_id` VARCHAR(255) NULL,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`semester_id`) REFERENCES `semesters`(`id`),
  FOREIGN KEY (`department_id`) REFERENCES `departments`(`id`),
  FOREIGN KEY (`instructor_id`) REFERENCES `users`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Lược đồ bảng user_sessions kiểm soát phiên đăng nhập đa thiết bị
CREATE TABLE `user_sessions` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) NOT NULL,
  `device_id` VARCHAR(255) NULL,
  `device_name` VARCHAR(255) NULL,
  `ip_address` VARCHAR(255) NOT NULL,
  `refresh_jwt` VARCHAR(255) NOT NULL,
  `uid` VARCHAR(255) NOT NULL,
  `expired` TIMESTAMP NOT NULL,
  `is_trusted` TINYINT DEFAULT 0,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thiết kế an ninh ứng dụng

  1. Quản trị vòng đời Token: Access Token cấu hình thời gian sống ngắn (15 phút), Refresh Token (7 ngày). Cơ chế Token Rotation tự động cấp mới cặp khóa khi Access Token hết hạn.
  2. Mã hóa dữ liệu nhạy cảm: Khóa bí mật OTP (otp_secret) được mã hóa tĩnh bằng thuật toán đối xứng AES-256-CBC với khóa 256-bit lưu trữ độc lập tại biến môi trường (.env).
  3. Phân quyền theo nguyên tắc đặc quyền tối thiểu (PoLP): Phân định ranh giới rõ ràng giữa 4 nhóm tác nhân: Quản trị viên (Admin), Kiểm duyệt viên (Reviewer), Giảng viên (Instructor/Staff)Khách vãng lai.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng quy trình phát triển phần mềm linh hoạt (Agile Scrum) gồm 4 phân kỳ chính kéo dài 16 tuần:

Giai đoạn (Sprint) Thời lượng Nội dung thực hiện Sản phẩm bàn giao (Deliverables)
Sprint 1: Phân tích & Thiết kế Tuần 1 - 4 Khảo sát quy trình Khoa ATTT, thiết kế ERD, xây dựng Use Case & Activity Diagram. Tài liệu SRS, bản thiết kế CSDL MySQL, tài liệu API Contract.
Sprint 2: Core Backend & Security Tuần 5 - 8 Xây dựng RESTful API với NestJS, tích hợp module Auth, 2FA, Guards, mã hóa AES/Bcrypt. Bộ API hoàn chỉnh đạt chuẩn kiểm thử bảo mật tầng service.
Sprint 3: Frontend & Tích hợp Tuần 9 - 12 Phát triển giao diện Angular SPA, tích hợp API, xử lý Interceptor, Import Excel. Bản dựng ứng dụng Client-Server hoạt động đồng bộ.
Sprint 4: Testing & Hardening Tuần 13 - 16 Kiểm thử hộp đen/trắng, kiểm thử tải (Load Testing), rà quét lỗ hổng OWASP ZAP. Báo cáo kiểm thử UAT, tài liệu chuyển giao kỹ thuật đồ án.

Implementation và kết quả

Quy trình phát triển và hiện thực hóa thuật toán

Hiện thực cơ chế xác thực Token và bảo mật Guard trong NestJS

Hệ thống sử dụng cơ chế NestJS Guard kết hợp Passport để chặn đứng mọi truy cập trái phép ở tầng định tuyến trước khi request đi vào Controller:

// jwt-auth.guard.ts - Bảo vệ endpoint bằng Access Token
import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  canActivate(context: ExecutionContext) {
    return super.canActivate(context);
  }

  handleRequest(err: any, user: any, info: any) {
    if (err || !user) {
      throw err || new UnauthorizedException({
        statusCode: 401,
        message: 'Chuỗi định danh truy cập (JWT) không hợp lệ hoặc đã hết hạn.'
      });
    }
    return user;
  }
}

Xử lý an toàn dữ liệu đầu vào và mã hóa AES-256

Mọi chuỗi dữ liệu đầu vào đều được khử khuẩn mã độc XSS thông qua Custom Pipe và Module mã hóa bảo vệ khóa bí mật OTP:

// crypto.service.ts - Hiện thực mã hóa và giải mã AES-256-CBC
import { Injectable } from '@nestjs/common';
import * as crypto from 'crypto';

@Injectable()
export class CryptoService {
  private readonly algorithm = 'aes-256-cbc';
  private readonly key = Buffer.from(process.env.AES_SECRET_KEY, 'hex'); // 32 bytes key

  encrypt(plainText: string): string {
    const iv = crypto.randomBytes(16);
    const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);
    let encrypted = cipher.update(plainText, 'utf8', 'hex');
    encrypted += cipher.final('hex');
    return `${iv.toString('hex')}:${encrypted}`;
  }

  decrypt(cipherText: string): string {
    const [ivHex, encryptedData] = cipherText.split(':');
    const iv = Buffer.from(ivHex, 'hex');
    const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);
    let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
  }
}

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Kịch bản kiểm thử bảo mật và kết quả

Hệ thống được rà quét toàn diện bằng công cụ OWASP ZAP (Zed Attack Proxy) và các kịch bản kiểm thử xâm nhập thực tế:

  1. SQL Injection (SQLi): Thử nghiệm truyền payload ' OR '1'='1UNION SELECT vào tất cả các trường tìm kiếm và đăng nhập.
    • Kết quả: 100% truy vấn bị vô hiệu hóa nhờ kỹ thuật Parameterized Queries trong mysql2 và ORM mapping.
  2. Cross-Site Scripting (Stored/Reflected XSS): Chèn <script>alert(document.cookie)</script> vào tên đề tài và nhận xét tiến độ.
    • Kết quả: Thư viện sanitize-html loại bỏ hoàn toàn các thẻ script độc hại; Angular render dữ liệu dưới dạng text thuần (data-binding context interpolation).
  3. Brute Force OTP Protection: Nhập sai mã 2FA liên tiếp 3 lần.
    • Kết quả: Hệ thống tự động kích hoạt cờ khóa phiên, chặn toàn bộ yêu cầu xác thực từ thiết bị đó trong vòng 30 phút.

Đo lường hiệu năng chịu tải (Benchmark Data)

Đo lường bằng công cụ Autocannon trên môi trường máy chủ tiêu chuẩn (4 vCPU, 8GB RAM):

  • Tải đồng thời (Concurrency): 100 kết nối song song trong 60 giây.
  • Tổng số request hoàn thành: 32,450 requests.
  • Thông lượng xử lý (Throughput): 540.8 req/sec.
  • Thời gian trễ trung bình (Average Latency): 84.32 ms.
  • Tỷ lệ lỗi (Error Rate): 0.00%.

Đổi mới và đóng góp

  1. Kiến trúc xác thực kép tích hợp cơ chế chống Brute Force thông minh: Khác với các hệ thống quản lý đồ án thông thường chỉ dừng lại ở mật khẩu tĩnh, giải pháp đã tích hợp Time-based OTP (chuẩn RFC 6238 tương thích Google Authenticator/Authy) và kênh Email OTP dự phòng. Hệ thống áp dụng cơ chế tự động khóa định danh thiết bị sau 3 lần thử sai, giảm thiểu 99.9% nguy cơ chiếm quyền tài khoản qua tấn công từ điển.

  2. Cơ chế kiểm toán độc lập theo thời gian thực (Real-time CSV Audit Logging): Mọi hành vi thay đổi trạng thái đề tài, cập nhật điểm, phê duyệt hoặc sửa đổi thông tin người dùng đều được đóng gói thành cấu trúc JSON và đẩy vào tệp kiểm toán CSV độc lập theo ngày. Giải pháp này đảm bảo tính bất biến (immutability) và hỗ trợ công tác truy vết cứu hộ dữ liệu khi có sự cố mà không gây nghẽn I/O trên cơ sở dữ liệu chính.

  3. Thuật toán tự động hóa xếp nhóm hội đồng và phân công phản biện: Tối ưu hóa bài toán phân công hội đồng bảo vệ thông qua 2 chế độ: Ngẫu nhiên (Randomized Fair Allocation) đảm bảo phân bổ đồng đều số lượng đề tài giữa các hội đồng, và Thủ công (Manual Override) cho phép điều chỉnh linh hoạt theo đúng chuyên môn sâu của từng giảng viên.


Ứng dụng thực tế và triển khai

Triển khai thực tế tại Khoa An toàn thông tin - KMA

Hệ thống được thiết kế chuyên biệt để đáp ứng quy mô đào tạo thực tế của Khoa An toàn thông tin, quản lý đồng thời:

  • Hơn 500 sinh viên tốt nghiệp mỗi niên khóa.
  • Hơn 80 giảng viên cơ hữu và thỉnh giảng.
  • Hàng trăm hội đồng bảo vệ thuộc nhiều chuyên ngành hẹp (Mật mã học, An toàn mạng, Kỹ thuật dịch ngược, Điều tra số).

Chiến lược đóng gói và triển khai hệ thống (Deployment Architecture)

Hệ thống sẵn sàng vận hành trên hạ tầng môi trường production thông qua Docker Container và Reverse Proxy:

# Cấu hình Nginx Reverse Proxy & SSL Termination
server {
    listen 443 ssl http2;
    server_name doan.kma.edu.vn;

    ssl_certificate /etc/letsencrypt/live/doan.kma.edu.vn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/doan.kma.edu.vn/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    # Frontend Single Page App
    location / {
        root /var/www/grad-project-client/dist;
        try_files $uri $uri/ /index.html;
    }

    # Backend API Cluster
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Hệ thống lưu trữ tệp tin: Hiện tại hệ thống đang quản lý tệp nộp đồ án dựa trên cấu trúc thư mục máy chủ cục bộ thông qua định danh folder_id, chưa phân tán ra các hạ tầng lưu trữ đối tượng chuyên dụng (Cloud Object Storage).
  • Kiểm soát tính trùng lặp: Chưa có module tự động kiểm tra trùng lặp tên đề tài hoặc đối soát đạo văn nội dung đồ án (Plagiarism Checker).

Lộ trình nâng cấp và mở rộng

  1. Tích hợp Cloud Storage S3 / MinIO: Chuyển đổi toàn bộ cơ chế lưu trữ bản mềm báo cáo và mã nguồn sang giao thức MinIO phân tán, tích hợp tính năng tạo chữ ký điện tử (Digital Signature) xác thực tính toàn vẹn của đồ án.
  2. Module AI hỗ trợ thẩm định đề tài: Ứng dụng kỹ thuật nhúng văn bản (Text Embeddings) và mô hình ngôn ngữ lớn để tự động phát hiện trùng lặp đề tài giữa các khóa và gợi ý giảng viên phản biện phù hợp nhất theo chủ đề nghiên cứu.
  3. Mở rộng Gateway thông báo đa kênh: Tích hợp Webhook đẩy thông báo lịch bảo vệ, nhắc hạn tiến độ qua ứng dụng nhắn tin (Telegram Bot, Zalo ZNS API).

Đối tượng hưởng lợi

  • Sinh viên nghiên cứu: Tiếp cận kho học liệu số hóa chính xác từ các khóa trước, chủ động theo dõi nhận xét đánh giá của giảng viên theo thời gian thực và cập nhật lịch bảo vệ minh bạch.
  • Giảng viên hướng dẫn & Phản biện: Loại bỏ gánh nặng sổ sách giấy tờ, quản lý tập trung toàn bộ sinh viên hướng dẫn, chấm điểm trực quan và nộp nhận xét online có ký xác thực.
  • Cán bộ quản lý đào tạo: Tự động hóa khâu phân công hội đồng, tổng hợp điểm tổng kết đồ án tức thì xuất báo cáo theo mẫu chuẩn của Bộ GD&ĐT chỉ với 1 click chuột.
  • Cộng đồng lập trình viên & Nhà nghiên cứu An toàn thông tin: Tham khảo mô hình kiến trúc sạch (Clean Architecture) với NestJS và Angular, áp dụng bộ giải pháp an ninh ứng dụng toàn diện chống tấn công mạng phổ biến.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Máy chủ cần tối thiểu 2 vCPU, 4GB RAM, 50GB SSD lưu trữ, cài đặt hệ điều hành Ubuntu 20.04/22.04 LTS, Node.js v18 LTS, MySQL v8.0 và Nginx web server.

2. Hệ thống xử lý thế nào khi có nghẽn mạng lúc nộp bài sát hạn chót?

Hệ thống sử dụng cơ chế xử lý bất đồng bộ (Asynchronous I/O) của Node.js kết hợp Connection Pooling của MySQL, cho phép duy trì thông lượng ổn định trên 500 yêu cầu/giây mà không xảy ra tình trạng sập luồng (Deadlock).

3. Làm cách nào để tích hợp hệ thống vào cổng thông tin đào tạo sẵn có của trường?

Hệ thống cung cấp kiến trúc RESTful API hoàn chỉnh với chuẩn tài liệu OpenAPI/Swagger. Toàn bộ dữ liệu người dùng, sinh viên và học kỳ có thể đồng bộ trực tiếp thông qua API hoặc qua các tệp dữ liệu chuẩn hóa Excel/CSV.

4. Cơ chế khôi phục quyền truy cập nếu người dùng mất thiết bị xác thực 2FA?

Quản trị viên hệ thống (Admin) có thẩm quyền xác minh danh tính thủ công và sử dụng module quản trị để cấp mã phục hồi hoặc tạm thời reset phương thức xác thực của người dùng về dạng mặc định.

5. Chi phí duy trì và khả năng hoàn vốn (ROI) của dự án như thế nào?

Hệ thống xây dựng hoàn toàn trên nền tảng mã nguồn mở (NestJS, Angular, MySQL, Linux) nên chi phí bản quyền phần mềm bằng 0. Khả năng hoàn vốn đạt được ngay trong năm đầu tiên nhờ việc cắt giảm 100% chi phí in ấn biểu mẫu, đĩa CD và hàng trăm giờ công tác hành chính.


Kết luận

Đồ án tốt nghiệp "Xây dựng website quản lý đồ án cho Khoa An toàn thông tin" của sinh viên Nghiêm Đình Giang đã giải quyết xuất sắc bài toán nghiệp vụ phức tạp trong quản lý giáo dục đại học. Với sự kết hợp chuẩn mực giữa công nghệ hiện đại (NestJS, Angular, MySQL) và các cơ chế an ninh thông tin đa lớp chuyên sâu (2FA, JWT Rotation, AES-256, Anti-XSS/SQLi), hệ thống đã chứng minh được tính khả thi, hiệu năng cao và giá trị ứng dụng thực tiễn vững chắc trong chuyển đổi số học đường.