
# 加解密函数
#### AES_DECRYPT
AES_DECRYPT(crypt_str, key_str\[, init_vector\]\[, kdf_name\]\[, salt\]\[, info \| iterations\])
描述：基于AES算法，使用解密口令key_str、初始化向量init_vector和KDF相关选项（kdf_name、salt、info/iterations）对加密后的字符串crypt_str进行解密。
参数解释：
- crypt_str：需要被解密的字符串。若crypt_str为NULL，函数返回NULL。
- key_str：解密口令。若key_str为NULL，函数返回NULL。为了安全，对于128bit/192bit/256bit的密钥长度（由块加密模式block_encryption_mode确定），建议使用128bit/192bit/256bit的安全随机数作为密钥字符串。
- init_vector：为需要的块加密模式提供初始化变量，长度大于等于16字节（大于16字节的部分会被自动忽略）。str和key_str均不为NULL时，该参数不可为NULL，否则报错。为了安全，建议在OFB模式下，保证每次加密IV值的唯一性；在CBC模式和CFB模式下，保证每次加密的IV值不可被预测。
- kdf_name：指定使用的KDF算法，取值为PBKDF2或HKDF。
- salt：用于与原密码组合生成密钥。
- info/iterations：对于HKDF，INFO是该字段指定的info参数。对于PBKDF2，ITERATIONS是该字段指定的迭代次数。
 
返回值类型：统一返回LONGBLOB类型。
示例：
```
m_db=# SELECT AES_DECRYPT(AES_ENCRYPT('huwei123','123456vfhex4dyu','vdaladhjsadadabcdef','hkdf'),'123456vfhex4dyu','vdaladhjsadadabcdef','hkdf');
 aes_decrypt 
-------------
 huwei123
(1 row)
```
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 由于该函数的执行过程需要传入解密口令，为了安全，gsql工具不会将包含该函数名字样的SQL记录入执行历史；即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 在存储过程的相关操作中避免调用该函数，避免敏感参数信息在日志中泄露的风险。建议在使用包含该函数的存储过程相关操作时，将该函数的参数信息过滤后再提供给外部维护人员定位，日志使用完毕后请及时删除。
- 在打开debug_print_plan开关的情况下避免调用该函数，避免敏感参数信息在日志中泄露的风险。建议在打开debug_print_plan开关生成的日志中对该函数的参数信息进行过滤后再提供给外部维护人员定位，日志使用完毕后请及时删除。
- 保证block_encryption_mode、key_str、iv值与加密时一致。
- 由于编码差异，不支持从gsql客户端直接复制加密后的数据进行解密，此场景解密出的结果与加密前的字符串可能存在差异。
- 由于SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII，服务器把字节值0\~127根据 ASCII标准解释，而字节值128\~255则当作无法解析的字符。如果设置为SQL_ASCII，则不会编码转换。该函数调用openssl三方库返回的数据的编码为非ASCII数据，因此当数据库服务端字符集设置为SQL_ASCII时，客户端编码也需设置为SQL_ASCII ，否则会报错。因为数据库无法自动转换或者校验非ASCII字符。
 
#### AES_ENCRYPT
AES_ENCRYPT(str, key_str\[, init_vector\]\[, kdf_name\]\[, salt\]\[, info \| iterations\])
描述：基于AES算法，使用加密口令key_str、初始化向量init_vector和KDF相关选项（kdf_name、salt、info/iterations）对字符串str进行加密。
参数解释：
- str：需要被加密的字符串。若str为NULL，函数返回NULL。
- key_str：加密口令。若key_str为NULL，函数返回NULL。为了安全，对于128bit/192bit/256bit的密钥长度（由块加密模式block_encryption_mode确定），建议用户使用128bit/192bit/256bit的安全随机数作为密钥字符串。
- init_vector：为需要它的块加密模式提供初始化变量，长度大于等于16字节（大于16字节的部分会被自动忽略）。str和key_str均不为NULL时，该参数不可为NULL，否则报错。为了安全，建议用户在OFB模式下，保证每次加密IV值的唯一性；在CBC模式和CFB模式下，保证每次加密的IV值不可被预测。
- kdf_name：指定使用的KDF算法，取值为PBKDF2或HKDF。
- salt：用来与原密码组合生成密钥。
- info/iterations：对于HKDF，INFO是该字段指定的info参数。对于PBKDF2，ITERATIONS是该字段指定的迭代次数。
 
返回值类型：统一返回LONGBLOB类型。
示例：
```
m_db=# SELECT AES_ENCRYPT('huwei123','123456vfhex4dyu,vdaladhjsadad','1234567890123456');
    aes_encrypt    
-------------------
 Z_Z\x7F\\x7Fy\x1D
(1 row)
```
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 由于该函数的执行过程需要传入加密口令，为了安全，gsql工具不会将包含该函数名字样的SQL记录入执行历史；即无法在gsql里通过上下翻页功能找到该函数的执行历史。
- 在存储过程的相关操作中避免调用该函数，避免敏感参数信息在日志中泄露的风险。建议在使用包含该函数的存储过程相关操作时，将该函数的参数信息过滤后再提供给外部维护人员定位，日志使用完毕后请及时删除。
- 在打开debug_print_plan开关的情况下避免调用该函数，避免敏感参数信息在日志中泄露的风险。建议在打开debug_print_plan开关生成的日志中对该函数的参数信息进行过滤后再提供给外部维护人员定位，日志使用完毕后请及时删除。
- 由于SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII，服务器把字节值0\~127根据 ASCII标准解释，而字节值128\~255则当作无法解析的字符。如果设置为SQL_ASCII，则不会编码转换。该函数调用openssl三方库返回的数据的编码为非ASCII数据，因此当数据库服务端字符集设置为SQL_ASCII时，客户端编码也需设置为SQL_ASCII ，否则会报错。因为数据库无法自动转换或者校验非ASCII字符。
 
 #### SHA
SHA(str)
描述：计算字符串str的SHA-1 160位检验和。
参数：str，字符串或数字。
返回值：字符串类型。40个十六进制数字组成的字符串。
示例：
```
m_db=# SELECT SHA('abc');
                   sha                    
------------------------------------------
 a9993e364706816aba3e25717850c26c9cd0d89d
(1 row)
```
#### SHA1
SHA1(str)
描述：SHA1是[SHA]函数的别名，功能用法相同。
示例：
```
m_db=# SELECT SHA1('abc');
                   sha1                   
------------------------------------------
 a9993e364706816aba3e25717850c26c9cd0d89d
(1 row)
```
#### SHA2
SHA2(str, hash_length)
描述：计算字符串str的SHA-2检验和。
参数：
str：字符串或数字。
hash_length：对应相应的SHA2算法，可选值为 0(SHA-256)、224(SHA-224)、256(SHA-256)、384(SHA-384)、512(SHA-512)，其他值将返回NULL。
返回值：字符串类型。40个十六进制数字组成的字符串。
示例：
```
m_db=# SELECT SHA2('abc', 224);
                           sha2                           
----------------------------------------------------------
 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
(1 row)
```
