Dự đoán về việc bắt đầu tuyển sinh mới cho khóa học
Trong bài viết trước của loạt bài này (
Ý tưởng đằng sau mã hóa phong bì là các khóa được sử dụng để mã hóa (các khóa không gian bảng) được mã hóa bằng một khóa khác (khóa chính). Các khóa không gian bảng thực sự được sử dụng để mã hóa dữ liệu. Về mặt đồ họa, điều này có thể được biểu diễn như sau:
Khóa chính nằm trong kho khóa và các khóa của vùng bảng nằm trong tiêu đề của vùng bảng được mã hóa (trên trang 0 của vùng bảng).
Trong hình trên:
-
Bảng A được mã hóa bằng khóa 1 (Key 1). Khóa 1 được mã hóa bằng khóa chính và được mã hóa lưu trữ trong tiêu đề của bảng A.
-
Bảng B được mã hóa bằng khóa 2 (Key 2). Khóa 2 được mã hóa bằng khóa mặt nạ và được mã hóa lưu trữ trong tiêu đề của bảng B.
-
Và như vậy.
Khi máy chủ cần giải mã bảng A, nó sẽ lấy khóa chính từ cửa hàng, đọc khóa mã hóa 1 từ tiêu đề của bảng A và giải mã khóa 1. Khóa giải mã 1 được lưu trong bộ nhớ của máy chủ và được sử dụng để giải mã bảng A .
InnoDB
Trong InnoDB, việc mã hóa và giải mã thực sự được thực hiện ở cấp độ I/O. Nghĩa là, trang được mã hóa ngay trước khi nó được chuyển sang đĩa và được giải mã ngay sau khi được đọc từ đĩa.
Trong InnoDB, mã hóa chỉ hoạt động ở cấp vùng bảng. Và theo mặc định, tất cả các bảng được tạo trong các không gian bảng riêng biệt (
Nếu vì lý do nào đó bạn đã vô hiệu hóa tệp trên mỗi bảng, thì tất cả các bảng được tạo bên trong không gian bảng hệ thống. TRONG
Trước khi tiếp tục, chúng ta cần xem xét cấu trúc của ID khóa chính. Nó bao gồm UUID, KEYID và tiền tố "INNODBKey". Nó trông như thế này: INNODBKey-UUID-KEYTÔI.
UUID là uuid của máy chủ với không gian bảng được mã hóa. chìa khóaID chỉ là một giá trị ngày càng tăng. Khi bạn lần đầu tạo khóa chính KEYID là 1. Trong khi xoay khóa, khi khóa chính mới được tạo, KEYID = 2, v.v. Chúng ta sẽ nói nhiều hơn về xoay phím chính trong các bài viết sau của loạt bài này.
Bây giờ chúng ta đã biết mã định danh khóa chính trông như thế nào, hãy xem tiêu đề của không gian bảng được mã hóa. Khi một vùng bảng được mã hóa, thông tin mã hóa được thêm vào tiêu đề. Nó trông như thế này:
KEYID là KHÓAID từ ID khóa chính mà chúng ta đã thảo luận. UUID là uuid của máy chủ và cũng được sử dụng trong mã định danh khóa chính. TABLESPACE KEY - khóa không gian bảng, bao gồm 256 bit, do máy chủ tạo ngẫu nhiên. Vectơ khởi tạo (IV, vectơ khởi tạo) cũng bao gồm 256 bit được tạo ngẫu nhiên (mặc dù nó phải là 128 bit). IV được sử dụng để khởi tạo mã hóa và giải mã AES (trong số 256 bit, chỉ có 128 bit được sử dụng). Cuối cùng, có tổng kiểm tra CRC32 cho TABLESPACE KEY và IV.
Lúc này tôi đã đơn giản hóa một chút bằng cách nói rằng có một khóa không gian bảng được mã hóa trong tiêu đề. Trên thực tế, khóa vùng bảng và vectơ khởi tạo được lưu trữ và mã hóa cùng nhau bằng khóa chính. Hãy nhớ rằng trước khi khóa vùng bảng và vectơ khởi tạo được mã hóa, CRC32 được tính toán cho chúng.
Tại sao cần CRC32?
Tóm lại, để đảm bảo khóa chính hợp lệ. Sau khi giải mã khóa vùng bảng và vectơ khởi tạo, tổng kiểm tra được tính toán và so sánh với CRC32 được lưu trữ trong tiêu đề. Nếu tổng kiểm tra khớp, thì chúng ta có khóa chính và khóa không gian bảng chính xác. Mặt khác, không gian bảng được đánh dấu là bị thiếu (chúng tôi vẫn không thể giải mã nó).
Bạn có thể hỏi: việc xác minh khóa được thực hiện vào thời điểm nào? Câu trả lời là khi máy chủ khởi động. Máy chủ có bảng/không gian bảng được mã hóa đọc UUID, KEY khi khởi độngID từ tiêu đề và tạo ID khóa chính. Sau đó, nó lấy khóa chính được yêu cầu từ khóa, giải mã khóa vùng bảng và xác minh tổng kiểm tra. Một lần nữa, nếu tổng kiểm tra khớp, thì mọi thứ đều theo thứ tự, không - không gian bảng được đánh dấu là bị thiếu.
Nếu bạn đọc bài viết cuối cùng trong loạt bài này (
Đã đến lúc nói một chút về những ưu điểm và nhược điểm của việc mã hóa bằng khóa chính. Ưu điểm lớn nhất là bạn chỉ cần một khóa mã hóa (khóa chính), khóa này sẽ được tách biệt khỏi dữ liệu được mã hóa của bạn. Điều này giúp máy chủ khởi động nhanh và dung lượng lưu trữ nhỏ, giúp dễ dàng quản lý. Và cũng là khóa chính duy nhất dễ dàng tạo lại.
Tuy nhiên, mã hóa khóa chính có một nhược điểm lớn: một khi vùng bảng được mã hóa bằng tablespace_key, nó sẽ luôn được mã hóa bằng cùng một khóa. Xoay phím chính không giúp được gì ở đây. Tại sao đây là một bất lợi? Chúng tôi biết rằng MySQL có các lỗi có thể khiến nó bị sập và tạo tệp lõi. Vì tệp lõi chứa kết xuất bộ nhớ máy chủ nên có thể xảy ra trường hợp kết xuất chứa khóa không gian bảng được giải mã. Tệ hơn nữa, các khóa không gian bảng được giải mã được lưu trữ trong bộ nhớ, có thể được hoán đổi vào đĩa. Bạn có thể nói rằng đây không phải là bất lợi vì bạn cần có quyền root để truy cập các tệp này và phân vùng trao đổi. Đúng. Nhưng root chỉ cần thiết trong một thời gian. Sau khi ai đó có quyền truy cập vào khóa vùng bảng được giải mã, họ có thể tiếp tục sử dụng nó để giải mã dữ liệu, ngay cả khi không có quyền truy cập root. Ngoài ra, đĩa có thể bị đánh cắp và các tệp hoán đổi / lõi có thể được đọc bằng các công cụ của bên thứ ba. Mục tiêu của TDE là làm cho nó không thể đọc được ngay cả khi đĩa bị đánh cắp. TRONG
Đọc thêm:
Nguồn: www.habr.com