
# 配置Hive列加密功能
#### 操作场景
在数据安全和合规性要求日益严格的背景下，企业中许多敏感数据需要进行加密存储，以防止数据泄露。Hive作为数据仓库，存储了大量业务数据，如果敏感列以明文形式存储，一旦HDFS被非法访问，敏感数据将直接暴露。如何在不影响业务查询的前提下，对Hive表中的敏感列进行加密存储？Hive提供列级加密功能，支持在创建表时指定加密列和加密算法，数据写入时自动加密，查询时自动解密，对上层业务透明。
本文介绍如何配置Hive列加密功能。
- **列加密（Column Encryption）**：Hive提供的数据加密功能，可以对表中的一个或多个列进行加密存储。加密后的数据在HDFS上以密文形式存储，查询时Hive自动解密返回明文，对上层应用透明。
- **AES（Advanced Encryption Standard）**：高级加密标准，一种对称加密算法，广泛应用于数据加密。AES加密强度高，性能好，是业界标准的加密算法。AES对应加密类名称为"org.apache.hadoop.hive.serde2.AESRewriter"。

- SM4：也称为SMS4，一种对称加密算法，在国内金融、政务等领域广泛应用。对应加密类名称为"org.apache.hadoop.hive.serde2.SMS4Rewriter"。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
将原始数据从普通Hive表导入到Hive列加密表后，在不影响其他业务情况下，建议删除普通Hive表上原始数据，避免保留一张未加密的表存在安全风险。
#### 约束与限制
- 只支持对存储在HDFS上的TextFile和SequenceFile文件格式的Hive表进行列加密。
- 不支持对视图和Hive over HBase表进行列加密。
- 创建列加密表时，表所在的目录必须是空目录。
- 加密算法一旦指定，不能修改。如需更换加密算法，需要重新创建表。
 
#### 前提条件
- 已安装集群客户端，安装客户端具体操作请参见[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
- 已准备Hive组件业务用户，对应用户需具有创建Hive表的权限，例如，该用户属于"hive"、"hadoop"用户组，主组为"hive"。创建Hive用户具体操作请参见[创建Hive用户并绑定角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0949.html#mrs_01_0949__section15172119027)。
 
#### 创建Hive列加密表
1. 以客户端安装用户登录安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录，配置环境变量并认证用户。 
   切换至客户端安装目录下：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   认证用户，如果集群未开启Kerberos认证，请跳过该操作：
   ```
   kinit Hive业务用户
   ```
   
   
3. 执行以下命令登录Hive客户端。 
   ```
   beeline
   ```
   
   
4. 在创建表时指定相应的加密列和加密算法： 
   ```
   create table <[db_name.]table_name> (<col_name1> <data_type> ,<col_name2> <data_type>,<col_name3> <data_type>,<col_name4> <data_type>) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('column.encode.columns'='<col_name2>,<col_name3>', 'column.encode.classname'='org.apache.hadoop.hive.serde2.AESRewriter')STORED AS TEXTFILE;
   ```
   或者使用如下语句：
   ```
   create table <[db_name.]table_name> (<col_name1> <data_type> ,<col_name2> <data_type>,<col_name3> <data_type>,<col_name4> <data_type>) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('column.encode.indices'='1,2', 'column.encode.classname'='org.apache.hadoop.hive.serde2.SMS4Rewriter') STORED AS TEXTFILE;
   ```
   例如：
   ```
   create table test1 (id string,name string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('column.encode.columns'='id,name', 'column.encode.classname'='org.apache.hadoop.hive.serde2.AESRewriter')STORED AS TEXTFILE;
   ```
   其中：
   - column.encode.classname：该参数用于指定加密算法，支持"org.apache.hadoop.hive.serde2.SMS4Rewriter"和"org.apache.hadoop.hive.serde2.AESRewriter"。
   
   - column.encode.columns：该参数用于通过列名指定加密列，多列用逗号分隔。
   
   - column.encode.indices：该参数用于通过列序号指定加密列，序号从0开始。0代表第1列，1代表第2列，依次类推。
   
   - 创建列加密表时，表所在的目录必须是空目录。
   
   
   
   
5. 使用**insert** 语句向设置列加密的表中导入数据。
   
   假设**test**表已存在且有数据，例如，表数据为：
   图1test表数据   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002317419533.png)
   执行以下命令导入数据：
   ```
   insert into table <table_name> select <col_list> from test;
   ```
   例如：
   ```
   insert into table test1 select id,name from test;
   ```
   
   
6. 执行以下命令查看加密表的详细元数据信息： 
   ```
   describe formatted test1;
   ```
   命令执行后的回显结果中可查看到加密列及加密类型，例如[图2]中加密的列为"id,name"，加密类型为"org.apache.hadoop.hive.serde2.AESRewriter"。
   图2查看加密表   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002305614198.png "点击放大")
   
   
7. 执行以下命令退出Hive客户端： 
   ```
   !q
   ```
   
   
8. 也可执行以下命令查看加密的Hive表对应的HDFS文件： 
   ```
   hdfs dfs -cat HDFS文件路径
   ```
   例如：
   ```
   hdfs dfs -cat /user/hive/warehouse/test/000000_0
   ```
   命令执行后的回显结果如[图3]所示即表示Hive列加密功能配置成功。
   图3Hive列数据加密   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002317523117.png "点击放大")
   
   
**验证操作：**
配置完成后，可通过以下方式验证列加密功能是否生效：
1. 执行**describe formatted test1;**命令，查看表元数据中的加密配置信息。
2. 执行**select \* from test1;**命令，确认可以正常查询到明文数据。
3. 执行**hdfs dfs -cat /user/hive/warehouse/test1/000000_0**命令，确认HDFS上的数据为密文。
 
#### 常见问题
- **查询加密表时报错**
  查询加密表报错可能是因为加密类配置错误、加密列数据类型不匹配、或Hive客户端缺少加密依赖。
  请检查建表语句中的"column.encode.classname"参数是否正确。确认加密列的数据类型支持加密。检查Hive客户端是否正确安装。
  
- **如何更换加密算法**
  加密算法在建表时指定后不能修改，如需更换加密算法需要重新创建表。
  创建新的加密表，使用新的加密算法。将数据从旧表导入到新表。确认数据迁移完成后，删除旧表。
  
 
#### 相关文档
- 了解Hive数据操作，请参考[Hive数据存储及加密配置](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300253.html)。
- 了解Hive常见问题，请参考[Hive常见问题](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1752.html)。
- 了解Hive各角色日志文件说明，请参考[Hive日志介绍](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0976.html)。
 
