文档

基础版Spark全密态计算引擎使用示例

更新时间:
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

AnalyticDB MySQL企业版及湖仓版基础版的Spark全密态计算引擎可以加密敏感数据,并将数据以密文的形式传输和存储,只有密钥拥有者才能解密数据,避免数据泄露。本文以云数据库RDS MySQL例,介绍使用基础版Spark全密态计算引擎加密数据,计算和分析密态数据,解密计算结果的完整过程。

前提条件

  • AnalyticDB for MySQL企业版及湖仓版集群与OSS存储空间位于相同地域。

  • 已创建数据库账号。

  • 已创建Job型资源组。具体操作,请参见新建资源组

  • 已为RAM用户授予AliyunADBFullAccess、AliyunADBSparkProcessingDataRole和AnalyticDB 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 MySQL 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)。详情请参见全密态 ADB MySQL Spark 概述

    用户主密钥的格式为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)。详情请参见全密态 ADB MySQL Spark 概述

    用户主密钥的格式为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     |
    +--------+----------+----------+----------+