在大数据环境中,数据安全的重要性不言而喻。对于存储在Hive外部表中的敏感信息,仅仅依赖访问控制可能还不够,数据本身也需要一层保护。这就引出了数据加密的需求。通常,我们可以从两个层面着手:存储层和传输层。今天,我们就来深入探讨两种在Hive中实现外部表数据加密的主流方法:AES加密和透明数据加密(TDE)。

AES 加密
第一种方法是使用AES(高级加密标准)对特定列进行加密。在Hive生态中,这通常可以借助Apache Ranger这样的安全框架来实现。整个流程需要先打通Ranger与底层HDFS的集成,然后按部就班地进行配置。
整个过程可以分解为四个核心步骤:
步骤1:创建加密配置文件
首先,需要在HDFS的配置文件(例如 hdfs-site.xml)中声明加密相关的属性。关键是要指定一个密钥提供者以及加密数据的存储路径。
dfs.encryption.key.provider.mykeyprovider
org.apache.hadoop.hdfs.server.datanode.加密数据提供者.MyKeyProvider
dfs.encrypt.data.dir
/path/to/encrypted/data/dir
步骤2:创建密钥提供者
接下来,需要实现一个自定义的密钥提供者类(比如示例中的 MyKeyProvider)。这个类必须继承 org.apache.hadoop.hdfs.server.datanode.加密数据提供者.KeyProvider,并在其中完成密钥的生成、存储和获取等核心逻辑。这是整个加密体系的信任基石。
步骤3:配置 Hive 使用加密
然后,轮到Hive端的配置。在 hive-site.xml 文件中,需要启用数据加密功能,并指向刚才配置好的密钥提供者及具体的密钥。
hive.server2.encrypt.data
true
hive.server2.encrypt.data.key.provider.mykeyprovider.mykey
my_encryption_key
步骤4:创建使用加密列的外部表
最后,在创建外部表时,就可以指定哪些列需要被加密了。通过在列定义中使用 AES 关键字,并确保表属性中引用了正确的加密密钥,即可完成配置。
CREATE EXTERNAL TABLE my_encrypted_table (
id INT,
name STRING,
encrypted_data STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://mycluster/path/to/data'
TBLPROPERTIES ('hive.encrypt.key'='my_encryption_key');
这样一来,写入 encrypted_data 列的数据会自动使用AES算法加密,读取时则会自动解密,对上层应用基本透明。
透明数据加密(TDE)
如果说AES加密是“指哪打哪”的列级加密,那么透明数据加密(TDE)则更像是“全面防护”的存储层加密。它的目标是自动加密整个数据文件或数据块,无需在表定义中显式指定列,简化了管理。
Hive同样支持通过Apache Ranger来配置TDE,步骤上与AES加密有相似之处,但侧重点不同。
步骤1:创建加密配置文件
在HDFS的 hdfs-site.xml 中,除了指定密钥提供者,还需要定义加密类型(例如基于块的加密)。
dfs.encryption.type
block
dfs.encryption.key.provider.mykeyprovider
org.apache.hadoop.hdfs.server.datanode.加密数据提供者.MyKeyProvider
步骤2:创建密钥提供者
这一步与AES加密完全一致:实现自定义的密钥提供者类(如 MyKeyProvider),继承相同的基类,并实现密钥管理方法。
步骤3:配置 Hive 使用加密
Hive端的配置也基本相同,即在 hive-site.xml 中启用加密并配置密钥提供者信息。
hive.server2.encrypt.data
true
hive.server2.encrypt.data.key.provider.mykeyprovider.mykey
my_encryption_key
步骤4:启用 TDE
最关键的区别体现在建表语句上。使用TDE时,不再需要在列定义中做文章,而是通过 ENCRYPTED 关键字或相应的表属性来为整个表启用透明加密。
CREATE EXTERNAL TABLE my_encrypted_table (
id INT,
name STRING,
data STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://mycluster/path/to/data'
TBLPROPERTIES ('hive.encrypt.key'='my_encryption_key');
配置完成后,所有写入该表位置的数据在落盘时都会被自动加密,而读取时则自动解密。对于访问该表的用户和应用程序而言,这个过程是完全无感的,真正做到了“透明”。
总结来说,AES列加密提供了更精细的控制,适合只保护特定敏感字段的场景;而TDE则提供了更便捷、更全面的存储级保护。选择哪一种,取决于你对数据安全粒度、管理复杂度和性能的具体要求。
