在Postgresql中使用GPG实现数据非对称加密

下面描述的是使用GPG实现非对称加密的基本操作流程和SQL语句:

一、生成公钥和秘钥

在要生成公钥秘钥文件的系统上执行(因为操作时有弹出界面,所以不能在终端上执行。)

生成哪个用户的公钥秘钥文件,就由哪个用户在命令行进行操作:

1、gpg --gen-key,根据提示顺序操作,在系统内部生产key。

2、gpg --list-secret-keys,查看当前系统中生成的key。

3、gpg -a --export user > public.key,导出ID为user的公钥,当前操作用户为user。

4、gpg -a --export-secret-keys user > secret.key,导出ID为user的私钥。

 

二、将公钥和私钥的内容转换为字节流

通过vim可以查看public.key和secret.key两个文本文件,格式类似:

-----BEGIN PGP PUBLIC KEY BLOCK-----

Version: GnuPG v2.0.22 (GNU/Linux)

 

mQENBFp4GbsBCAC2Vb62/3ot8B+xA6/lyo65UdkXi71M+IxcBg3yOJbm++GPhf+A

pQmlXmiR98OyDE3ltr4DA5jAQqoxQYi6Xs/2FiZH4CaMaZlJw5BNFw9gVtam2ILd

….

=NlkM

-----END PGP PUBLIC KEY BLOCK-----

(每次生成的内容不一样)

使用时,登录数据库,使用数据库函数select dearmor(‘’);将这两个key分别转化为需要的字符串。

 

三、公钥私钥的实际使用方法

由于select dearmor转化的字符串非常长,单独使用不方便,因此可以创建一个表,将转化的字符串存到这个表中,执行加密解密的是,直接做该表的select,人工不用干预,避免出错。

例如:创建一个存储私钥转换字符串的表,只有一个bytea字段,存的就是dearmor转换的内容。

create table privately_key_bytea(a bytea);

insert into privately_key_bytea select dearmor('public.key');  --public.key按文本粘贴进去,按key生成的文本直接换行。

insert into public_key_bytea select dearmor('-----BEGIN PGP PUBLIC KEY BLOCK-----

Version: GnuPG v2.0.22 (GNU/Linux)

 

mQENBFrv/1ABCACsSJJDIAtzINVoLJOKTGnx6pgmSQ3sBmgOMbBuLTc3I2ueg2Yu

0BEMw7qiX8fW1fzlsgQoXnohs27t6kcHof1UkGztoQjosHky5CAGQ2e9/hFT5HU+

Kk/6fpnJiKV1wlLQAOl4p4X6qOP+igKk3OJmfnG6htpESaxX3ADfsvY+8JcK87wK

+jlRR8WyXaaS9acQWps++yWST/a/1mtXLMGDVoV8TcnBHQQ2kisVJKvZ13hOV0YV

lhSQsTeKCsk6qfZo5e/f0UaVko2jKnt92ZcSPhfuaR1nPFI24BPWzzksKP0IjAiY

6X30rqbPQOtd4KSVwfoGLVNwW33qOsep+6pNABEBAAG0F2xtaW5nICgxMjMpIDxt

QDE2My5jb20+iQE5BBMBAgAjBQJa7/9QAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwEC

HgECF4AACgkQIz3jO+w4cuUTgQf9Hq3ES5K1JzTMuY4oG3h0e+46cnI2AeNheVyL

YdnyFLnh8nPWNrqVxHM+H1O/dMsudGadJwylO/jYXXRiFmBK8dUokEYHNb5yFAMk

CM/JSEso8SGOI9dWXxXxvbyTwXPIV2NeXfDdR1/n2cwXaZAxZv7300OPmSrDYs9+

l4JOaqu9YrLcIgovozCe6GrqQ0Z7NnE3aq3hL729QQ/0yW7gIYMjPd161GpzMDuh

VhQfl2uFGTShY13kOCHuuXAeTeRiF8pIy9u9ZyjPES+lhkPaGiqdpbIFi42g7f7X

36+XBMuzSAwRipneKDA664hCA7XT8nJeYiy6QZnjNKUVtH8yhLkBDQRa7/9QAQgA

yA6gZzOb5gMMBBLMQ2edHpqZ11wbqW00uCENOFmOGiBxxivdULzLRoWhLeItlzTt

WBRMYAxvJhJu26leuSvzfPzUo/Crrba0y39Wx4pI71qskwqgmqXMb4r7pjAjgvSz

mKwsAZp2UquPupiGOPLac1Yw9TARY91HpLiWUA9Y5ykIehCy5PR6DiDFE5hzYl7u

bMV5UkdpIH3Z6uay59A224csDkkB1laKAeb1znvWOUp7kRFus753omjs5WDx8bMy

AfhsAt5HNh5CDUxwH1heBEJGSo7FQ4ct8UHKI4NXHmAuYlY08fxJzGEPbSfQcDyT

KlBq2oKt+cDnhVo7ytumbQARAQABiQEfBBgBAgAJBQJa7/9QAhsMAAoJECM94zvs

OHLlMFIH/jEUOJ9+fEeWEJwS5vX08oMfZEFWLbY23papvjXT3YlVpTFSRQgT+WvJ

nyLb7I8B4rnLq/VTZBtfvDb1PKi9WV4SkEGbVdme8ZtutGvZ8v7kAgmbkfdNJBAO

i3/fVpA3FpYN2QOJ9wl500bvEpfh3Zqt5AEkYx+MDHxixG4r0znwuJXfcopWhDea

Sgs8BY49Qa8d6jUz015gByYA5WJmQJRY4DpdOxiIYO87qo2+VMAgnljc0gdqfuO5

d8vQ6QoOfHIXg0vgj0U5Ke4AtRjRQp2utMCng/OK4Sy59nTSQcldkkZyOzQWN1h7

CiOemLw8TETMljcK5HERHnVlIpsqbFo=

=i22y

-----END PGP PUBLIC KEY BLOCK-----');

按以上的方式,直接将转换的字符串存入这个表。

同理,创建一个公钥串存储的表:create table public_key_bytea(a bytea);--也是用一个bytea字段存放转换的public.key字符串。

insert into public_key_bytea select dearmor('-----BEGIN PGP PUBLIC KEY BLOCK-----');–将public.key用dearmor进行转换,直接存入这个表。

公钥加密:

create table public_key_encrypt(b bytea); –创建一个存储加密内容的表,将明文加密成一个bytea字符串

insert into public_key_encrypt select pgp_pub_encrypt('abc',a) from public_key_bytea;–'abc'是要加密的明文,a是刚刚public_key_bytea表里的字段。这样直接将'abc'通过加密成bytea,存入表public_key_encrypt。

私钥解密:

select pgp_pub_decrypt(t1.b,t2.a,'123456') from public_key_encrypt t1,privately_key_bytea t2;--t1.b是公钥加密后的内容,--t2.a是私钥的bytea形式,'123456'是生成秘钥时的密码

得到解密后的内容‘abc’

本操作PG9.3运行正确。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说我听海绵宝宝派大星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值