更新时间:2025-07-14 GMT+08:00

配置Hive列加密功能

操作场景

Hive支持对表的某一列或者多列进行加密,在创建Hive表时,可以指定要加密的列和加密算法。当使用insert语句向表中插入数据时,即可实现将对应列的数据加密。

Hive列加密机制目前支持的加密算法有两种,需在建表时指定:

  • AES:对应加密类名称为“org.apache.hadoop.hive.serde2.AESRewriter”。
  • SM4:也称为SMS4,对应加密类名称为“org.apache.hadoop.hive.serde2.SMS4Rewriter”。

将原始数据从普通Hive表导入到Hive列加密表后,在不影响其他业务情况下,建议删除普通Hive表上原始数据,避免保留一张未加密的表存在安全风险。

约束与限制

只支持对存储在HDFS上的TextFile和SequenceFile文件格式的Hive表进行列加密,不支持对视图和Hive over HBase表进行列加密。

前提条件

  • 已安装集群客户端,安装客户端具体操作请参见安装客户端
  • 已准备Hive组件业务用户,对应用户需具有创建Hive表的权限,例如,该用户属于“hive”、“hadoop”用户组,主组为“hive”。创建Hive用户具体操作请参见创建Hive用户并绑定角色

创建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”。
    • 使用序号指定加密列时,序号从0开始。0代表第1列,1代表第2列,依次类推。
    • 创建列加密表时,表所在的目录必须是空目录。

  5. 使用insert语句向设置列加密的表中导入数据。

    假设test表已存在且有数据,例如,表数据为:

    图1 test表数据

    执行以下命令导入数据:

    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 查看加密表

  7. 执行以下命令退出Hive客户端:

    !q

  8. 也可执行以下命令查看加密的Hive表对应的HDFS文件:

    hdfs dfs -cat HDFS文件路径

    例如:

    hdfs dfs -cat /user/hive/warehouse/test/000000_0

    命令执行后的回显结果如图3所示即表示Hive列加密功能配置成功。

    图3 Hive列数据加密