Khi các cuộc tấn công mạng và vi phạm dữ liêu trở nên phổ biến, vấn đề bảo mật dữ liệu đã trở thành trọng tâm trong các ứng dụng có lưu trữ dữ liệu người dùng. Bảo mật như thế nào để mang lại hiệu quả tốt nhất là bài toán mà các chuyên gia IT mong muốn giải được.
Khách hàng của chúng tôi đang triển khai một hệ thống quản lý việc mua và bán thuốc giữa bệnh nhân và hiệu thuốc. Với hệ thống này thông tin cá nhân của bệnh nhân sẽ phải lưu trữ để hiệu thuốc có thể xem được, cũng như bệnh nhân có thể dùng cho những lần order sau. Vì vậy bài toán đặt ra là làm thế nào bảo mật dữ liệu cá nhân của bệnh nhân để:
– Chỉ có bệnh nhân mới có thể xem được dữ liệu của mình.
– Hiệu thuốc có thể xem được dữ liệu cá nhân của bệnh nhân đã mua thuốc của họ.
– Không ai xem được dữ liệu này kể cả quản trị hệ thống.
Giải quyết bài toán này chúng tôi nghĩ đến 2 giải pháp.
Giải pháp 1: Mã hoá toàn bộ thông tin cá nhân của bệnh nhân bằng một key duy nhất (tạm gọi là server key) bằng thuật toán AES (Advanced Encryption Standard).
- Ưu điểm: Đơn giản, dễ triển khai
- Nhược điểm: Độ bảo mật không cao, do key duy nhất sẽ được lưu trên server, nếu ai đó (có thể là quản trị viên) biết được key này có thể giải mã được toàn bộ thông tin của bệnh nhân.
Giải pháp 2: Sử dụng kết hợp giữa AES (Mã hoá đối xứng) và RSA (mã hoá bất đối xứng).
Mỗi bệnh nhân, hiệu thuốc sẽ được cung cấp 4 keys bao gồm key dùng để mã hoá dữ liệu (tạm gọi là vKey), cặp public/private key dùng để mã hoá vKey, Recovery key dùng trong trường hợp bệnh nhân/ hiệu thuốc quên mật khẩu.
Với giải pháp này, thông tin cá nhân của bệnh nhân sẽ được mã hoá bằng vKey sử dụng thuật toán mã hoá đối xứng AES, vKey sau đó được mã hoá bằng public key của bệnh nhân và public key của hiệu thuốc (vKey được chia sẻ cho hiệu thuốc mà bệnh nhân mua thuốc để hiệu thuốc có thể đọc được dữ liệu của bệnh nhân), private key sẽ được bảo mật bằng password của bệnh nhân/ hiệu thuốc bằng thuật toán mã hoá đối xứng AES.
Tại sao phải kết hợp hai thuật toán mã hoá này? Bởi vì RSA chỉ mã hoá được dữ liệu có kích thước tối đa là ((KeySize – 384)/8) + 37 byte, nên chỉ sử dụng RSA sẽ không thể mã hoá được thông tin của bệnh nhân ví dụ như đơn thuốc do kích thước lớn hơn rất nhiều.
- Ưu điểm: Độ bảo mật cao, đáp ứng yêu cầu của khách hàng chỉ có bệnh nhân và hiệu thuốc mà bệnh nhân đó mua thuốc xem được thông tin.
- Nhược điểm: Khó triển khai hơn, khi bệnh nhân quên mật khẩu và mất luôn cả recovery key thì sẽ không lấy lại được dữ liệu đã bị mã hoá.
Với yêu cầu của khách hàng thì giải pháp thứ 2 là giải pháp tối ưu nhất, do vậy trong khuôn khổ bài viết này chúng tôi sẽ giới thiệu chi tiết về giải pháp thứ 2.
Bây giờ hãy cùng xem luồng dữ liệu liên quan đến thông tin cá nhân của bệnh nhân trong hệ thống.
1. Bệnh nhân đăng kí tài khoản hệ thống, thông tin cá nhân của bệnh nhân sẽ được điền ở bước này, thông tin cá nhân bao gồm tên, tuổi, giới tính, địa chỉ, ngày tháng năm sinh, số điện thoại, mã số bảo hiểm.
2, Bệnh nhân đăng kí mua thuốc của hiệu thuốc bất kì trên hệ thống, thông tin cá nhân của bệnh nhân sẽ được chia sẻ cho hiệu thuốc, thông tin cá nhân lúc này sẽ có thêm đơn thuốc.
3. Bệnh nhân xem thông tin cá nhân, thay đổi thông tin cá nhân của mình
4. Hiệu thuốc xem thông tin của bênh nhân, xem đơn thuốc để bốc thuốc cho bệnh nhân.
Như vậy thông tin sẽ được mã hoá ở 1 và 2, sau đó được giải mã ở 3 và 4. Vì việc mã hoá và giải mã có thể ảnh hưởng đến performance của hệ thống nếu có quá nhiều yêu cầu mã hoá hoặc giải mã cùng lúc đến server, vì vậy chúng tôi đưa việc mã hoá và giải mã xuống thực hiện ở Client (Device của bệnh nhân và hiệu thuốc).
Biểu đồ sau sẽ mô tả cách chúng tôi mã hoá dữ liệu bệnh nhân khi họ đăng kí tài khoản hệ thống.
Bước 1: Từ thiết bị của mình, bệnh nhân sẽ request đăng ký tài khoản lên hệ thống server, server trả về form đăng ký tài khoản mới.
Bước 2: Bệnh nhân điền form đăng ký tài khoản mới, đồng thời ứng dụng được xây dựng trên thiết bị của bệnh nhân sẽ tự động khởi tạo 4 keys bao gồm vKey, public/private key, recover key.
Bước 3: Dữ liệu bệnh nhân sẽ được mã hoá, sau đó gửi toàn bộ dữ liệu đã mã hoá này lên server lưu lại.
Khi khách hàng đặt mua thuốc dữ liệu đơn thuốc sẽ được mã hoá, và vKey được chia sẻ cho hiệu thuốc mà bệnh nhân đó đặt mua để hiệu thuốc có thể xem được đơn thuốc và thông tin của bệnh nhân.
Bước 1: Bệnh nhân gửi yêu cầu đặt mua thuốc tới hệ thống, hệ thống trả về mẫu đăng kí đặt mua thuốc và danh sách các hiệu thuốc mà bệnh nhân có thể đặt mua.
Bước 2: Dựa vào mật khẩu của bệnh nhân được lưu trên thiết bị của bệnh nhân, private key của bệnh nhân sẽ được giải mã bằng password, với private key đã được giải mã sẽ dùng để giải mã vKey. Ở bước này bệnh nhân chọn hiệu thuốc mình muốn mua thuốc và tải dữ liệu đơn thuốc lên.
Bước 3: Dữ liệu đơn thuốc sẽ được mã hoá bằng vKey của bệnh nhân. vKey cũng sẽ được mã hoá lại bằng public key của hiệu thuốc và private key của bệnh nhân cho mục đích chia sẻ khả năng xem dữ liệu bệnh nhân với hiệu thuốc. Toàn bộ thông tin sau khi được mã hoá sẽ gửi lên hệ thống.
Hiệu thuốc sẽ nhận được thông báo khi có đơn hàng mới, nhân viên của hiệu thuốc sẽ vào kiểm tra xem bệnh nhân đặt mua thuốc gì. Lúc này dữ liệu đơn thuốc và dữ liệu cá nhân của bênh nhân sẽ được giải mã để hiệu thuốc có thể xem được.
Bệnh nhân muốn xem hoặc sửa thông tin cá nhân của mình, để thực hiện việc này dữ liệu mã hoá sẽ được trả về cho device của bệnh nhân, dữ liệu sẽ được giải mã trên máy của bệnh nhân, sau đó bệnh nhân có thể thao tác trên dữ liệu của mình. Sau khi thao tác thay đổi hoàn thành dữ liệu được mã hoá lại và gửi lên server để lưu trữ.
Nếu bệnh nhân hoặc hiệu thuốc quên mật khẩu, làm thế nào để họ có thể xem lại dữ liệu đã bị mã hoá? khi mà để giải mã được private key họ phải dùng đến password. Giải quyết bài toán này chúng tôi cấp thêm cho khách hàng một mã recover key duy nhất, khi mất mật khẩu người dùng sẽ sử dụng recovery key để giải mã lấy private key, sau đó sử dụng mật khẩu mới để mã hoá private key và lưu lại trên hệ thống.
Tổng kết: Mã hoá dữ liêu là bài toán thú vị, sẽ có rất nhiều cách khác nhau để giải quyết vấn đề bảo mật dữ liệu. Tuy nhiên sự thành bại của một ứng dụng ngày nay phụ thuộc rất nhiều vào khả năng các bạn bảo mật dữ liệu của khách hàng. Nếu bạn không có chiến lược bảo vệ dữ liệu khách hàng, ứng dụng của bạn có thể sụp đổ bất cứ lúc nào nếu một ngày đẹp trời dữ liệu khách hàng của bạn bị leak ra ngoài.
Bài viết rất hay và bổ ích. Cám ơn anh