Encryption là tính năng mới được giới thiệu trong Rails 7, cho phép mã hóa các trường cơ sở dữ liệu. Điều này giúp bảo vệ thông tin nhạy cảm trong ứng dụng của bạn.
Để sử dụng tính năng này, bạn có thể sử dụng phương thức encrypts
của ActiveRecord để đánh dấu các trường cần được mã hóa. Sau đó, ActiveRecord sẽ tự động mã hóa và giải mã các trường này khi cần thiết.
1. Setup
Vì đã được tích hợp vào Rails 7 bạn chỉ cần chạy bin/rails db:encryption:init
để tạo ra random key, ví dụ:
active_record_encryption:
primary_key: EGY8WhulUOXixybod7ZWwMIL68R9o5kC
deterministic_key: aPA5XyALhf75NNnMzaspW7akTfZp0lPY
key_derivation_salt: xEY0dt6TZcAMg52K7O84wYzkjvbA62Hz
copy và paste vào trong Rails credentials của dự án
2. Cách khai báo và truy vấn
class User < ApplicationRecord
encrypts :email
end
ActiveRecord sẽ tự động encrypt và decrypt trường email
khi bạn lưu hoặc truy xuất các bản ghi từ cơ sở dữ liệu. Ví dụ:
Khi tạo mới:
user = User.create email: "[email protected]"
SQL sẽ được thực thi như thế này
INSERT INTO `users` (`email`) VALUES ('{\"p\":\"n7J0/ol+a7DRMeaE\",\"h\":{\"iv\":\"DXZMDWUKfp3bg/Yu\",\"at\":\"X1/YjMHbHD4talgF9dt61A==\"}}')
- p: là payload, thông tin email đã được mã hoá
- h: là một Hash của headers chứa thông tin liên quan đến hoạt động mã hóa.
- iv: là vector khởi tạo đoạn text đã được mã hóa
- at: là một auth_tag sẽ được sử dụng trong quá trình giải mã để xác minh rằng văn bản đã được mã hóa không bị thay đổi
Khi đọc data:
Khi chúng ta thực hiện truy vấn vào User để lấy giá trị email được mã hoá thì Rail sẽ tự động decrypt giá trị email đã được mã hoá trước đó
user.email # => "[email protected]"
Như bạn có thể thấy, giá trị được mã hóa được tự động dịch sang thuộc tính có thể đọc được như trên.
Khi tìm kiếm:
Chúng ta cũng thực hiện truy vấn tìm kiếm như bình thường
user = User.find_by!(email: "[email protected]")
Trong SQL sẽ thực thi như thế này
User Load (2.1ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "{\"p\":\"oVgEJvRaX6DJvA==\",\"h\":{\"iv\":\"WYypcKysgBY05Tum\",\"at\":\"OaBswq+wyriuRQO8yCVD3w==\"}}"], ["LIMIT", 1]]
=> #<User id: 1, email: "[email protected]", created_at: "2021-05-28 22:41:23.142635000 +0000", updated_at: "2021-05-28 22:41:23.142635000 +0000">
3. Các kiểu Encrypt
Deterministic Encryption:
- Đặc điểm:
- Khi bạn sử dụng deterministic encryption, cùng một dữ liệu đầu vào sẽ luôn cho ra cùng một đầu ra mã hóa. Điều này có nghĩa là không có sự ngẫu nhiên được áp dụng trong quá trình mã hóa.
- Mục đích chính là để hỗ trợ việc tìm kiếm và so sánh trực tiếp giữa các giá trị đã được mã hóa.
- Ví dụ:
- Giả sử bạn có một cột
name
trong bảng User. Nếu bạn sử dụng deterministic encryption, hai bản ghiname
có cùng giá trị sẽ được mã hóa thành cùng một giá trị mã hóa, giúp cho việc tìm kiếm nhanh chóng và so sánh dữ liệu.
- Giả sử bạn có một cột
Non-deterministic Encryption:
- Đặc điểm:
- Ngược lại với deterministic encryption, non-deterministic encryption sử dụng yếu tố ngẫu nhiên trong quá trình mã hóa. Kết quả là cùng một đầu vào sẽ cho ra các đầu ra mã hóa khác nhau mỗi lần mã hóa.
- Ví dụ:
- Nếu bạn có một cột chứa thông tin nhạy cảm và bạn muốn mỗi lần mã hóa tạo ra một giá trị khác nhau, bạn có thể sử dụng non-deterministic encryption. Điều này giúp ngăn chặn việc xác định giá trị ban đầu thông qua việc so sánh các giá trị mã hóa.
4. Ưu nhược điểm
Ưu điểm:
- Bảo vệ thông tin nhạy cảm trong cơ sở dữ liệu của bạn khỏi truy cập trái phép.
- Giúp đáp ứng các yêu cầu về bảo mật dữ liệu của các quy định như GDPR hoặc IT-Sicherheitsgesetz.
- Cung cấp một cách dễ dàng để mã hóa và giải mã các trường cơ sở dữ liệu.
Nhược điểm:
- Chức năng tìm kiếm mà mã hóa cung cấp yêu cầu một kết quả chính xác về văn bản tìm kiếm. Điều này có nghĩa là việc thực hiện truy vấn LIKE, sẽ không hoạt động.
- Trong Rails Console vẫn sẽ hiển thị data đã được mã hoá.:c
- Chúng ta có thể encrypt với rich text, nhưng chỉ thực hiện bằng non-deterministically encryption, đồng nghĩa với việc chúng ta không thể tìm kiếm rich text
Trên đây là giới thiệu về Encrypt được tích hợp vào rails 7, hi vọng có thể giúp ích cho mọi người. Cảm ơn mọi người.
1 comment
Zaproxy dolore alias impedit expedita quisquam.