全部產品
Search
文件中心

AnalyticDB:Apache Spark全密態計算引擎基礎版使用樣本

更新時間:Jan 15, 2026

AnalyticDB for MySQL Apache Spark全密態計算引擎基礎版可以加密敏感性資料,並將資料以密文的形式傳輸和儲存,只有密鑰擁有者才能解密資料,避免資料泄露。本文以雲資料庫RDS MySQL例,介紹使用Apache Spark全密態計算引擎基礎版加密資料,計算和分析密態資料,解密計算結果的完整過程。

前提條件

  • 叢集的產品系列為企業版、基礎版或湖倉版

  • 已建立資料庫帳號。

  • 已為RAM使用者授予AliyunADBFullAccess、AliyunADBSparkProcessingDataRole和AnalyticDB for MySQL庫表的讀寫權限。具體操作,請參見帳號授權

  • 已安裝Java 8開發環境,以運行用戶端工具。本文以作業系統為Linux的ECS執行個體為例。

注意事項

  • adb-crypto-tool用戶端工具僅支援加密或解密儲存在MySQLPostgreSQL資料庫中的資料。

    說明

    MySQL或PostgreSQL資料庫可以是雲資料庫、自建資料庫或第三方雲資料庫。

  • 全密態計算引擎尚不支援Decimal資料類型(可使用Float或Double資料類型作為替代)及嵌套資料類型。

  • 對於PostgreSQL資料庫,全密態計算引擎暫不支援自動去除Char(n)資料類型的尾部空格,建議使用Varchar(n) 類型。

資料準備

本文樣本的RDS MySQL資料庫名為adb,並在該庫中建立了一張名為customer的表,樣本如下:

CREATE DATABASE IF NOT EXIST adb;
CREATE TABLE IF NOT EXISTS adb.customer(
id int,
name varchar(1023),
address varchar(1023),
age int
);

customer表中插入資料,樣本如下:

INSERT INTO customer (id,name,address,age) VALUES('1', 'james', 'beijing', '10');
INSERT INTO customer (id,name,address,age) VALUES('2', 'bond', 'beijing', '15');
INSERT INTO customer (id,name,address,age) VALUES('3', 'jack', 'shanghai', '20');
INSERT INTO customer (id,name,address,age) VALUES('4', 'lucy', 'hangzhou', '25');
INSERT INTO customer (id,name,address,age) VALUES('5', 'tom', 'qingdao','30');

使用流程

  1. 步驟一:安裝加解密用戶端。下載並安裝adb-crypto-tool用戶端

  2. 步驟二:加密資料並上傳。通過用戶端工具,將資料庫明文表中的資料加密成密文資料集,並上傳至OSS。

  3. 步驟三:執行密文資料的SQL計算。通過AnalyticDB for MySQL Apache Spark全密態計算引擎的SQL視窗,執行密態資料計算,計算結果將以密文的形式儲存在OSS。

  4. 步驟四:下載密文結果資料並解密。將密文計算結果下載到本地,使用用戶端工具解密後自動上傳至資料庫明文表中。

安裝加解密用戶端

  1. 下載用戶端工具。下載連結為adb-crypto-tool-1.0.4.zip

  2. 解壓adb-crypto-tool-1.0.4.zip壓縮包。

    unzip adb-crypto-tool-1.0.4.zip

    解壓縮會得到以下3個檔案或檔案夾:

    • cryptoTool:加解密工具的入口。

      說明

      cryptoTool依賴bash環境,Windows系統可使用WSL等工具執行。

    • demo.json:樣本設定檔。

    • dist:加解密工具的依賴包。

加密資料並上傳

  1. 準備加密設定檔。您可參考demo.json建立設定檔,或直接修改demo.json設定檔的tablejdbcUrlusernamepassword參數。本文樣本建立設定檔encryption_config.json。樣本如下:

    {
      "dataDir": "file:///tmp",
      "table": [
        "customer"
      ],
      "encAlgo": "AES_128_GCM",
      "mek": "00112233445566778899aabbccdd****",
      "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb",
      "username": "demo_user",
      "password": "demo_password",
      "saveMode": "Overwrite",
      "format":"EncBlocksSource"
    }

    參數說明如下。

    參數

    描述

    dataDir

    儲存密文資料集的本地路徑。

    table

    加密的表名。本樣本為customer

    encAlgo

    密文的加解密演算法。當前僅支援AES_128_GCM。

    mek

    使用者主要金鑰(MEK)用於加密資料密鑰(DEK)。詳情請參見密鑰介紹

    使用者主要金鑰的格式為16位元組的十六進位字串。您可以通過OpenSSL工具產生密鑰。本文樣本為00112233445566778899aabbccdd****

    警告
    • 使用者主要金鑰是訪問加密資料的根憑據,一旦丟失密鑰,將無法再訪問已有的資料。請妥善保管使用者主要金鑰。

    • 全密態計算引擎不提供使用者主要金鑰的產生和備份服務,您需要按照密鑰格式輸入使用者主要金鑰。

    jdbcUrl

    資料庫的串連地址和資料庫名稱。僅支援MySQLPostgreSQL資料庫。串連地址格式為:

    • MySQL資料庫:jdbc:mysql://ip:port/database_name

    • PostgreSQL資料庫:jdbc:postgresql://ip:port/database_name

    本文樣本為jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb

    userName

    資料庫帳號。

    password

    帳號密碼。

    saveMode

    如果已存在目標路徑(加密後的檔案儲存體路徑),引擎在產生密文資料集時將採取的模式。支援以下模式:

    • Append:追加寫。

    • ErrorIfExists:目標存在,則上報異常後退出。您可以在日誌中查看具體報錯資訊。

    • Ignore:目標存在,則放棄寫。您在日誌中無法查看具體報錯資訊。

    • Overwrite:覆蓋寫。

    format

    密文格式。當前僅支援EncBlocksSource格式。

  1. 運行用戶端工具加密指定資料庫adbcustomer表的資料。加密後的資料集會儲存在設定檔中指定的dataDir路徑下。

    ./cryptoTool encrypt encryption_config.json
  2. 將加密後的資料集所在的檔案夾customer上傳到OSS空間。本文樣本路徑為oss://testBucketName/adb/Spark/customer。具體操作,請參見簡單上傳

