手动加密

为用户提供了如下密钥管理、加密、解密函数。

add_cipher(keyid INT4, password TEXT, key TEXT, mode TEXT);

功能: 增加密钥定义,密钥定义属于当前登录用户。

参数: keyid:密钥ID。

password:加密密钥的主密钥,初始化需要使用主密钥解密密钥定义。

key:密钥,用于加密数据。

mode:加密模式。格式为:[算法][密钥长度]_[链接模式]_[填充方式]。

其中:

算法:支持aes、des、sm4。

密钥长度:aes算法需指定长度为128、192、或256,其余算法无需指定。

链接模式:aes、des算法支持ecb、cbc、ofb、cfb;sm4支持ecb、cbc、cfb128、ofb、ctr。

填充方式:支持pkcs5、zero、none。

后续加密、解密函数中mode参数同此处格式。

返回值:采用aes128_cbc_pkcs5模式,通过主密钥加密的密钥,即key的密文。

注意: 密钥定义只有通过初始化后,才能在encrypt和decrypt中使用该密钥ID,否则将认为密钥不存在。

remove_cipher(keyid INT4);

功能: 删除会话登录用户定义的密钥。

参数: keyid:密钥ID。

返回值:删除是否成功。

init_cipher(password TEXT);

init_cipher(password TEXT, keyid INT4);

功能:初始化登录用户的密钥。

参数:

password 用于保护密钥的密码,即主密钥。必须与定义密钥时一致才能初始化相应的密钥定义。

keyid:指定需要初始化的密钥ID。若没有指定密钥ID,系统尝试用主密钥初始化会话登录用户的所有密钥。换个角度,如果提供主密钥不正确,不会初始化任何密钥。当指定的密钥ID不存在时,系统将报错。

返回值:初始化是否成功。

注意: 初始化操作仅针对当前登录用户定义的密钥;且用户的同一密钥,不同会话需要各自进行初始化操作后才可以使用。

encrypt(data TEXT, key TEXT, mode TEXT);

功能: 加密文本数据。

参数: data:待加密数据。

key:密钥。

mode:加密模式。

返回值:密文。

encrypt(data TEXT, keyid INT4);

功能: 加密文本数据。

参数: data:待加密数据。

keyid:密钥ID。

返回值:密文。

decrypt(data TEXT, key TEXT, mode TEXT);

功能: 解密文本数据。

参数: data:待解密数据。

key:密钥。

mode:解密模式。

返回值:明文。

decrypt(data TEXT, keyid INT4);

功能: 解密文本数据。

参数: data:待解密数据。

keyid:密钥ID。

返回值:明文。

key_encrypt(data VARBINARY, mode TEXT, key VARBINARY, iv VARBINARY);

功能: 加密二进制数据。

参数: data:待加密数据。

mode:加密模式。

key:密钥。

iv:初始向量。

返回值:密文。

key_encrypt(data VARBINARY, keyid INT4, iv VARBINARY);

功能: 加密二进制数据。

参数: data:待加密数据。

keyid:密钥ID。

iv:初始向量。

返回值:密文。

key_decrypt(data VARBINARY, mode TEXT, key VARBINARY, iv VARBINARY);

功能: 解密二进制数据。

参数: data:待解密数据。

mode:加密模式。

key:密钥。

iv:初始向量。

返回值:明文。

key_decrypt(data VARBINARY, keyid INT4, iv VARBINARY);

功能: 解密二进制数据。

参数: data:待解密数据。

keyid:密钥ID。

iv:初始向量。

返回值:明文。

phrase_encrypt(data VARBINARY, mode TEXT, key TEXT, iv TEXT);

功能: 短语加密二进制数据。

参数: data:待加密数据。

mode:加密模式。

key:密钥。

iv:初始向量。

返回值:密文。

phrase_encrypt(data VARBINARY, keyid INT4, iv TEXT);

功能: 短语加密二进制数据。

参数: data:待加密数据。

keyid:密钥ID。

iv:初始向量。

返回值:密文。

phrase_decrypt(data VARBINARY, mode TEXT, key TEXT, iv TEXT);

功能: 短语解密二进制数据。

参数: data:待解密数据。

mode:加密模式。

key:密钥。

iv:初始向量。

返回值:明文。

phrase_decrypt(data VARBINARY, keyid INT4, iv TEXT);

功能: 短语解密二进制数据。

参数: data:待解密数据。

keyid:密钥ID。

iv:初始向量。

返回值:明文。

使用密钥定义进行加密、解密示例:

CREATE TABLE cipher_app(data TEXT);

--  步骤1. 定义密钥
SELECT ADD_CIPHER(10,'abcdeabcdeabcdeabcde','miyao1','aes128_ecb_pkcs5');

--  步骤2. 初始化密钥
SELECT INIT_CIPHER('abcdeabcdeabcdeabcde');

--  步骤3. 指定密钥加密
INSERT INTO cipher_app SELECT ENCRYPT('abcde',10);

--  步骤4. 指定密钥解密
SELECT DECRYPT(data, 10) FROM cipher_app;

--  删除密钥定义
SELECT REMOVE_CIPHER(10);

--  查看系统中定义密钥
SELECT * FROM SYS_CIPHER;

DROP TABLE cipher_app;