RDS MySQL全密態資料庫能夠對資料庫查詢結果中的資料進行加密和脫敏保護,任何非授權人員均無法查看被保護資料明文內容。本文介紹如何通過全密態用戶端驅動EncJDBC快速使用並驗證RDS MySQL全密態資料庫功能。
前提條件
RDS MySQL執行個體的大版本為MySQL 5.7或MySQL 8.0,且核心小版本必須大於或等於20240731。
核心小版本較低時,請升級核心小版本。
注意事項
請妥善儲存您設定的主要金鑰
MEK。Java版本需要在1.8及以上。
說明本文中使用的Maven版本為
3.9.5,使用的開發工具為IntelliJ IDEA Community Edition 2023.2.4。
操作步驟
步驟一: 建立執行個體、資料庫及帳號
購買符合本文前提條件的RDS MySQL執行個體,建立方法請參見建立RDS MySQL執行個體、RDS MySQL標準版(原X86)主執行個體規格列表、RDS MySQL倚天版(原ARM)主執行個體規格列表。
說明如果您已購執行個體已滿足本文前提條件中的要求,則無需新購執行個體。
建立資料庫高許可權帳號,建立方法請參見建立帳號。
建立資料庫,詳情請參見管理資料庫。
步驟二: 開啟全密態功能
訪問RDS執行個體列表,在上方選擇地區,單擊剛剛建立的執行個體ID。
開通全密態功能。
警告開通全密態功能會導致執行個體重啟,請在業務低峰期操作。
在左側導覽列,單擊參數設定,在可修改參數頁簽,搜尋loose_encdb,將該參數值設定為ON,單擊提交參數並選擇生效時間後,單擊確定。
步驟三: 配置資料保護規則
開通全密態功能以及配置資料保護規則的帳號必須是高許可權帳號。應用程式資料庫角色建議設為普通許可權,不具備管理員權限,且不建議賦予應用程式資料庫角色高許可權。
確定被保護欄位
使用者基於業務實際需要,確定哪些資料屬於被保護資料。本文樣本中,將通訊錄中的部門名稱(
department.name)、員工姓名(users.name)和ID(users.id)確定為被保護資料。資料庫表結構如下:說明建表之前需要先執行
CREATE DATABASE contact;建立contact資料庫。-- 部門表 CREATE TABLE department (id INTEGER PRIMARY KEY AUTO_INCREMENT, dept_id BIGINT, name TEXT, parentId BIGINT, createDeptGroup BOOL, autoAddUser BOOL, UNIQUE(dept_id)); -- 使用者表 CREATE TABLE users (id varchar(255) PRIMARY KEY, dept_id BIGINT, name TEXT, avatar TEXT); -- 寫入測試資料 INSERT INTO department(dept_id, name, parentId, createDeptGroup, autoAddUser) VALUES (202301,'dept1',202301,true,true), (202302,'dept2',202301,true,true), (202303,'dept3',202301,true,false); INSERT INTO users VALUES ('110110181103233433', 202301, 'user1', 'director'), ('350110180103038669', 202302, 'user2', 'dept2_user'), ('220110182203032387', 202302, 'user3', 'dept2_user'), ('410110182209237752', 202303, 'user4', 'dept3_user'), ('310140181210228325', 202303, 'user5', 'dept3_user');配置規則
基於選定的被保護資料,按照資料保護規則格式,編輯規則內容,並通過SQL UDF下發規則。更多規則格式介紹請參見資料保護規則簡介。
SELECT encdb_rule_op('add', '[{ "name": "rule-for-contact-name", "enabled": true, "meta": { "databases": ["contact"], "tables": ["department","users"], "columns": ["name"] } }, { "name": "rule-for-contact-id", "enabled": true, "meta": { "databases": ["contact"], "tables": ["users"], "columns": ["id"] } }]');其中,
rule-for-contact-name同時標記了部門名稱(department.name)以及員工姓名(users.name),rule-for-contact-id標記了員工ID(users.id)。授權使用者訪問
若希望資料庫使用者在應用用戶端側能夠訪問解密後的明文結果,需要為其授予受限存取權限(
restrictedAccess)。更多授權資訊,請參見通過SQL配置列加密規則。執行如下命令,授權應用程式資料庫角色受限存取權限:
SELECT encdb_rule_op('grant','{"restrictedAccess": ["appuser"]}');說明appuser為應用程式資料庫角色。
步驟四: 用戶端接入改造
全密態資料庫提供了配套的資料庫連接驅動,無需修改業務代碼,應用用戶端側僅需進行如下兩步配置,就能夠無感訪問全密態資料庫。本步驟以EncJDBC接入為例進行說明:
將資料庫連接驅動替換成
EncJDBC。更新資料庫連接URL,指定使用者密鑰
MEK以及密碼編譯演算法ENC_ALGO。
以Java語言為例,僅需如下兩處配置修改即可:
// 準備好網域名稱(hostname)、連接埠(port)、資料庫執行個體名(dbname)、使用者名稱(username)、密碼(password)等串連資訊
// ...
String mek="00112233445566778899aabbccddeeff";
String encAlgo="SM4_128_CTR";
// 1. 將資料庫連接驅動替換成EncJDBC
Class.forName("com.aliyun.encdb.mysql.jdbc.EncDriver");
// 2. 更新資料庫連接URL,指定使用者密鑰MEK以及密碼編譯演算法ENC_ALGO
String dbUrl = String.format("jdbc:mysql:encdb://%s:%s/%s?MEK=%s&ENC_ALGO=%s", hostname, port, dbname, mek, encAlgo);
java.sql.Connection connection = java.sql.DriverManager.getConnection(dbUrl, username, password);
// ... 發起查詢 ...更多用戶端EncJDBC接入配置請參見EncJDBC。
步驟五: 功能驗證
可以在命令列工具或者DMS控制台上,執行SQL命令驗證資料是否被加密保護:
執行如下命令查詢通訊錄指定的部門資訊:
SELECT * FROM contact.department WHERE dept_id = 202302;查詢結果如下:

執行如下命令查詢通訊錄指定部門的員工資訊:
SELECT * FROM contact.users WHERE dept_id = 202302;查詢結果如下:

執行如下命令模糊查詢通訊錄員工資訊:
SELECT * FROM contact.users WHERE name LIKE '%1';查詢結果如下:

從全密態資料庫中查詢的結果顯示,所有被保護資料均被加密保護。