当前位置: 首页 > postgresql > 正文

使用pgcrypto对pg数据进行加/解密

需要为pg中某些列进行加密,并且还要能够对加密的数据进行解密。

很明显,要解密就需要对称加密算法了,恰好pg的pgcrypto插件中有几个函数可以达到要求,发现网上关于这块的中文资料不是太多,这里就贴出来吧

1. 安装插件的方法就不提了,如果模块存在的话,直接 create extension 即可

2. 基本对称加密

encrypt 和 decrypt函数可以对数据进行对称加密,加密的算法包括 AES 和 BOOLFISH,使用方法如下

	create table test_pgcrypto(id int, name varchar(100), password text);
	insert into test_pgcrypto values(1, 'klwang', encrypt('name', 'password', 'aes'));

	select id, name, convert_from(decrypt(password::bytea, 'password', 'aes'), 'utf-8')
        from test_pgcrypto where id = 1;

三点注意的地方:
* encrypt函数第三个参数表示加密算法,可以选择aes或者bf
* decrypt只支持bytea的解密,所以需要将待解密的列强转为bytea
* decrypt函数解密回来的函数是二进制流,需要使用convert_from函数转为可读的文本

3. pgp 对称加密

pgcrypto 还提供了一对函数pgp_sym_encrypt和pgp_sym_decrypt 来支持更丰富的加密算法

	pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
	pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text

可以支持的算法有: bf, aes128, aes192, aes256 (OpenSSL-only: 3des, cast5)

加解密示例:

	insert into test_pgcrypto values (2, 'klwang', pgp_sym_encrypt('hello_klwang', 
        'password', 'cipher-algo=aes256'));

	select id , name, pgp_sym_decrypt(password::bytea, 'password') from test_pgcrypto where id = 2;

如上:
pgp_sym_encrypt函数第三个参数表示加密的算法
pgp_sym_decrypt在解密的时候,可以省略解密算法,该函数可以自行猜测

4. 公/私钥加密

pgcrypto还支持一种更霸气的方法:公钥加密,私钥解密

首先,生成一对公私钥对

	gpg --gen-key

按照提示,生成钥匙对

	gpg --list-secret-keys 
		/home/klwang/.gnupg/secring.gpg
		-------------------------------
		sec   2048R/C69DC4F1 2014-09-28
		uid                  klwang (gpg) <klwang@klwang.info>
		ssb   2048R/498DBD09 2014-09-28

如上,498DBD09就是公钥, C69DC4F1就是私钥
导出钥匙对:

	gpg -a --export 498DBD09 > public.key
	gpg -a --export-secret-keys C69DC4F1 > secret.key

将钥匙对放到一个postgresql能读取的地方(data目录下),加密解密方式如下

	insert into test_pgcrypto values (3, 'klwang',
	pgp_pub_encrypt('klwang_passwd',
	dearmor(pg_read_file('keys/public.key'))));

	select id, name, pgp_pub_decrypt(password,
	dearmor(pg_read_file('keys/secret.key')), 'password') from test_pgcrypto where id = 3;

注意:
pg_read_file函数用来读取密钥文件
pgp_pub_decrypt函数的最后一个参数是用gpg –gen-key生成密钥对时输入的密码

    分享到:

本文固定链接: http://klwang.info/encrypt-and-decrypt-using-pgcrypto/ | 数据库|Linux|软件开发

该日志由 klwang 于2014年10月06日发表在 postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 使用pgcrypto对pg数据进行加/解密 | 数据库|Linux|软件开发

使用pgcrypto对pg数据进行加/解密:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter