---
title: Spark-SQL行式数据源加解密
description: "使用OmniShield机密大数据特性执行Spark引擎业务，需通过启动Spark提交任务执行。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2400/bds/kunpengbds_omniruntime_20_0715.html
sourcePath: /source/zh/kunpengboostkithistory/2400/bds/kunpengbds_omniruntime_20_0715.html
indexId: 7f01cc33f39a65ce0931710eb852956bc82b7a4e9b757c53d8ac513609a8d1f478
---
# Spark-SQL行式数据源加解密

使用OmniShield机密大数据特性执行Spark引擎业务，需通过启动Spark提交任务执行。

在基于OmniShield的机密计算环境中，虽然Spark SQL通过安全引擎保障了查询处理过程中的数据隐私，但若源数据未加密存储或查询结果在非受信环境输出仍会造成数据泄露，因此必须通过spark-submit提交SQL作业时集成端到端的加解密机制，实现从数据源到查询结果的全生命周期保护。

1. 部署相应KMS服务，创建好所需的Primary Key。例如可以通过以下指令在Hadoop KMS中创建Primary Key。
  1 hadoop key create key2

  Hadoop KMS的启动步骤与1中的相同。如果Hadoop KMS已经启动，创建Key时无需重复启动KMS。

2. 在“/opt/omnishield”目录下执行如下命令启动Spark-SQL。
  1 spark-sql --master local --conf spark.sql.extensions=com.huawei.analytics.shield.sql.DataSourceEncryptPlugin --conf spark.hadoop.io.compression.codecs=com.huawei.analytics.shield.crypto.CryptoCodec --jars omnishield-1.0-SNAPSHOT.jar,kms.jar --conf spark.executor.extraClassPath=omnishield-1.0-SNAPSHOT.jar:kms.jar --driver-class-path omnishield-1.0-SNAPSHOT.jar:kms.jar

3. 在Spark-SQL命令行执行如下SQL创建加密数据表。
  1 2 drop table if exists test1; create table test1 (id int) using csv options (`encrypt` 'true',`keyname` 'key2',`kmstype` 'test.HadoopKeyManagementService',`cryptomode` 'aes/gcm/nopadding',`keylength` '128');

  encrypt是指定是否使用加密表，该项的值为true时表示使用加密表。 keyname是指定当前使用的Primary Key，该key需要提前在KMS中创建生成。 kmstype是指定Primary Key的KMS类型，KMS需要使用者自行按照OmniShield机密大数据提供的接口实现，该项的值需要指定KMS在kms.jar中的具体类路径。 cryptomode是指定加密数据时使用的加密算法，支持AES/GCM/NOPadding和SM4/GCM/NoPadding。 keylength是指定加密的密钥长度，当使用AES/GCM/NOPadding加密算法时该项的值可以是128或256，当使用SM4/GCM/NoPadding加密算法时该项的值是128。 可以通过指定数据源格式创建不同类型的数据表，如创建JSON格式数据表需将using csv替换using json。目前支持CSV/JSON/TXT格式。

4. 在Spark-SQL命令行执行如下SQL检测数据表是否为加密数据表。
  1 show create table test1;

  在SQL运行结果的OPTIONS中如果包含encryptdatakey项则为加密表。
