LightDB对国密算法的支持

国密即国家密码局认定的国产密码算法,目前应用较多的是SM2、SM3和SM4算法。其中SM2为非对称算法,存在公钥和私钥,加解密必须配对使用;SM3为哈希摘要算法,主要用于摘要认证;SM4为分组对称算法,加解密均使用同一个密钥。当前LightDB已经支持了国密SM2/SM3/SM4三种算法,集成在lt_sm插件中。

1. SM2

共有四个功能函数,分别是生成公钥,生成私钥,加密,解密:

1)gm_sm2_genprikey(local_storage bool) return text

      生成用于加密数据的 SM2 私钥。入参true表示key存入数据库,此时返回值为true。入参false表示重启数据库时从外部导入key,返回值为text类型的私钥字符串。

 2)gm_sm2_genpubkey((local_storage bool) return text

       生成用于解密数据的 SM2 公钥。入参true表示key存入数据库,此时返回值为true。入参false表示重启数据库时从外部导入key,返回值为text类型的私钥字符串。请注意,必须先使用gm_sm2_genprikey()函数生成私钥,然后才能使用该函数生成公钥,且生成公钥选择的存储方式需与私钥保持一致。

 3)gm_sm2_encrypt(plaintext bytea) return bytea

      将明文加密为密文,输入参数为明文,返回值为密文。

 4)gm_sm2_decrypt(ciphertext bytea) return bytea

      将密文解密为明文,入参为密文,返回值为明文。

2. SM3

共有一个功能函数,即摘要加密:

1)gm_sm3_encrypt(plaintext bytea) return bytea

      加密明文消息为摘要消息,输入参数为明文消息,返回值为摘要消息。

3. SM4

共有三个功能函数,分别是生成密钥,加密,解密:

1)gm_sm4_genkey((local_storage bool) return text

      生成用于加密和解密数据的 SM4 密钥。入参true表示key存入数据库,此时返回值为true。入参false表示重启数据库时从外部导入key,返回值为text类型的key字符串。

 2)gm_sm4_encrypt(plaintext bytea) return bytea

      将明文加密为密文,输入参数为明文,返回值为密文。

3)gm_sm4_decrypt(ciphertext bytea) return bytea

      将密文解密为明文,入参为密文,返回值为明文。

4. 密钥管理

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

1)密钥存储在本地,在使用密钥生成函数中输入参数为true。生成密钥后,就可以使用加密和解密功能了。

2)密钥是从外部导入的,生成密钥函数的输入参数为false。如果数据库重启,支持外部导入关键文件。此时使用lt_ctl时,指定-Y传入key文件的参数 :lt_ctl -D ./data -Y ./keyfile start

其中,密钥文件需要包含用户名、数据库、sm2私钥、sm2公钥、sm4密钥的关键字,使用冒号分隔开关键字和值,keyfile具体内容举例如下:

  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

5. 注意事项
1)同一用户和数据库下,SM2、SM4仅支持一组算法密钥,重复生成的密钥会循环覆盖。
2)使用SM2算法时,必须先生成私钥,然后再生成公钥,且公钥与私钥的存储方式应保持一致。
3)当SM2、SM4算法没有使用加解密功能时,生成密钥函数可以随意调用;如果已经使用了对应算法的加密功能,则无法再次使用生成密钥接口重新生成密钥,这样是为了防止原被覆盖导致已加密的数据无法解密而丢失。
4)国密算法支持集成在lt_sm插件中,如果已经使用了加解密功能,则该插件禁止drop extension,防止因密钥丢失导致数据无法解密丢失;
5)在分布式数据库环境中,lt_sm插件的lt_sm_key_ext_stat存储密钥表需使用canopy插件的分布式特性,此时删除canopy插件会依赖报错,如果强制删除可能会引起lt_sm密钥丢失而导致密文数据无法解密。
posted @ 2022-07-02 09:21  小小罗的背影  阅读(312)  评论(0)    收藏  举报