PGCrypto 插件提供了两类加密算法:单向加密和双向加密。
kbcrypto 是以 pgcrypto插件为基础,增加了国密算法的支持。以下以Kingbase kbcrypto 插件为例,演示具体函数的使用。以下例子,除了 rc4 和 sm4 函数外,所有的例子都同时在 PG12.3 和 KINGBASE V8R6 进行过验证。
test=# \dx+ kbcrypto
Objects in extension "kbcrypto"
function armor(bytea)
function armor(bytea,text[],text[])
function crypt(text,text)
function dearmor(text)
function decrypt(bytea,bytea,text)
function decrypt_iv(bytea,bytea,bytea,text)
function digest(bytea,text)
function digest(text,text)
function encrypt(bytea,bytea,text)
function encrypt_iv(bytea,bytea,bytea,text)
function gen_random_bytes(integer)
function gen_random_uuid()
function gen_salt(text)
function gen_salt(text,integer)
function hmac(bytea,bytea,text)
function hmac(text,text,text)
function pgp_armor_headers(text)
function pgp_key_id(bytea)
function pgp_pub_decrypt(bytea,bytea)
function pgp_pub_decrypt_bytea(bytea,bytea)
function pgp_pub_decrypt_bytea(bytea,bytea,text)
function pgp_pub_decrypt_bytea(bytea,bytea,text,text)
function pgp_pub_decrypt(bytea,bytea,text)
function pgp_pub_decrypt(bytea,bytea,text,text)
function pgp_pub_encrypt_bytea(bytea,bytea)
function pgp_pub_encrypt_bytea(bytea,bytea,text)
function pgp_pub_encrypt(text,bytea)
function pgp_pub_encrypt(text,bytea,text)
function pgp_sym_decrypt_bytea(bytea,text)
function pgp_sym_decrypt_bytea(bytea,text,text)
function pgp_sym_decrypt(bytea,text)
function pgp_sym_decrypt(bytea,text,text)
function pgp_sym_encrypt_bytea(bytea,text)
function pgp_sym_encrypt_bytea(bytea,text,text)
function pgp_sym_encrypt(text,text)
function pgp_sym_encrypt(text,text,text)
function rc4(bytea,bytea,integer)
function sm4(bytea,bytea,integer)
function sm4_ex(bytea,bytea,integer,integer)
(39 rows)
相比于 pgcrypto , KINGBASE kbcrypto 增加了 rc4 与国密算法支持sm4 , sm4_ex
digest() 函数可以根据不同的算法进行加密,没有密钥。相同的数据加密的结果相同。语法如下:
digest(data text, type text) returns bytea
digest(data bytea, type text) returns bytea
其中,data 是原始数据;type 是加密算法,包括 md5、sha1、sha224、sha256、sha384 以及 sha512;函数的返回结果为二进制字符串。
test=# select encode(digest('abc','sha256'),'hex');
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
其中,encode 函数用于将二进制字符串转换为十六进制的文本。
与digest 不同,hmac 支持加密密钥。相同数据、相同密钥加密结果相同。语法如下:
hmac(data text, key text, type text) returns bytea
hmac(data bytea, key bytea, type text) returns bytea
其中,data 是原始数据;key 是加密密钥;type 是加密算法,包括 md5、sha1、sha224、sha256、sha384 以及 sha512;
test=# select encode(hmac('abc','keyvalue','sha256'),'hex');
d0ba06791b5e37aa5ccb28535a5894d82ce39c5401ef4486211e2e6b553b9d3d
crypt() 和 gen_salt() 函数专用于密码加密,其中 crypt() 用于加密数据,gen_salt() 用于生成 salt(加盐)。对于相同的密码,crypt() 函数每次也会返回不同的结果,因为 gen_salt() 函数每次都会生成不同的 salt。语法如下:
crypt(password text, salt text) returns text
gen_salt(type text [, iter_count integer ]) returns text
gen_salt() 函数每次都会生成一个随机的盐值字符串,该字符串同时决定了 crypt() 函数使用的算法;type 参数用于指定一个生成字符串的哈希算法,可能的取值包括 des、xdes、md5 以及 bf。
test=# select crypt('abc',gen_salt('md5'));
$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1
(1 row)
test=# select crypt('abc','$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1');
$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1
(1 row)
test=# select crypt('abcd','$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1');
$1$NFHmXmm7$nkmVGJH7Sci5EqoIYUuma0
(1 row)
gen_salt() 每次都会生成不同的值,要验证密码的准确性,只要将原加密结果做为salt。实际应用常见的验证密码是否正确的方式:password = crypt('abc', password);
PGP 加密函数实现了 OpenPGP(RFC 4880)标准中的加密功能,包括对称密钥加密(私钥加密)和非对称密钥加密(公钥加密)。
pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea
pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text
pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea
其中,data 是要加密的数据;psw 是 PGP 对称密钥;options 设置选项
使用例子:
test=# select pgp_sym_encrypt('abc','key_value');
\xc30d04070302f93fbd59b40bf7fd71d2340175c19d234d275f5b8ae668fecbbdfd80f0e94185f07dee15cb6d2b0dfbfdf08c98648e07da8f3d8902bb3dd349fdb36860a1ff
(1 row)
test=# select pgp_sym_decrypt(pgp_sym_encrypt('abc','key_value'),'key_value');
abc
(1 row)
options 使用:
pgp_sym_encrypt(data, password, 'compress-algo=1, cipher-algo=aes256')
常用的option有:
cipher-algo,使用的密码算法,可以是 bf、aes128(默认值)、aes192、aes256;
compress-algo,使用的压缩算法,只有编译 PostgreSQL 时使用了 zlib 参数可用。可以是:0,不压缩,默认值;1,ZIP 压缩;2,ZLIB 压缩(ZIP 加上元数据和 CRC)
具体见:https://www.cnblogs.com/kingbase/p/14814842.html
具体函数:
encrypt(data bytea, key bytea, type text) returns bytea
decrypt(data bytea, key bytea, type text) returns bytea
encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea
rc4(bytea,bytea,integer)
其中,data 是需要加密的数据;type 用于指定加密方法。 algorithm 的可能取值如下:
具体例子如下:
test=# select encrypt('abc','key1','bf');
\xa071d8f60a60180a
(1 row)
test=# select decrypt('\xa071d8f60a60180a','key1','bf');
\x616263
(1 row)
test=# select encode(decrypt('\xa071d8f60a60180a','key1','bf'),'escape');
abc
(1 row)
不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。
test=# select rc4('abc','key1',0); --0, 表示加密
\x05b062
(1 row)
test=# select rc4(rc4('abc','key1',0),'key1',1); --1,表示解密
\x616263
(1 row)
test=# select encode(rc4(rc4('abc','key1',0),'key1',1),'escape');
abc
(1 row)
SM4算法是一种分组密码算法,其分组长度为128bit,密钥长度也为128bit,长度不够补 0x00。
test=# select sm4('abc','key1',0); --0 , 加密
\x875fdc780aa92500b8c0b17ed82e9ab9
(1 row)
test=# select sm4(sm4('abc','key1',0),'key1',1); --1 , 解密
\x616263
(1 row)
test=# select encode(sm4(sm4('abc','key1',0),'key1',1),'escape');
abc
(1 row)
手机扫一扫
移动阅读更方便
你可能感兴趣的文章