# 细粒度透明数据加密
数据库加密是保护敏感数据安全的关键手段，通过加密可以防止未经授权的用户访问和读取敏感数据。DWS的细粒度透明加密功能通过**表级加密** 方式和**列级加密**方式提供了细粒度的加密能力，对数据库进行更加精准的数据安全保护，同时加密过程完全透明对应用层和SQL访问不会产生影响。用户可根据不同的数据敏感级别和访问需求来选择合适的加密方式。
细粒度透明加密支持两种加密算法：AES-CTR-128（非国密场景）和SM4-CTR-128（国密场景）。
具体的细粒度透明数据加密语法请参考[CREATE TABLE](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0177.html)。
#### 注意事项
使用细粒度透明加密功能时，需遵守以下约束，避免影响业务正常运行：
- 细粒度透明加密仅9.1.1.200及以上集群版本支持，且需联系技术支持配置GUC参数tde_version为2。
- 细粒度透明加密仅行存表、列存2.0表支持。
- 行存表不支持列级的透明加密配置，仅列存表支持列级。
- 集群级透明加密和细粒度透明加密功能互斥，无法同时开启。已经开启了集群级透明加密，则无法开启细粒度透明加密功能。
- 集群升级观察期内，不支持创建透明加密表。
- 索引不支持修改透明加密配置。
- 不支持基于加密表创建物化视图，也不支持对物化视图加密。
- 普通列存+delta表、Hstore非opt表、行列混存表、LSM表不支持表级加密。
- 临时表不支持加密。
- 细粒度透明加密功能强依赖KMS（密钥管理服务）才能获取密钥，如果DWS集群使用细粒度加密功能时出现报错，需联系技术支持修复KMS故障。故障修复前不能重启DWS集群或者实例，否则会导致集群不可用。
 
#### 操作示例
以员工信息表employees为例，使用细粒度透明加密功能。
1. 创建表employees为初始未加密表。 
   ```
   CREATE TABLE employees (
        emp_id int PRIMARY KEY,
        emp_name text,
        emp_email text,
        emp_phone text,
        salary decimal(10,2),
        hire_date date );
   ```
   
   
2. 创建表级加密表employees_encrypted（AES-CTR-128算法），并将employees表数据迁移到employees_encrypted。 
   ```
   CREATE TABLE employees_encrypted (
        emp_id int PRIMARY KEY,
        emp_name text,
        emp_email text,
        emp_phone text,
        salary decimal(10,2),
        hire_date date ) 
   WITH (encrypt_option = table,encrypt_algo = AES_CTR_128);  
   INSERT INTO employees_encrypted SELECT * FROM employees;
   ```
   
   
3. 创建SM4加密（国密算法）的薪资表salaries。 
   ```
   CREATE TABLE salaries (
        emp_id int,
        salary decimal(10,2),
        bonus decimal(10,2),
        effective_date date ) 
   WITH (encrypt_option = table, encrypt_algo = SM4_CTR_128);
   ```
   
   
4. 创建列级加密表hr_analysis，仅针对敏感列"salary"信息加密。 
   ```
   CREATE TABLE hr_analysis (
        emp_id int,
        emp_name text,
        emp_department text,
        salary decimal(10,2) ENCRYPT,  -- 仅薪资列加密
        performance_score int ) 
   WITH (orientation = column, encrypt_option = column);
   ```
   
   
5. 列级加密表hr_analysis由指定列加密修改为全列加密。 
   ```
   ALTER TABLE hr_analysis MODIFY (emp_id to encrypt);
   ALTER TABLE hr_analysis MODIFY (emp_name to encrypt);
   ALTER TABLE hr_analysis MODIFY (emp_department to encrypt);
   ALTER TABLE hr_analysis MODIFY (performance_score to encrypt);
   VACUUM FULL hr_analysis;
   ```
   
   
6. 对加密表进行解密。 
   ```
   ALTER TABLE employees_encrypted SET (encrypt_option = off); 
   VACUUM FULL employees_encrypted;
   ```
   对初始未加密表开启加密。
   ```
   ALTER TABLE employees SET (encrypt_option = table); 
   VACUUM FULL employees;
   ```
   
   
7. 修改表的加密算法为SM4。 
   ```
   ALTER TABLE employees SET (encrypt_algo = SM4_CTR_128); 
   VACUUM FULL employees; 
   ALTER TABLE hr_analysis SET (encrypt_algo = SM4_CTR_128); 
   VACUUM FULL hr_analysis;
   ```
   
   
8. 定期密钥轮转，按安全策略每半年执行一次密钥轮转。 
   ```
   ALTER CLUSTER ENCRYPTION KEY ROTATION;
   ```
   
   
 
