PGCrypto 插件提供了两类加密算法:单向加密和双向加密。

  • 单向加密属于不可逆加密,无法根据密文解密出明文,适用于数据的验证,例如登录密码验证。常用的单向加密算法有 MD5、SHA、HAC 等。这类加密算法能够保证相同的数据相同的密钥加密的结果是相同的。
  • 双向加密属于可逆加密,根据密文和密钥可解密出明文,适用于数据的安全传输,例如电子支付、数字签名等。常用的双向加密算法有 AES、DES、RSA、ECC 等。

kbcrypto 是以 pgcrypto插件为基础,增加了国密算法的支持。以下以Kingbase kbcrypto 插件为例,演示具体函数的使用。以下例子,除了 rc4 和 sm4 函数外,所有的例子都同时在 PG12.3 和 KINGBASE V8R6 进行过验证。

一、kbcrypto 包含的函数

test=# \dx+ kbcrypto
Objects in extension "kbcrypto"
Object description
-------------------------------------------------------
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

二、单向加密

1、digest

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');
encode
------------------------------------------------------------------
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

其中,encode 函数用于将二进制字符串转换为十六进制的文本。

2、hmac

与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');
encode
------------------------------------------------------------------
d0ba06791b5e37aa5ccb28535a5894d82ce39c5401ef4486211e2e6b553b9d3d

3、crypt

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'));
crypt
------------------------------------
$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1
(1 row) test=# select crypt('abc','$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1');
crypt
------------------------------------
$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1
(1 row) test=# select crypt('abcd','$1$NFHmXmm7$rwLqQ24kN3IkLyHzs.UrC1');
crypt
------------------------------------
$1$NFHmXmm7$nkmVGJH7Sci5EqoIYUuma0
(1 row)

gen_salt() 每次都会生成不同的值,要验证密码的准确性,只要将原加密结果做为salt。实际应用常见的验证密码是否正确的方式:password = crypt('abc', password);

二、双向加密

PGP 加密函数实现了 OpenPGP(RFC 4880)标准中的加密功能,包括对称密钥加密(私钥加密)和非对称密钥加密(公钥加密)。

1、对称密钥加密

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');
pgp_sym_encrypt
----------------------------------------------------------------------------------------------------------------------------------------------
\xc30d04070302f93fbd59b40bf7fd71d2340175c19d234d275f5b8ae668fecbbdfd80f0e94185f07dee15cb6d2b0dfbfdf08c98648e07da8f3d8902bb3dd349fdb36860a1ff
(1 row) test=# select pgp_sym_decrypt(pgp_sym_encrypt('abc','key_value'),'key_value');
pgp_sym_decrypt
-----------------
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)

2、非对称公钥加密

具体见:https://www.cnblogs.com/kingbase/p/14814842.html

3、其他双向加解密函数

具体函数:

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 的可能取值如下:

  • bf,Blowfish 算法
  • aes,AES 算法(Rijndael-128、-192 或者-256)

具体例子如下:

test=# select encrypt('abc','key1','bf');
ENCRYPT
--------------------
\xa071d8f60a60180a
(1 row) test=# select decrypt('\xa071d8f60a60180a','key1','bf');
DECRYPT
----------
\x616263
(1 row) test=# select encode(decrypt('\xa071d8f60a60180a','key1','bf'),'escape');
ENCODE
--------
abc
(1 row)

不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。

test=# select rc4('abc','key1',0);   --0, 表示加密
RC4
----------
\x05b062
(1 row) test=# select rc4(rc4('abc','key1',0),'key1',1); --1,表示解密
RC4
----------
\x616263
(1 row) test=# select encode(rc4(rc4('abc','key1',0),'key1',1),'escape');
ENCODE
--------
abc
(1 row)

三、国密算法支持

SM4算法是一种分组密码算法,其分组长度为128bit,密钥长度也为128bit,长度不够补 0x00。

test=# select sm4('abc','key1',0);      --0 , 加密
SM4
------------------------------------
\x875fdc780aa92500b8c0b17ed82e9ab9
(1 row) test=# select sm4(sm4('abc','key1',0),'key1',1); --1 , 解密
SM4
----------
\x616263
(1 row) test=# select encode(sm4(sm4('abc','key1',0),'key1',1),'escape');
ENCODE
--------
abc
(1 row)

  

PGCrypto 加密组件使用的更多相关文章

  1. C#Excel文件加密实现,支持xlsx、docx、pptx(C#\Net\Asp.Net)

    从此刻开始,我已封闭!概不接客! 像风一样的男人,像风一样的性格,无拘无束,不拘一格.那么问题来了,当风遇到沙,不一定你是风儿,我是沙儿的缠缠绵绵,.也许是漫天黄沙,飞粒走石.如果我们期望擒住这漫天的 ...

  2. 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】

    加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...

  3. php源码安全加密之PHP混淆算法.

    php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧.PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法.一\PHP的加密总 ...

  4. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  5. 自己写的AES和RSA加密解密工具

    package com.sdyy.common.utils; import java.security.Key; import java.security.KeyFactory; import jav ...

  6. RSA加密工具包

    主要参考: http://www.blogjava.net/icewee/archive/2012/05/19/378570.html http://snowolf.iteye.com/ 基于以上代码 ...

  7. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  8. Java实现 Base64、MD5、MAC、HMAC加密

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  9. MySQL加密的性能测试

    这是对MySQL进行加密性能测试的两篇文章系列之二.在第一篇中,我专门使用MySQL的内置的对SSL的支持来 做压力测试,产生了一些令人惊讶的结果. AD:WOT2015 互联网运维与开发者大会 热销 ...

随机推荐

  1. 过年了,基于Vue做一个消息通知组件

    前言 今天除夕,在这里祝大家新年快乐!!!今天在这个特别的日子里我们做一个消息通知组件,好,我们开始行动起来吧!!!项目一览 效果很简单,就是这种的小卡片似的效果. 我们先开始写UI页面,可自定义消息 ...

  2. SAP BPC 清除CUBE 中的数据

    原理:先根据模型和查询条件取出数据,然后把金额设置为0,再写回CUBE. 1.获取数据并清空金额 *&--------------------------------------------- ...

  3. SAP LUW 实现提交数据库更新

    CALL FUNCTION 'TRANSACTION_BEGIN' IMPORTING transaction_id = lv_transaction_id. * 更新日志表 MODIFY zfit0 ...

  4. SAP 实例 6 HTML input

    REPORT demo_html_input. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. PRIVATE SECTION. ...

  5. 重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用

    欢迎关注公众号:bin的技术小屋 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以 ...

  6. PTA(BasicLevel)-1023 组个最小数

    一. 问题定义 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位). 例如:给定两个 0,两个 1,三个 5,一个 8,我 ...

  7. Windows 进程的创建和终止

    创建一个进程 总述 如图,创建一个进程主要分为两部分,用户态部分和内核部分. 既然我们想看看一个进程是怎么被创建的,那我们就用 WinDbg 来看看从用户态到内核态都调用了什么: 第一步:我们先看看 ...

  8. redis学习之数据类型

    <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Co ...

  9. axios&spring前后端分离传参规范总结

    前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本.比如:本文中为大家说明的前后端参数传递与接受方法.本文主要是面对前端使用axios,后端使用Spring进行参 ...

  10. npm run dev 启动项目报错我的解决办法

    我的报错截屏 解决方案   1.    config文件中 index 文件中的 host 值如果是数字串就将其改为 localhost 2.    再次尝试 如果有遇到其他问题阔以将 node-mo ...