lt_sm扩展为LightDB提供SM密码学函数,包括sm2、sm3、sm4算法。 可以使用上述算法对数据进行加密和解密。
请注意,当前的lt_sm扩展是试验版本。
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
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
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
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
其中,密钥文件需要包含 username
、database
、sm2私钥
、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