
# 使用国密算法加解密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加密字符串数据   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002425105865.png "点击放大")
   
   
7. 对加密后的字符串数据结果进行解密，例如： 
   ```
   SELECT sm4_decrypt('01334750B78AB889A61C5E9F7DEE3EF819AA413EC94A17BC', 'ABCDEFGH12345678');
   ```
   其中第一个参数为[6]加密后的密文数据内容，"*ABCDEFGH12345678* "为加密时使用的密钥。命令之后会返回解密后的字符串数据。
   图2解密字符串数据   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002425225697.png "点击放大")
   
   
8. 对字符串类型的字段进行加密，且指定加密模式。 
   例如，对表"teststr"的以下字段进行加密：
   图3加密数据   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002391665836.png)
   1. 加密表字段并覆写数据，例如：
      ```
      insert overwrite table teststr select sm4_encrypt(name, '0123456789123456', 'SM4/CBC/PKCS5Padding') from teststr;
      ```
      其中，"*name* "为需要加密的表字段名称，"*0123456789123456* "为加密密钥，可以指定为任意16位字符串，"*SM4/CBC/PKCS5Padding*"为加密算法模式。
      图4加密及覆写数据   
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002425173381.png "点击放大") 
   
   2. 查看加密后的Hive表：
      ```
      select * from teststr;
      ```
      图5查看加密的Hive表   
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002425105869.png "点击放大") 
   
   
   
   
9. 对加密后的字符串类型的字段的结果进行解密，例如： 
   ```
   select sm4_decrypt(name, '0123456789123456', 'SM4/CBC/PKCS5Padding') from teststr;
   ```
   其中，"*name* "为需要解密的表字段名称，"*0123456789123456* "为加密时设置的密钥，第"*SM4/CBC/PKCS5Padding* "为加密算法模式。命令执行后会返回解密后的字段名称。
   图6解密字符串类型的字段   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002425225705.png "点击放大")
   
   
 
