更新时间:2025-12-10 GMT+08:00
分享

使用国密算法加解密Hive表数据

操作场景

MRS 3.6.0-LTS及之后版本,Hive支持一组国密加解密算法,使得表的字符串类型的字段数据可以使用国密算法进行加解密操作。

  • 加密:sm4_encrypt('待加密的字符串数据或字段名称', '16位任意字符串代表的密钥', 加密模式(可选))
  • 解密:sm4_decrypt('待解密的字符串数据或字段名称', '加密时指定的密钥', 加密模式(可选))

约束与限制

  • 执行加解密操作时,加密模式可选,不填写时默认使用SM4/CTR/NOPADDING。
  • 由于ECB加密算法不安全,所以加密模式不可以选择SM4/ECB。
  • Varchar和Char类型字段加密后的数据可能会比原数据的字符串长,建议使用String类型。如果确实需要使用Varchar或Char类型字段建议调整字段长度为明文值的3倍以上且不低于50个字符。例如,可参考如下SQL调整字段长度,将testtable表的字段a的长度由10修改为20:
    alter table testtable change column a a char(20);

加解密数据

  1. 以Hive客户端安装用户登录安装客户端的节点。
  2. 执行以下命令,切换到客户端安装目录,例如安装目录为“/opt/client”,请用户根据实际情况修改。

    cd /opt/client

  3. 执行以下命令配置环境变量。

    source bigdata_env

  4. 集群认证模式是否为安全模式。

    • 是,执行以下命令进行用户认证,然后执行5
      kinit Hive业务用户
    • 否,执行5

  5. 执行以下命令登录Hive客户端。

    beeline

  6. 对表的字符串数据进行加密,例如:

    select sm4_encrypt('testdata', 'ABCDEFGH12345678');
    其中,“testdata”为要进行加密的字符串数据,“ABCDEFGH12345678”为加密密钥,可以指定为任意16位字符串。命令执行后会返回加密字符串数据的结果,可用于解密。
    图1 加密字符串数据

  7. 对加密后的字符串数据结果进行解密,例如:

    SELECT sm4_decrypt('01334750B78AB889A61C5E9F7DEE3EF819AA413EC94A17BC', 'ABCDEFGH12345678');
    其中第一个参数为6加密后的密文数据内容,“ABCDEFGH12345678”为加密时使用的密钥。命令之后会返回解密后的字符串数据。
    图2 解密字符串数据

  8. 对字符串类型的字段进行加密,且指定加密模式。

    例如,对表“teststr”的以下字段进行加密:

    图3 加密数据
    1. 加密表字段并覆写数据,例如:
      insert overwrite table teststr select sm4_encrypt(name, '0123456789123456', 'SM4/CBC/PKCS5Padding') from teststr;

      其中,“name”为需要加密的表字段名称,“0123456789123456”为加密密钥,可以指定为任意16位字符串,“SM4/CBC/PKCS5Padding”为加密算法模式。

      图4 加密及覆写数据
    2. 查看加密后的Hive表:
      select * from teststr;
      图5 查看加密的Hive表

  9. 对加密后的字符串类型的字段的结果进行解密,例如:

    select sm4_decrypt(name, '0123456789123456', 'SM4/CBC/PKCS5Padding') from teststr;
    其中,“name”为需要解密的表字段名称,“0123456789123456”为加密时设置的密钥,第“SM4/CBC/PKCS5Padding”为加密算法模式。命令执行后会返回解密后的字段名称。
    图6 解密字符串类型的字段

相关文档