PolarDB支援為指定列進行加密儲存,並且訪問資料時,可使用解密函數擷取未經處理資料,提高您的資料安全性。
列加密功能當前處於灰階發布階段,相關參數暫時不可見。如有需求,請前往配額中心,根據配額ID polardb_mysql_column_encryption找到配額名稱,在對應的操作列單擊申請來開通該功能。
版本要求
目前僅支援PolarDB MySQL版8.0.2版本且小版本為8.0.2.2.30及以上。
背景資訊
在舊版本中,PolarDB MySQL版通過加密函數 (aes_encrypt) 等實現欄位層級的資料加密。然而,使用加密函數需要用戶端管理密鑰、輪轉密鑰以及存取權限控制等。為此,PolarDB MySQL版列加密功能將這些操作整合到資料庫服務端。您只需為需要加密的列設定加密屬性,即可實現上述功能。此外,列加密通過Online DDL實現了非阻塞的密鑰輪轉。
注意事項
效能損耗
寫效能
使用列加密功能會造成效能損耗,在關閉Binlog,單線程插入時會產生約3%的效能損耗。值得注意是,當開啟Binlog或表結構具有較大行寬時,由於系統I/O模式和資源分派的變化,損耗會更低。
讀效能:
讀效能損耗取決於是否在查詢語句中使用解密函數,單個SQL語句中使用一次解密函數的效能影響在6%左右。
索引使用
僅支援單點查詢使用索引結構實現高效檢索,而範圍查詢(Range Query)(如WHERE age>20)、模式比對查詢(如LIKE '%key%')等操作不支援使用索引但可使用全表掃描(Full Table Scan)。
表屬性限制
不支援對含有虛擬列的表加密。
僅支援儲存引擎為InnoDB的表。
不支援分區表。
指定加密屬性的列必須是
varbinary類型。欄位的長度不低於44 Byte(位元組)。
暫時無法直接新增加密列,必須通過修改普通列完成。
使用說明
列加密與TDE功能共同使用KMS(Key Management Service)進行密鑰管理。
1. 文法說明(許可權控制、DDL、DML)
許可權控制
使用列加密功能需要您的資料庫帳號具備ENCRYPTION_FUN_ADMIN許可權,可以由高許可權帳號授予。
許可權授予:GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
許可權查看:SHOW GRANTS;DDL
建立加密列
通過關鍵字ENCRYPTION指定加密列。
指定pan列為加密列。
USE mydatabase; CREATE TABLE IF NOT EXISTS `my_pan` ( `id` INT NOT NULL AUTO_INCREMENT, `pan` VARBINARY(128) NOT NULL ENCRYPTION, `desc` blob Default NULL, KEY `idx_pan` (`pan`), PRIMARY KEY (`id`) );說明可以建立預設值為NULL的加密列,但NULL值不加密。
可以通過Modify語句將普通列修改為加密列或者把加密列修改為普通列。
ALTER TABLE my_pan modify `pan` VARBINARY(128) ENCRYPTION; ALTER TABLE my_pan modify `pan` VARBINARY(128) NOT ENCRYPTION;說明暫不支援直接新增加密列,必須通過Modify語句修改普通列完成。
構建索引
加密列也可以構建索引,文法不變,例如:
CREATE index idx_pan ON my_pan(pan);索引上資料為加密資料,索引本身按照加密值的順序排序。
DML
以下是對兩個加密解密函數說明:
-- 加密函數
enhanced_aes_encrypt(data, db_name, table_name)
-- 解密函數
enhanced_aes_decrypt(data)插入資料
向加密列插入資料將直接加密,無需使用加密函數enhanced_aes_encrypt。
INSERT INTO `my_pan` VALUES(1,"my_passwd", "aaa");查詢
# 1. 無索引點查(範圍查詢)
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE enhanced_aes_decrypt(pan) = 'my_password_10';
# 2. select使用索引點查,查出後的資料為明文
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
# 3. select使用索引點查,查出後的資料為密文
SELECT id, pan FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");更新資料
# 通過主鍵索引更新資料
UPDATE `my_pan` SET pan='new6-password', DESC='Senior6' WHERE id = 1;
# 通過加密列索引更新資料
UPDATE `my_pan` SET pan='new6-password', DESC='Senior6' WHERE pan=enhanced_aes_encrypt('my_password_6', "mydatabase", "my_pan");刪除資料
# 通過主鍵索引刪除資料
DELETE FROM `my_pan` WHERE id = 1;
# 通過加密列索引刪除資料
DELETE FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_2', "mydatabase", "my_pan");2.密鑰管理
開啟TDE功能。
重要啟用TDE加密會導致PolarDB叢集重啟,請謹慎操作。
TDE開通後將無法關閉。
開啟TDE功能本身不會對非TDE表或非列加密表引入額外的效能損耗。
登入PolarDB控制台,在左側導覽列單擊集群列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。
在左側導覽列單擊配置与管理 > 安全管理。
在TDE配置頁簽,開啟TDE状态開關,並使用自訂密鑰。
說明在KMS執行密鑰刪除操作前,必須確認該密鑰已解除所有加密表關聯依賴關係(包括歷史版本關聯)。否則,可能造成PolarDB叢集重啟後不可用。

選擇密鑰。您可選擇使用服务密钥(阿里云自动生成)或使用已有自定义密钥。

(可選)密鑰輪轉。
說明PolarDB並不會更新自訂密鑰的主要金鑰版本,您可以手動更新密鑰版本,具體操作請參考密鑰輪轉。
密鑰輪轉後,建立加密表會採用新的密鑰進行加密,原有加密表中的資料不發生任何變化仍保持原祕密金鑰加密。
資料輪轉是將表中資料解密後再用最新版本密鑰進行加密,因此需注意其會消耗一定的CPU、IO資源。資料輪轉並不是強制的,但是需要保證資料表所用密鑰的可用性。
資料輪轉是否鎖表:
未開啟Online Copy功能,資料輪轉過程中會鎖表。
開啟Online Copy DDL功能,資料輪轉過程不會發生鎖表,允許DML並發執行,不允許DDL並發執行。
對於原加密表,如果需要採用新祕密金鑰加密,需要您自行下發資料輪轉指令,指令如下:
ALTER TABLE <table_name> engine = innodb,algorithm=copy;查詢表密鑰。
可以通過如下的SQL查詢系統中所有加密表的密鑰使用方式。
SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;
3. 參數設定
通過loose_polar_enable_column_encryption參數開啟列加密功能,具體操作請參見設定叢集參數和節點參數。參數說明如下:
參數 | 說明 |
loose_polar_enable_column_encryption | 控制是否開啟列加密功能。取值範圍如下:
|
4.(可選)開啟Online Copy功能
在使用Copy DDL文法進行資料輪轉時(如跨引擎修改表定義、調整列屬性或進行普通表與分區表之間的轉換),系統預設會鎖定表,可能導致業務阻塞。為解決這一問題,可開啟Online Copy最佳化功能,實現無鎖或最小化鎖影響的表結構變更。具體開關配置如下:
參數 | 說明 |
loose_polar_support_online_copy_ddl_algorithm | Online Copy DDL總開關,取值範圍如下:
|
loose_polar_support_online_copy_ddl_algorithm_for_modify | 資料輪轉可以使用Modify語句,需設定此參數,取值範圍如下:
|