E.20. lt_sm

E.20.1. 什么是lt_sm?
E.20.2. 函数用法
E.20.3. 密钥管理

E.20.1. 什么是lt_sm?

lt_sm扩展为LightDB提供SM密码学函数,包括sm2、sm3、sm4算法。 可以使用上述算法对数据进行加密和解密。

请注意,当前的lt_sm扩展是试验版本。

E.20.2. 函数用法

E.20.2.1. SM2

SM2是非对称加密,有一对密钥,私钥用于加密,公钥用于解密。

SM2共有四个函数:

  • gm_sm2_genprikey(local_storage bool) return text 生成SM2私钥,用于加密数据。 输入参数 true 表示将密钥存储在数据库中,此时返回值为true。 输入参数 false 表示在数据库重启时从外部导入密钥,返回值为文本类型的私钥字符串。

        -- Generate SM2 private key using local storage
        SELECT gm_sm2_genprikey(true);
         gm_sm2_genprikey
        ------------------
         true
    
        -- Generate SM2 private key using external import
        SELECT gm_sm2_genprikey(false);
                                 gm_sm2_genprikey
        ------------------------------------------------------------------
         -----BEGIN EC PRIVATE KEY-----                                  +
         MHcCAQEEIMattGsrutK0T7YFtJ/nRL3HzUTSoBuW+l78TYuthSEXoAoGCCqBHM9V+
         AYItoUQDQgAEv12xwVT9SD4/qOqB8EYZkbMyl2APj3sOBHq0krHUSlQ0UbVOcJls+
         v1JkxGQSJ+EGXbmuhRErwiAu9gTd8+umlw==                            +
         -----END EC PRIVATE KEY-----                                    +
                        
  • gm_sm2_genpubkey((local_storage bool) return text 生成SM2公钥,用于解密数据。 输入参数 true 表示将密钥存储在数据库中,此时返回值为true。 输入参数 false 表示在数据库重启时从外部导入密钥,返回值为文本类型的私钥字符串。 注意,在使用此函数生成公钥之前,必须使用 gm_sm2_genprikey() 函数生成私钥。

        -- Generate SM2 public key using local storage
        SELECT gm_sm2_genpubkey(true);
         gm_sm2_genprikey
        ------------------
         true
    
        -- Generate SM2 public key using external import
        SELECT gm_sm2_genpubkey(false);
                                 gm_sm2_genpubkey
        ------------------------------------------------------------------
         -----BEGIN PUBLIC KEY-----                                      +
         MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEv12xwVT9SD4/qOqB8EYZkbMyl2AP+
         j3sOBHq0krHUSlQ0UbVOcJlsv1JkxGQSJ+EGXbmuhRErwiAu9gTd8+umlw==    +
         -----END PUBLIC KEY-----                                        +
                        
  • gm_sm2_encrypt(plaintext bytea) return bytea 将明文加密为密文, 输入参数为明文,返回值为密文。

        -- Encrypt plaintext to generate ciphertext
        select gm_sm2_encrypt('恒生电子LightDB_001');
                                                                                                                           gm_sm2_encrypt
        ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         \x043f115fde4ad84ca331e6d6edbeb806d09ffa6094f8d52a57a39c7c6c587bcd06eb72146f3d503923af813fa67de1c5f484e5b657c83d9f332b9263d08d6b2a42ae6bd733bec7f6b17ebc74783ebc7eba0dff68b269edfa44a54751527f7204d4e30a2ddb44ebbb5ea1864657e86225100b00e581ac6e84
                        
  • gm_sm2_decrypt(ciphertext bytea) return bytea 将密文解密为明文, 输入参数为密文,返回值为明文。

        -- Decrypt ciphertext to generate plaintext
        select gm_sm2_decrypt('\x043f115fde4ad84ca331e6d6edbeb806d09ffa6094f8d52a57a39c7c6c587bcd06eb72146f3d503923af813fa67de1c5f484e5b657c83d9f332b9263d08d6b2a42ae6bd733bec7f6b17ebc74783ebc7eba0dff68b269edfa44a54751527f7204d4e30a2ddb44ebbb5ea1864657e86225100b00e581ac6e84');
                          gm_sm2_decrypt
        --------------------------------------------------
         \xe68192e7949fe794b5e5ad904c6967687444425f303031
    
        -- Convert the decrypted binary plaintext to display
        select convert_from('\xe68192e7949fe794b5e5ad904c6967687444425f303031', 'SQL_ASCII');
            convert_from
        ---------------------
         恒生电子LightDB_001
                        

E.20.2.2. SM3

SM3是一种密码哈希算法,主要用于数字签名和验证、消息认证码生成和验证、随机数生成等。

SM3共有一个函数:

  • gm_sm3_encrypt(plaintext bytea) return bytea 将明文信息加密为摘要信息, 输入参数为明文信息,返回值为摘要信息。

        -- plaintext message to generate digest message
        select gm_sm3_encrypt('LightDB_002');
                                   gm_sm3_encrypt
        --------------------------------------------------------------------
         \x9de35b686bec17533e9ded7abfb039320bb08abbcec74eb0f44cf52b09e255c1
                        

E.20.2.3. SM4

SM4是对称加密,使用CTR-128位模式,有一个密钥用于加密和解密。

SM4共有三个函数:

  • gm_sm4_genkey((local_storage bool) return text 生成SM4密钥,用于加密和解密数据。 输入参数 true 表示将密钥存储在数据库中,此时返回值为true。 输入参数 false 表示在数据库重启时从外部导入密钥,返回值为文本类型的密钥字符串。

        -- Generate SM4 key using local storage
        select gm_sm4_genkey(true);
         gm_sm4_genkey
        ---------------
         true
    
         -- Generate SM4 key using external import
         select gm_sm4_genkey(false);
                   gm_sm4_genkey
         ----------------------------------
          A98B1904E5A74CDA5B2135519B941703
                        
  • gm_sm4_encrypt(plaintext bytea) return bytea 将明文加密为密文, 输入参数为明文,返回值为密文。

        -- Encrypt plaintext to generate ciphertext
        select gm_sm4_encrypt('恒生电子LightDB_003');
                          gm_sm4_encrypt
        --------------------------------------------------
         \x33e7117d0ce6f38ec2b78bfab08b991628771bedeeecf8
                        
  • gm_sm4_decrypt(ciphertext bytea) return bytea 将密文解密为明文, 输入参数为密文,返回值为明文。

        -- Decrypt ciphertext to generate plaintext
        select gm_sm4_decrypt('\x33e7117d0ce6f38ec2b78bfab08b991628771bedeeecf8');
                          gm_sm4_decrypt
        --------------------------------------------------
         \xe68192e7949fe794b5e5ad904c6967687444425f303033
    
        -- Convert the decrypted binary plaintext to display
        select convert_from('\xe68192e7949fe794b5e5ad904c6967687444425f303033', 'SQL_ASCII');
            convert_from
        ---------------------
         恒生电子LightDB_003
                        

E.20.3. 密钥管理

lt_sm支持两种密钥管理方法:

  • 密钥存储在本地,使用密钥生成函数时输入参数为true。 生成密钥后,可以使用加密和解密函数。

  • 密钥从外部导入,使用生成密钥函数的输入参数为false。 如果数据库重启,支持外部导入密钥文件。

        -- When using lt_ctl, specify the -Y parameter to pass in the key file
        lt_ctl -D ./data -Y ./keyfile start
                    

    其中,密钥文件需要包含 usernamedatabasesm2私钥sm2公钥sm4密钥 关键词,使用 : 分隔关键词和值:

        -- key file format, the corresponding pre-keyword and ':' must contain
        username:lightdb
        database:postgres
        sm2 private key:-----BEGIN EC PRIVATE KEY-----
        MHcCAQEEIC4cBmYiht3Kf4e/xQMNR3C2pLkafZ8Lm9lUxae937SjoAoGCCqBHM9V
        AYItoUQDQgAEdqAwhgrpt7NNBVKWuyXy8ltIlcl1YQhyum1GE3G4QK3lfVBCgSYF
        O5+fNfThT1ppVC+Q11wJ/QJmciYVEDzY8A==
        -----END EC PRIVATE KEY-----
        sm2 public key:-----BEGIN PUBLIC KEY-----
        MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEdqAwhgrpt7NNBVKWuyXy8ltIlcl1
        YQhyum1GE3G4QK3lfVBCgSYFO5+fNfThT1ppVC+Q11wJ/QJmciYVEDzY8A==
        -----END PUBLIC KEY-----
        sm4 key:2DB5E313E60A123DBB1A517B5355A7AC