全部產品
Search
文件中心

PolarDB:列加密

更新時間:Nov 22, 2025

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指定加密列。

  1. 指定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值不加密。

  2. 可以通過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.密鑰管理

  1. 授權PolarDB訪問KMS

  2. 開啟TDE功能。

    重要
    • 啟用TDE加密會導致PolarDB叢集重啟,請謹慎操作。

    • TDE開通後將無法關閉。

    • 開啟TDE功能本身不會對非TDE表或非列加密表引入額外的效能損耗。

    1. 登入PolarDB控制台,在左側導覽列單擊集群列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。

    2. 在左側導覽列單擊配置与管理 安全管理

    3. TDE配置頁簽,開啟TDE状态開關,並使用自訂密鑰。

      說明

      在KMS執行密鑰刪除操作前,必須確認該密鑰已解除所有加密表關聯依賴關係(包括歷史版本關聯)。否則,可能造成PolarDB叢集重啟後不可用。

      image.png

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

    image

  4. (可選)密鑰輪轉。

    說明
    • PolarDB並不會更新自訂密鑰的主要金鑰版本,您可以手動更新密鑰版本,具體操作請參考密鑰輪轉

    • 密鑰輪轉後,建立加密表會採用新的密鑰進行加密,原有加密表中的資料不發生任何變化仍保持原祕密金鑰加密。

    • 資料輪轉是將表中資料解密後再用最新版本密鑰進行加密,因此需注意其會消耗一定的CPU、IO資源。資料輪轉並不是強制的,但是需要保證資料表所用密鑰的可用性。

    • 資料輪轉是否鎖表:

    對於原加密表,如果需要採用新祕密金鑰加密,需要您自行下發資料輪轉指令,指令如下:

    ALTER TABLE <table_name> engine = innodb,algorithm=copy;
  5. 查詢表密鑰。

    可以通過如下的SQL查詢系統中所有加密表的密鑰使用方式。

    SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;

3. 參數設定

通過loose_polar_enable_column_encryption參數開啟列加密功能,具體操作請參見設定叢集參數和節點參數。參數說明如下:

參數

說明

loose_polar_enable_column_encryption

控制是否開啟列加密功能。取值範圍如下:

  • ON:開啟列加密功能。

  • OFF(預設):關閉列加密功能。

4.(可選)開啟Online Copy功能

在使用Copy DDL文法進行資料輪轉時(如跨引擎修改表定義、調整列屬性或進行普通表與分區表之間的轉換),系統預設會鎖定表,可能導致業務阻塞。為解決這一問題,可開啟Online Copy最佳化功能,實現無鎖或最小化鎖影響的表結構變更。具體開關配置如下:

參數

說明

loose_polar_support_online_copy_ddl_algorithm

Online Copy DDL總開關,取值範圍如下:

  • ON:開啟Online Copy DDL功能。

  • OFF(預設):關閉Online Copy DDL功能。

loose_polar_support_online_copy_ddl_algorithm_for_modify

資料輪轉可以使用Modify語句,需設定此參數,取值範圍如下:

  • ON:開啟Modify Column語句的Online功能。

  • OFF(預設):關閉Modify Column語句的Online功能。