鉴于前段时间csdn、天涯等等一群的爆库事件,虽然据说起源在于抗议实名制,但也暴露了国内网站的安全措施实在堪忧。而且现在云服务盛行,但是又有谁能打保票,保存在云端的数据就是安全的呢?所以个人数据的安全性只能依靠自己了。
gpg 是PGP的GNU开源实现,非常可靠,至少Linux的密钥管理都是用的它。我们拿来可以有俩用途:
-
加密解密
需要保存到云端的文件,使用公钥加密,只有自己的私钥+密码才能解密。
-
做数字签名
用私钥给自己生产的文件做签名,别人可以用公钥进行验证这份文件的可靠性。
下边列举一些常用场景,更详细的使用方法可以查manual。
生成密钥
第一步你需要生成自己的密钥才能使用:
gpg --gen-key
按照如下步骤:
- 密钥种类可以选择 DSA and Elgamal。
- 按照提示输入Name、Email和备注信息,最终要求输入一个密码,用来保护私钥。其中,Name就是日后会用到的uid,建议不要设置得太长太复杂,这里假定Name设置为 foo 。
- 运行之后你的密钥就算生成了,生成的key会保存在
~/.gnupg/
目录下,其中公钥文件为pubring.gpg
, 私钥文件为secring.gpg
。
管理密钥
-
根据公钥列出当前机器上的密钥。如果想列出私钥,使用参数
-K
:gpg -k
-
导出 foo 的公钥到 foo.key:
gpg -ao foo.key --export foo
-
导出 foo 的私钥到 foo-secret.key (如果要备份,一定要保存在最安全的地方):
gpg -ao foo-secret.key --export-secret-keys foo
-
导入一个密钥,可以是公钥或私钥:
gpg --import some.key
-
进入管理密钥的菜单,比如你可以输入
passwd
更改私钥密码:gpg --edit-keys foo
-
从公钥钥匙环里删除名为 foo 的公钥:
gpg --delete-keys foo
-
从私钥钥匙环里删除名为 foo 的私钥:
gpg --delete-secret-keys foo
加解密文件
-
使用 foo 的私钥加密 sample.txt,你会得到一个加密后的文件 sample.txt.asc:
gpg -ae -r foo sample.txt
其中,
-a
表示ASCII 输出,-r
指定密钥。 -
解密 sample.txt.asc 文件并输出到 new.txt 文件:
gpg -o new.txt -d sample.txt.asc
数字签名
-
生成文件 sample.txt.gpg,其中包含源文件和签名。
gpg --sign sample.txt
可以使用参数
--default-key
指定使用哪个私钥做签名。 -
生成文件 sample.txt.asc,其中包含源文件和可读的ASCII签名。建议用于ASCII文件:
gpg --clearsign sample.txt
-
生成文件 sample.txt.sig,其中仅包含签名。Debian里的软件包应该都是这种签名方式:
gpg --detach-sign sample.txt
-
验证该文件的签名。如果使用
--detach-sign
方式签名,且源文件名不一致,那么源文件需跟在签名文件(.sig)之后作为另一个参数提供:gpg --verify sample.txt.gpg
在Emacs里使用gpg
只要安装好了gpg,并且生成了密钥,在Emacs里使用gpg非常简单:
(require 'epa-file)
打开 .gpg
文件自动解密该文件,保存时即自动加密。前面一篇关于gnus的文章里,邮箱账户的信息可以保存到 ~/.authinfo.gpg
就安全多了。