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