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

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

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

一、kbcrypto 包含的函数

test=# \dx+ kbcryptoObjects 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 byteaencrypt_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. oushuDB之pgcrypto加密解密

    文章目录 参考 pgcrypto安装 功能介绍 digest() hmac() 密码哈希函数 crypt()支持的算法 crypt()迭代次数 hash算法速度 PGP 加密函数 公共秘钥 pgp_k ...

  2. mbedtls加密组件使用示例

    1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf = ...

  3. php扩展文件sg11,linux系统虚拟主机开启支持SourceGuardian(sg11)加密组件的详细步骤...

    注意:sg11我司只支持linux系统虚拟主机自主安装.支持php5.3及以上版本. 1.登陆主机控制面板,找到[远程文件下载]这个功能. 3.点击控制面板[php版本],选择php5.3或以上版本, ...

  4. Java中配置加密组件Bouncy_Castle

    Java6提供了多种算法支持,但并不完善,许多加密强度较高的算法,Java6未能提供.Bouncy Castle就是对Oracle提供的算法进行了扩展,比如IDEA.MD4.Rijndael.Serp ...

  5. phpstudy安装sg11组件_宝塔面板一键安装配置SG11加密组件教程

    宝塔面板用户安装SG11组件教程 以下教程适用于 宝塔 windows系统 6.x 以上面板 和 linux系统 7.x 以上版本 1.进入宝塔面板,点击软件管理,找到你网站对应的php如下图操作 2 ...

  6. phpstudy安装sg11组件_关于SG11加密使用、安装配置说明教程 sg11加密组件安装步骤...

    本帖最后由 商业源码网 于 2017-10-8 20:16 编辑 1.他是否需要扩展安装? 是的,这个必须安装,组件下载地址见你使用模块时出现错误提示里面的一个链接 1.png (7.01 KB, 下 ...

  7. pg加密扩展的安装_服务器安装SG11扩展教程,宝塔安装微擎加密组件SourceGuardian loader...

    同学们在安装模块或者程序的时候会出现这样的提示,是什么原因呢,下面为大家解答: PHP script '/www/wwwroot/jwq.poiu.cc/addons/xiaoyou_knowledg ...

  8. pg加密扩展的安装_postgresql的加密扩展插件pgcrypto

    近期测试了一下postgresql的加密扩展插件pgcrypto的aes加密 安装加密扩展插件:pgcrypto 在主节点上安装 create extension pgcrypto; aes加解密函数 ...

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

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

最新文章

  1. ORACLE用户权限管理笔记整理
  2. sap-通过定义物料组的评估类-设置无物料号的费用采购
  3. js中text方法是啥意识_一盏茶的时间,快速捕获JS中常用的方法(细心整理,持续更新ing)...
  4. 前端工程师面试题汇总
  5. 数学在计算机科学上的应用文献,数学计算机论文,关于计算机在数学教学中的应用相关参考文献资料-免费论文范文...
  6. [转]python中去掉字符串中的\xa0、\t、\n
  7. php删除数组中相同的元素,只保留一个相同元素
  8. 天刀服务器未响应,天涯明月刀卡顿怎么办 教你如何优化游戏不在卡顿
  9. 什么是GreenSock动画平台?
  10. ASP.NET负压测试
  11. win8计算机显示在桌面快捷方式,win10、win8.1系统桌面快捷方式图标显示异常怎么办-系统操作与应用 -亦是美网络...
  12. Design Compiler工具学习笔记(5)
  13. Flask 框架(四)— 表单处理
  14. 致奋斗的年轻人 阿里云在云栖大会等你
  15. js如何实现四舍五入 Math.round()
  16. java 获取操作系统的参数_JAVA获取系统变量
  17. 何为SCA?听听一枚产品汪妹子的纯干货分享
  18. SQLyog —— 图形化工具使用
  19. 搋子[chuāi zi]工作原理//2021-1-28
  20. 第一次有人把“MACD”运用得出神入化,我整整读了10遍,太通透了

热门文章

  1. 关于Uncaught TypeError (Cannot read property ..undefined)的解决办法
  2. 基于C#+Mysql实现(WinForm)企业的设备管理系统【100010018】
  3. Mac上备份iphone照片
  4. 极速办公Word文档的查找和替换功能键在哪?
  5. Android 之路56---AIDL建立远程通信
  6. 【​CES观察】我单反相机都带了,你就给我看这个?
  7. 当前NBIoT设备的省电技术之PSM/DRX/eDRX
  8. java生成随机密码,包含大小写字母,数字,特殊字符等
  9. 全面讨论泛化 (generalization) 和正则化 (regularization) — Part 1
  10. 【SAS应用统计分析】软件的基本操及SAS数据集的整理