
# DWS字符串加解密
DWS支持使用以下函数对字符串进行加解密。
- gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod) 描述：采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法，以keystr为密钥对encryptstr字符串进行加密，返回加密后的字符串。支持的cryptotype：aes128, aes192, aes256, sm4。支持的cryptomode：cbc。支持的hashmethod：sha256, sha384, sha512, sm3。支持的加密数据类型：目前数据库支持的数值类型，字符类型，二进制类型中的RAW，日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。keystr的长度范围与加密算法相关，为1\~KeyLen字节。当cryptotype为aes128和sm4时，KeyLen为16，aes192时KeyLen为24，aes256时KeyLen为32。
  返回值类型：text
  返回值长度：至少为 4\*\[(maclen + 56)/3\] 字节，不超过 4\*\[(Len + maclen + 56)/3\] 字节，其中Len为加密前数据长度（单位为字节），maclen为HMAC值的长度，当hashmethod为sha256和sm3时maclen为32，sha384时maclen为48，sha512时maclen为64。即当hashmethod为sha256和sm3时，返回值长度至少为120字节，不超过4\*\[(Len + 88)/3\] 字节；当hashmethod为sha384时，返回值长度至少为140字节，不超过4\*\[(Len + 104)/3\] 字节；当hashmethod为sha512时，返回值长度至少为160字节，不超过4\*\[(Len + 120)/3\] 字节；
  示例：
  ```
  SELECT gs_encrypt('DWS', '1234', 'aes128', 'cbc',  'sha256');
                                                          gs_encrypt                                                        
  --------------------------------------------------------------------------------------------------------------------------
  AAAAAAAAAAArYr4+WFD1Tew23KhoB7H7cPComVRqy3O/3CnSglER3lAw662L6QfI+ojFvHTRnqhS10KYbE+Xui5kYU5Hn56l7QaG6VuCKG84uZ9X8+nYXw==
  (1 row)
  ```
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
  - 由于该函数的执行过程需要传入解密口令，为了安全起见，gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
  
  - 在同一张数据表中，加密函数gs_encrypt与gs_encrypt_aes128不要混合使用。
    
- gs_decrypt(decryptstr, keystr, cryptotype, cryptomode, hashmethod) 描述：采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法，以keystr为密钥对decryptstr字符串进行解密，返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
  返回值类型：text
  示例：
  ```
  SELECT gs_decrypt('AAAAAAAAAAArYr4+WFD1Tew23KhoB7H7cPComVRqy3O/3CnSglER3lAw662L6QfI+ojFvHTRnqhS10KYbE+Xui5kYU5Hn56l7QaG6VuCKG84uZ9X8+nYXw==', '1234', 'aes128', 'cbc', 'sha256');
    gs_decrypt  
  --------------
   DWS
  (1 row)
  ```
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
  - 由于该函数的执行过程需要传入解密口令，为了安全起见，gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
  
  - 此函数需要结合gs_encrypt加密函数共同使用，且加密算法和HMAC算法要保证一致。
    
- gs_encrypt_aes128(encryptstr,keystr) 描述：以keystr为密钥对encryptstr字符串进行加密，返回加密后的字符串。keystr的长度范围为1\~16字节。支持的加密数据类型：目前数据库支持的数值类型，字符类型，二进制类型中的RAW，日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。
  返回值类型：text
  返回值长度：至少为92字节，不超过 4\*\[(Len+68)/3\] 字节，其中Len为加密前数据长度（单位为字节）。
  示例：
  ```
  SELECT gs_encrypt_aes128('DWS','1234');
                                        gs_encrypt_aes128
  ----------------------------------------------------------------------------------------------
   ZrCp794vO5I9qJ+jHFf/sQqRyMBy0lKIDGP5S8RJXzgmpXoa/e4EgmK82P5y5xe1bOXbJeoNxyHagK9OhPVVeJDbn/M=
  (1 row)
  ```
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
  - 由于该函数的执行过程需要传入解密口令，为了安全起见，gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
  
  - 在同一张数据表中，加密函数gs_encrypt_aes128与gs_encrypt不要混合使用。
    
- gs_decrypt_aes128(decryptstr,keystr) 描述：以keystr为密钥对decryptstr字符串进行解密，返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
  返回值类型：text
  示例：
  ```
  SELECT gs_decrypt_aes128('ZrCp794vO5I9qJ+jHFf/sQqRyMBy0lKIDGP5S8RJXzgmpXoa/e4EgmK82P5y5xe1bOXbJeoNxyHagK9OhPVVeJDbn/M=','1234');
   gs_decrypt_aes128
  -------------------
   DWS
  (1 row)
  ```
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
  - 由于该函数的执行过程需要传入解密口令，为了安全起见，gsql工具不会将该函数记录入执行历史。即无法在gsql里通过上下翻页功能找到该函数的执行历史。
  
  - 此函数需要结合gs_encrypt_aes128加密函数共同使用。
    
- gs_hash(hashstr, hashmethod) 描述：以hashmethod算法对hashstr字符串进行信息摘要，返回信息摘要字符串。支持的hashmethod：sha256, sha384, sha512, sm3。
  返回值类型：text
  返回值长度：sha256和sm3返回64字节，sha384返回96字节，sha512返回128字节。
  示例：
  ```
  SELECT gs_hash('DWS', 'sha256');
                                               gs_hash                                              
  --------------------------------------------------------------------------------------------------
   1d595d9e342bccc3b158fabfcdfece54d9f821cf9c7461c5d3b6c0157c442f94
  (1 row)
  ```
  
- md5(string) 描述：将string使用MD5加密，并以16进制数作为返回值。
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
  MD5的安全性较低，不建议使用。
  返回值类型：text
  示例：
  ```
  SELECT md5('ABC');
                 md5                
  ----------------------------------
   902fbdd2b1df0c4f70b4a5d23525e932
  (1 row)
  ```
  
 
