更新时间:2023-03-17 GMT+08:00

使用Hive列加密功能

操作场景

Hive支持对表的某一列或者多列进行加密;在创建Hive表时,可以指定要加密的列和加密算法。当使用insert语句向表中插入数据时,即可实现将对应列加密。列加密只支持存储在HDFS上的TextFile和SequenceFile文件格式的表。Hive列加密不支持视图以及Hive over HBase场景。

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

  • AES(对应加密类名称为:org.apache.hadoop.hive.serde2.AESRewriter)
  • SMS4(对应加密类名称为:org.apache.hadoop.hive.serde2.SMS4Rewriter)
  • 国密集群场景下,Hive列加密只支持创建SMS4算法的表,不支持创建AES算法类型的表。
  • 将原始数据从普通Hive表导入到Hive列加密表后,在不影响其他业务情况下,建议删除普通Hive表上原始数据,因为保留一张未加密的表存在安全风险。

操作步骤

  1. 在创建表时指定相应的加密列和加密算法:

    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;

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

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

    假设test表已存在且有数据:

    insert into table <table_name> select <col_list> from test;