Bạn đã vấp phải sự cố lớn nhất với việc mã hóa dữ liệu trong cơ sở dữ liệu:
➽ Cất chìa khóa ở đâu?
Mã hóa không thể giải quyết vấn đề bảo mật dữ liệu, nó chỉ có thể "tập trung" nó vào một khóa. Bất cứ nơi nào bạn lưu trữ khóa, ứng dụng của bạn phải có khả năng giải mã dữ liệu, do đó kẻ tấn công có thể thực hiện được. Có hai giải pháp khả thi cho vấn đề này mà tôi biết:
- Đặt chìa khóa ở nơi an toàn nhất có thể. Điều đó có nghĩa là, nó chắc chắn phải được đặt bên ngoài thư mục gốc www trong một thư mục không thể truy cập được trên máy chủ. Tùy thuộc vào mức độ quan trọng của dữ liệu, bạn cũng có thể cân nhắc việc thuê ngoài mã hóa cho một máy chủ chuyên dụng khác.
- Hoàn toàn không lưu trữ khóa và lấy nó từ mật khẩu người dùng. Đây là cách duy nhất thực sự an toàn, vì ngay cả máy chủ cũng không thể giải mã dữ liệu khi đó. Tất nhiên, khuyết điểm là người dùng cần nhập mật khẩu mỗi khi sử dụng dịch vụ của bạn. Nếu người dùng thay đổi mật khẩu, bạn cần mã hóa lại tất cả dữ liệu. Nếu người dùng quên mật khẩu, dữ liệu sẽ bị mất.
P.S. Tôi khuyên bạn nên mã hóa dữ liệu trước đó lưu trữ nó vào cơ sở dữ liệu, vì MySQL AES_ENCRYPT sử dụng chế độ ECB mà không có IV. Điều này cho phép tìm kiếm một giá trị nhất định, nhưng kém an toàn hơn (tôi khá chắc rằng bạn không muốn tìm kiếm bằng mật khẩu).