執行密文資料的SQL計算

  1. 登入雲原生資料倉儲AnalyticDB MySQL控制台,在左上方選擇叢集所在地區。在左側導覽列,單擊集群清單,然後單擊目的地組群ID。

  2. 在左側導覽列,單擊作業開發>SQL開發

  3. SQLConsole視窗,選擇Spark引擎和Job型資源群組。

  4. 執行以下語句,進行密文資料的SQL計算。

    1. 開啟密態計算,設定使用者的主要金鑰。

      --開啟密態計算。
      set spark.adb.tee.enabled=true;
      
      --設定使用者的主要金鑰,需要與加密設定檔中的使用者主要金鑰MEK一致。
      set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****;
      
      --建立資料庫,儲存密文資料和密文計算結果。
      CREATE DATABASE IF NOT EXISTS test_db;
    2. 使用全密態引擎建立外表customerLOCATION為密文資料集檔案夾所在的OSS路徑。本文樣本為oss://testBucketName/adb/Spark/customer

      set spark.adb.tee.enabled=true;
      set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****;
      CREATE TABLE IF NOT EXISTS test_db.customer 
      USING EncBlocksSource 
      LOCATION  'oss://testBucketName/adb/Spark/customer';
    3. 建立外表customer_output,將customer表的SQL計算結果寫入customer_output外表。customer_output外表的資料指定儲存在oss://testBucketName/adb/Spark/customer_output

      set spark.adb.tee.enabled=true;
      set spark.adb.tee.encryption.key=00112233445566778899aabbccdd****;
      CREATE TABLE IF NOT EXISTS test_db.customer_output
      USING EncBlocksSource
      LOCATION 'oss://testBucketName/adb/Spark/customer_output'
      AS
      SELECT *
      FROM test_db.customer
      WHERE id = 1;

下載密文結果並解密

  1. 從OSS路徑oss://testBucketName/adb/Spark/customer_output下載密文計算結果到本地。具體操作,請參見下載檔案

  2. 準備解密設定檔。本文樣本建立設定檔decryption_config.json,樣本如下。

    {
      "dataDir": "file:///tmp",
      "table": [
        "customer_output"
      ],
      "encAlgo": "AES_128_GCM",
      "outTblPrefix": "abc_",
      "mek": "00112233445566778899aabbccdd****",
      "jdbcUrl": "jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb",
      "username": "demo_user",
      "password": "demo_password",
      "saveMode": "Overwrite",
      "format":"EncBlocksSource"
    }

    參數說明如下:

    參數

    描述

    dataDir

    儲存密文資料集的本地路徑。

    table

    密文資料集的檔案夾名。

    encAlgo

    密文的加解密演算法。當前僅支援AES_128_GCM。

    outTblPrefix

    解密後資料庫中表名的首碼(Prefix)。資料庫中目標表名將由首碼和密文資料集檔案夾名組成。

    mek

    使用者主要金鑰(MEK)用於加密資料密鑰(DEK)。詳情請參見密鑰介紹

    使用者主要金鑰的格式為16位元組的十六進位字串。您可以通過OpenSSL工具產生密鑰。本文樣本為00112233445566778899aabbccdd****

    警告
    • 使用者主要金鑰是訪問加密資料的根憑據,一旦丟失密鑰,將無法再訪問已有的資料。請妥善保管使用者主要金鑰。

    • 全密態計算引擎不提供使用者主要金鑰的產生和備份服務,您需要按照密鑰格式輸入使用者主要金鑰。

    jdbcUrl

    資料庫的串連地址和資料庫名稱。僅支援MySQLPostgreSQL資料庫。串連地址格式為:

    • MySQL資料庫:jdbc:mysql://ip:port/database_name

    • PostgreSQL資料庫:jdbc:postgresql://ip:port/database_name

    本文樣本為jdbc:mysql://rm-bp1487t8613zz****.mysql.rds.aliyuncs.com:3306/adb

    userName

    資料庫帳號。

    password

    帳號密碼。

    saveMode

    如果已存在目標資料庫(解密後的資料存放區的資料庫),引擎在產生明文資料集時將採取的模式。支援以下模式:

    • Append:追加寫。

    • ErrorIfExists:目標存在,則上報異常後退出。您可以在日誌中查看具體報錯資訊。

    • Ignore:目標存在,則放棄寫。您在日誌中無法查看具體報錯資訊。

    • Overwrite:覆蓋寫。

    format

    密文格式。當前僅支援EncBlocksSource格式。

  3. 運行用戶端解密,解密後的資料會被自動插入到RDS MySQL的adb資料庫中。寫入的資料表,表名由加密資料集所在的檔案夾名稱和outTblePrefix參數決定。本文樣本為adb_customer_output

    ./cryptoTool decrypt decryption_config.json
  4. 在RDS MySQL資料庫中查看解密後的資料。可看到資料明文的計算結果。

    SELECT * FROM adb_customer_output;

    返回結果:

    +--------+----------+----------+----------+
    |  id    |   name   |  address |   age    |
    +--------+----------+----------+----------+
    |   1    |  james   |  beijing |   10     |
    +--------+----------+----------+----------+