首先介绍一下sm4 算法
SM4 算法是对称加密算法,国标 GB/T 32907 对 SM4 对称加密算法进行了详细描述。SM4 算法密钥长度固定为128bit,加密解密采用相同的密钥,加解密速度较快,优于AES算法。
SM4算法首先将加密信息进行分组,分组后通过异或、S盒变换、移位等操作进行分组明文的拓展。其中使用迭代方法实现铭文拓展,每轮迭代所采用的密钥经过加密类似的流程进行迭代生成,也就是说加密迭代和生成密钥迭代是对应的。因此,解密过程也能够通过密钥进行密文的迭代解密。
kbcrypto 插件
kbcrypto 是 KingbaseES 的一个扩展插件,可以提供如 rc4,sm3,sm4 等加密函数的访问,可以提供明文的加密打 印输出到前端
KingbaseES 数据库默认将它添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。默认是已存在。
插件 kbcrypto 的使用方法
-- 创建插件
\c test system create extension kbcrypto ;
CREATE EXTENSION
相关函数含义
rc4、sm3、sm4 三个函数入参都是三个
分别是
参数1、加解密文本
参数2、密钥
参数3、加解密标识 其中0 代表加密 1 代表解密
sm4_ex() 函数却别与rc4 、sm3、sm4 包含四个入参
参数1、加解密文本
参数2、密钥
参数3、加解密标识 其中0 代表加密 1 代表解密
参数4、填充模式。
1)填充模式选1, 数据按16字节倍数强制填充,缺m个字节则填充m个字节的m值(m最大值为16)。
2)填充模式选0,数据按16字节倍数非强制填充0x0, 同sm4。
函数使用示例
-- 1. sm3()函数
select sm3('123456abcdef');
-- 2. sm4()函数/rc4()函数
-- 加密:
select sm4('123456abcdef','0123456789ABCDEF',0);
select rc4('123456abcdef','0123456789ABCDEF',0);
-- 解密
select sm4(sm4('123456abcdef','0123456789ABCDEF',0), '0123456789ABCDEF',1);
select rc4(rc4('123456abcdef','0123456789ABCDEF',0), '0123456789ABCDEF',1);
-- 3. sm4_ex()函数(rc4函数没有ex函数扩展)
-- 1)填充模式选1
-- 加密:
select sm4_ex('123456abcdef','0123456789ABCDEF',0,1);
-- 解密
select sm4_ex(sm4_ex('123456abcdef','0123456789ABCDEF',0,1), '0123456789ABCDEF',1,1);
-- 2) 填充模式选0
-- 加密
select sm4_ex('123456abcdef','0123456789ABCDEF',0,0);
-- 解密
select sm4_ex(sm4_ex('123456abcdef','0123456789ABCDEF',0,0), '0123456789ABCDEF',1,0);
注意事项:
加解密函数的返回是二进制,所以不同bytes 格式返回的结果显示存在差异
可以通过调整参数set bytea_output to escape; 来进行设置。默认值时hex
hex:
"hex"格式将二进制数据编码为每字节2位十六进制数字, 最重要的四位(半字节)放在开始。整条字符串以\x开始 (与转义格式相区别)
escape:
"escape"格式是一种传统的 PostgreSQL格式。它采用以ASCII字符序列来表示二进制串的方法, 同时将那些无法表示成ASCII字符的二进制串转换成特殊的转义序列