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

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

在机密计算环境中，虽然Spark引擎通过OmniShield技术确保计算过程的数据隐私性，但若原始数据未加密存储或计算结果在非机密环境中暴露仍会导致信息泄露，因此必须结合DataFrame这一Spark核心数据结构，通过启动Spark-submit任务时集成端到端的数据加解密能力来实现全链路的安全保障。

1. 部署相应KMS服务，创建好所需的Primary Key。例如可以通过以下指令启动Hadoop KMS，并创建Primary Key。

  a. 编辑Hadoop配置文件。
    1 2 cd $HADOOP_HOME/etc/hadoop vi core-site.xml

  b. 按“i”进入编辑模式，在<configuration>标签中添加以下内容。
    1 2 3 4 <property> <name>hadoop.security.key.provider.path</name> <value>kms://http@x.x.x.x:9600/kms</value> </property>

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 复制core-site.xml文件给Spark。
    1 cp $HADOOP_HOME/etc/hadoop/core-site.xml $SPARK_HOME/conf/

  e. 启动Hadoop KMS。
    1 2 cd $HADOOP_HOME/sbin sh kms.sh start

  f. 创建Key。
    1 hadoop key create key1

    在修改core-site.xml时将第二步中的x.x.x.x修改为实际的IP地址。 如果key1已经存在，在创建key1前执行hadoop key delete key1指令删除key1。

2. 在“/home”目录下生成待加密的CSV数据源文件。

  a. 编辑“simple.csv”文件。
    1 vi simple.csv

  b. 按“i”进入编辑模式，在文件中添加以下内容。
    1 2 3 4 5 6 name,age,job user1,12,Engineer user2,13,Engineer user3,14,Developer user4,15,Engineer user5,16,Engineer

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
3. 在“/opt/omnishield”目录下执行数据源加密的命令如下, 指令执行完成后将生成“/home/en”目录，并存放加密后的simple.csv数据。
  1 spark-submit --class com.huawei.analytics.shield.utils.Encrypt --master local --conf spark.hadoop.io.compression.codecs=com.huawei.analytics.shield.crypto.CryptoCodec --conf spark.shield.primaryKey.name=key1 --conf spark.shield.primaryKey.key1.kms.type=test.example.HadoopKeyManagementService --jars omnishield-1.0-SNAPSHOT.jar,kms.jar omnishield-1.0-SNAPSHOT.jar -i file:///home/simple.csv -o file:///home/en -a AES/GCM/NOPadding -t csv -e encrypt

4. 在“/opt/omnishield”目录下执行数据源解密的命令如下，指令执行完成后将生成“/home/de”目录，并存放解密后的数据。
  1 spark-submit --class com.huawei.analytics.shield.utils.Encrypt --master local --conf spark.hadoop.io.compression.codecs=com.huawei.analytics.shield.crypto.CryptoCodec --conf spark.shield.primaryKey.name=key1 --conf spark.shield.primaryKey.key1.kms.type=test.example.HadoopKeyManagementService --jars omnishield-1.0-SNAPSHOT.jar,kms.jar omnishield-1.0-SNAPSHOT.jar -i file:///home/en -o file:///home/de -a AES/GCM/NOPadding -t csv -e decrypt

  spark.shield.primaryKey是指定当前使用的Primary Key，该key需要提前在KMS中创建生成。 spark.shield.primaryKey.key1.kms.type是指定Primary Key的KMS类型，KMS需要使用者自行按照OmniShield提供的接口实现，该项的值需要指定KMS在kms.jar中的具体类路径。 -i、-o分别用于指定输入和输出的路径，支持HDFS或本地文件系统。 在加密模式下，-i指定的是原始数据文件，-o指定的是加密后输出的文件夹位置。 在解密模式下，-i指定的是已加密的文件夹位置，-o指定的是解密后输出的文件夹位置。 -a用于指定使用的加密算法，目前只支持AES/GCM/NOPadding。 -t用于指定数据源文件格式，目前支持CSV/JSON/TXT。 -e用于指定工作模式，encryp表示加密，decrypt表示解密。
