下面描述的是使用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运行正确。