Giới thiệu
Encryption (mã hóa) trong web development giống như việc gửi một bí mật nhưng khóa lại trong hộp chỉ người nhận mới mở được. Nó biến dữ liệu thành ciphertext (văn bản mã hóa), khiến kẻ chặn giữa đường không thể đọc được.
Đây không chỉ là lý thuyết: năm 2024, IBM báo cáo chi phí trung bình của một vụ rò rỉ dữ liệu là hơn 4,9 triệu USD, và một trong những sai lầm lớn nhất chính là không mã hóa thông tin nhạy cảm.
Vì vậy, với bất kỳ hệ thống nào như đăng nhập, cửa hàng online, hay ứng dụng nhắn tin, mã hóa là điều bắt buộc chứ không chỉ là tùy chọn. Hiểu rõ cần mã hóa gì, cách mã hóa đúng, và các lỗi thường gặp sẽ giúp bảo vệ người dùng, ứng dụng, và uy tín của bạn.
Dữ liệu nào cần được mã hóa?
Không phải tất cả dữ liệu đều giống nhau. Một số loại dữ liệu đặc biệt nhạy cảm và luôn phải được mã hóa để bảo vệ người dùng cũng như ứng dụng của bạn, bao gồm:
- Thông tin đăng nhập người dùng (ví dụ: mật khẩu)
- Thông tin thanh toán (số thẻ tín dụng, chi tiết hóa đơn)
- Thông tin cá nhân định danh (họ tên, địa chỉ, số điện thoại)
- Logic kinh doanh nội bộ hoặc API keys
- Các tệp tin và dữ liệu tải lên
Việc mã hóa đảm bảo rằng ngay cả khi dữ liệu bị chặn hoặc đánh cắp, nó cũng vô dụng nếu không có khóa giải mã.
Có nên mã hóa mật khẩu không? Thực ra là KHÔNG!
Một sai lầm phổ biến là nghĩ rằng mật khẩu nên được mã hóa. Trên thực tế, mật khẩu không nên được mã hóa, mà phải được băm (hashing).
Mã hóa (Encryption)
- Định nghĩa: Có thể đảo ngược. Bạn mã hóa dữ liệu, và có thể giải mã lại nếu có khóa.
- Ví dụ: Bạn mã hóa tin nhắn để người nhận có thể đọc sau này.
Băm (Hashing)
- Định nghĩa: Một chiều, không thể đảo ngược. Khi dữ liệu đã được băm, bạn không thể lấy lại bản gốc.
- Ví dụ: Bạn băm mật khẩu để ngay cả lập trình viên hay quản trị hệ thống cũng không biết được mật khẩu thật.
Với mật khẩu, bạn không bao giờ được phép truy xuất lại giá trị gốc. Khi người dùng đăng nhập, hệ thống sẽ băm mật khẩu nhập vào rồi so sánh với giá trị băm đã lưu trong cơ sở dữ liệu.
👉 Tại sao quan trọng?
- Nếu bạn mã hóa mật khẩu và hacker có được khóa giải mã, họ sẽ lấy toàn bộ mật khẩu người dùng.
- Nếu bạn băm mật khẩu bằng thuật toán an toàn như
bcrypt,scrypthoặcArgon2, kèm theo salt (giá trị ngẫu nhiên thêm vào trước khi băm), việc khôi phục mật khẩu gốc gần như bất khả thi, ngay cả khi hacker lấy được database.
Mã hóa khi truyền tải và khi lưu trữ
Bảo mật dữ liệu không chỉ nằm ở loại dữ liệu mà còn ở thời điểm và vị trí dữ liệu tồn tại.
- Mã hóa khi truyền tải (Encryption in Transit): Bảo vệ dữ liệu trong quá trình truyền qua internet (ví dụ: khi người dùng gửi form).
- Mã hóa khi lưu trữ (Encryption at Rest): Bảo vệ dữ liệu khi nó nằm trong máy chủ hoặc cơ sở dữ liệu.
Cả hai đều cực kỳ quan trọng để ngăn chặn nghe lén, tấn công “man-in-the-middle” và truy cập trái phép.
Tóm lại
- Mã hóa cho dữ liệu nhạy cảm cần bảo toàn tính toàn vẹn.
- Băm cho mật khẩu để loại bỏ rủi ro lộ thông tin gốc.
- Luôn kết hợp mã hóa khi truyền tải và lưu trữ để đảm bảo hệ thống an toàn tối đa.
Tham khảo
Bài viết này được biên soạn lại từ khóa học Encryption Basics for Web Developers tại liên kết: https://trainingportal.linuxfoundation.org/courses/encryption-basics-for-web-developers