Add New Notes

This commit is contained in:
geekard
2012-08-08 14:26:04 +08:00
commit 5ef7c20052
2374 changed files with 276187 additions and 0 deletions

View File

@@ -0,0 +1,343 @@
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2011-12-29T19:48:07+08:00
====== GPG加密和签名 ======
Created Thursday 29 December 2011
http://lagignition.blog.163.com/blog/static/1287300232009101082517154/
GnuPG全称__GNU Privacy Guard__它是基于**公钥/私钥体系**的加密工具PGP__Pretty Good Privacy__的开源版本它遵循OpenPGP标准。你可以免费使用自由传播并可以获得它的源代码。可以用于对Email、文件及其他数据的加密与验证确保通信数据的保密性、完整性和真实性。
===== 如何获得 =====
可以在其官方网站获得源代码和编译好的程序当前版本是1.4.6。
如果在Windows下使用则安装后需要把安装目录添加进PATH环境变量以便在命令行下使用。GnuPG的__kering密钥环__默认保存在 C:/Documents and Settings/你的用户名/ApplicationData/gnupg目录下的话要保存在其他地方就得设置GNUPGHOME环境变量。具体可以看其安装目录下附带的文档。
===== PGP原理及规则 =====
在介绍GPG前先让我们看看PGP的基本原理及应用规则。
PGP使用**双密匙**来加密数据。每个使用PGP加密技术的人都要创建一对密匙一个叫做公匙另一个叫做私匙。公匙可被广泛传播你可以贴在自己的网页上或发到专门的__公钥管理网站__上等等。私匙属于个人信息绝不应该泄漏给其他人。
公匙和私匙**相互作用**对数据进行加密及解密。被公匙加密的数据只能被私匙解密被私匙加密的数据也只能被一个公匙解密。这样就可以实现__双重认证__。
例如A要给B发信息
* A不想信息被其他人看见怎么办
首先A必须通过某些途径得到B的公钥。在发送信息前使用B的公匙对信息进行加密。这样只有B用对应的私匙才能解密收到的信息。所以就保证了信息传输的安全这就是PGP所谓的**加密(encryption)与解密(decryption)**。
* B收到信息后如何确定这信息是A发的呢
首先A必须通过某种途径把自己的公钥发给B。在发送信息前A先用自己的__密钥加密信息__。B收到信息后就可以使用A的公钥来对收到的信息进行验证。这样就能确定信息来自A这就是PGP所谓的**签名(signature)与验证(verification)**。
总的来说__公钥可以用来加密和认证私钥可以用来签名和解密。__
===== 如何使用GnuPG来生成自己公钥/私钥 =====
你首先要创建一个自己的**密钥对**,使用如下命令:
gpg --gen-key
期间会要求你输入个人信息如用户名邮件地址注释等最好选有意义的。最后会让你输入passphrase口令这就是咱们通常意义上的密码了解密和签名时都用得着的按设密码的一般规则设就行了。除了那些Yes/No的问题其他选项大可直接回车默认。
注意:一旦有任何一个丢失,则这对密钥就需要作废。
这里假设我们生成了一个名为foooo的用户
用户名 (注释可选)
foooo (nobody)
接着你便可以使用下面之一的命令**导出自己的公钥**了(如果本地又对各密钥对则可以用参数__-u__来指定哪一个)
gpg --export foooo > foooo.pk ::导出为二进制形式,后缀名可以自己取
gpg --armor --export foooo > foooo.pk ::导出为ASCII字符形式可以用文本编辑工具打开查看
下面是文本形式公钥的一个例子
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.6 (MingW32)
mQGiBEV4GRURBAD9STM2AvmHRej94kjIbCfOYXZX6StxK8eU2M0d4j94KAgXe4s3
zxV6F1AyXxZAI8jVf/wyApE7iTGQ29B+kaMf4MRwhc3F80dz7R6Zh7TkUiqCP9q/
................................................................
................................................................
a8TUvPWylvqISQQYEQIACQUCRXgZHgIbDAAKCRC8O+Bl+/W+DU02AJ9Xq/5M5yiw
2tpiz/mSOXZzo+i8RQCgjZljVuAB9an8zFrSV52fzq9GhH8=
=N3TB
-----END PGP PUBLIC KEY BLOCK-----
现在你就可以把你的公钥传到网上或发给别人了。
获得别人的公钥之后可以使用下面的命令把公钥__导入自己的钥匙圈在认证时会自动调用。__
gpg --import someone.pk ::后缀名并不一定是pk这里只是举例
===== 如何使用GnuPG来加密/解密 =====
你有一个文件beloved.txt要加密后发给你的GF首先你得有GF的公钥假设GF的**公钥的用户信息**为
ooyymm keti@butique.com
公钥为: ooyymm
可以用gpg --list-keys来查看本地的所有公钥。
加密命令如下
--recipient选项指定接受者也就是你要用__谁的公钥__来加密。在GnuPG里面指定公钥或私钥可以使用该公钥或私钥的__用户名、注释、邮件地址__等。可以只输入一部分但要唯一GnuPG会查找用户列表来找到所需的公钥。
gpg --encrypt --recipient ooyymm beloved.txt ::生成.gpg的二进制加密文件
gpg --encrypt **--armor** --recipient ooyymm beloved.txt ::生成.asc得ASCII码签名文件
比如,使用邮箱地址来指定密钥:
gpg --encrypt --recipient keti@butique.com beloved.txt
当然GnuPG还可以通过其他手段来指明你要使用哪个公钥或私钥具体请参看GnuPG的文档。
现在可以把加密后生成beloved.txt.gpg或beloved.txt.asc文件发给你GF吧。
你的GF收到文件后必须使用自己的相应的私钥来解密命令如下:
gpg --decrypt beloved.txt.gpg > beloved.txt
gpg --__decrypt__ beloved.txt.asc > beloved.txt
这个过程需要输入passphrase。
===== 如何使用GnuPG来签名/验证 =====
__GPG使用公钥加密的数据可以用私钥解密同样使用私钥加密的数据可以用公钥解密__。
==== 签名过程: ====
1.在主机上创建密钥对
host # gpg --gen-key
按提示操作即可。操作完成后可以**查看已经创建的公钥**
host # gpg --list-keys
2.然后使用密钥对文件进行签名,二进制签名:
host # gpg -s patch.tar.gz
创建的一个名为patch.tar.gz.gpg的文件就是签名后的包如果想指定签名后的文件名字可以用以下命令:
host # gpg -o pach.tar.gz.sig -s patch.tar.gz
要对对__文本文件进行明文签名__的话
host # gpg --clearsign hello.txt
明文签名默认文件名为原文件名后加.asc也可以使用-o 参数来指定文件名。
==== 验证签名过程: ====
签名方(host)将自己的公钥导出后发给接收方,接收方(target)将该公钥导入到本地的公钥环。
1.导出公钥
host # gpg -o pub.key --export userid
或者:
host # gpg --export userid >pub.key
userid是在创建密钥的时候输入的用户名。pub.key是二进制文件如果想导出文本文件加入-a参数即可
host # gpg -a --export userid >pub.key.txt
2.导入公钥
target # gpg --import pub.key
target # gpg --import pub.key
target # gpg --ignore-time-conflict --improt pub.key
3__.验证公钥__
**target** # gpg --edit-key userid
>fpr
查看这个__公钥的指纹__核对指纹来**确认这个key正确无误**。
>sign
签署
->trust
信任
>quit
退出问保存与否输入y。
4.验证签名:
target # gpg --verify patch.tar.gz.gpg
忽略时间校验:
target # gpg --ignore-time-conflict --verify patch.tar.gz.gpg
会显示签名校验的结果。
导入key来校验看上去比较麻烦那么还有一种更简单的方式直接在校验的时候通过参数来指定使用哪个key文件**必须是二进制的文件**,文本文件不可用):
target # gpg __--keyring pub.key__ --verify patch.tar.gz.gpg如 果连时间都懒得设(有时候是没法设),那么也可以忽略时间戳的验证:
target # gpg --keyring pub.key --ignore-time-conflict --verify patch.tar.gz.gpg
附录:签名与验证过程
ms1@localhost:~/Desktop/work/sign> **gpg --gen-key**
gpg (GnuPG) 2.0.9; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? 1
DSA keypair will have 1024 bits.
ELG keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: lagignition
Email address: lagignition@163.com
Comment:
You selected this USER-ID:
"lagignition <lagignition@163.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
asdfasfdasdfasdfsadfsadf
asidpfupjxzcv
asdfiasjdf
wefijklasdf
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key BC123ABC marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u
pub 1024D/BC123ABC 2009-11-06
Key fingerprint = A943 4978 4DF9 C9A5 726C 9163 7166 AAF9 BC12 3ABC
uid lagignition <lagignition@163.com>
sub 2048g/586310BF 2009-11-06
ms1@localhost:~/Desktop/work/sign>** gpg -s -u lagignition test.txt**
You need a passphrase to unlock the secret key for
user: "lagignition <lagignition@163.com>"
1024-bit DSA key, ID BC123ABC, created 2009-11-06
ms1@localhost:~/Desktop/work/sign> **gpg -o pub_lagignition.key --export lagignition**
[root@localhost sign]# **gpg --import pub_lagignition.key**
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key BC123ABC: public key "lagignition <lagignition@163.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
[root@localhost sign]# **gpg --verify test.txt.gpg**
gpg: Signature made Thu 05 Nov 2009 09:24:48 PM EST using DSA key ID BC123ABC
gpg: Good signature from "lagignition <lagignition@163.com>"
__gpg: WARNING: This key is not certified with a trusted signature! #这需要对获得的公钥的fingerprint进行核对然后签署它有效。__
gpg: There is **no indication** that the signature belongs to the owner.
Primary key fingerprint: A943 4978 4DF9 C9A5 726C 9163 7166 AAF9 BC12 3ABC
[root@localhost sign]# __gpg --edit-key lagignition__
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
pub 1024D/BC123ABC created: 2009-11-06 expires: never usage: SC
** trust: unknown ** ** validity: unknown**
sub 2048g/586310BF created: 2009-11-06 expires: never usage: E
[ unknown] (1). lagignition <lagignition@163.com>
Command> __fpr__
pub 1024D/BC123ABC 2009-11-06 lagignition <lagignition@163.com>
Primary key __fingerprint__: A943 4978 4DF9 C9A5 726C 9163 7166 AAF9 BC12 3ABC
Command> **trust #签署导入的公钥有效**
pub 1024D/BC123ABC created: 2009-11-06 expires: never usage: SC
trust: unknown validity: unknown
sub 2048g/586310BF created: 2009-11-06 expires: never usage: E
[ unknown] (1). lagignition <lagignition@163.com>
Please decide how far you __trust this user__ to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5
Do you really want to **set this key to ultimate trust**? (y/N) y
pub 1024D/BC123ABC created: 2009-11-06 expires: never usage: SC
__ trust: ultimate__ validity: unknown
sub 2048g/586310BF created: 2009-11-06 expires: never usage: E
[ unknown] (1). lagignition <lagignition@163.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.
Command> quit
[root@localhost sign]#** gpg --verify test.txt.gpg #没有警告了!**
gpg: Signature made Thu 05 Nov 2009 09:24:48 PM EST using DSA key ID BC123ABC
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: Good signature from "lagignition <lagignition@163.com>"
[root@localhost sign]# echo $?
0
[root@localhost sign]# gpg --verify __-u lagignition__ test.txt.gpg
gpg: Signature made Thu 05 Nov 2009 09:24:48 PM EST using DSA key ID BC123ABC
gpg: Good signature from "lagignition <lagignition@163.com>"
[root@localhost sign]# gpg -o test.txt test.txt.gpg
gpg: Signature made Thu 05 Nov 2009 09:24:48 PM EST using DSA key ID BC123ABC
gpg: Good signature from "lagignition <lagignition@163.com>"
Reference:
http://bbs.wmzhe.com/redirect.php?tid=264&goto=lastpost

View File

@@ -0,0 +1,51 @@
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2011-12-29T19:46:39+08:00
====== gpg加密--数字签名 ======
Created Thursday 29 December 2011
http://hi.baidu.com/aprilus/blog/item/0b31fbaeb2d3edc07cd92a47.html
加密:公钥加密,私钥解密[数据保密性]
数字签名:私钥加密,公钥解密[身份认证][数据完整性][不可抵赖性]
生成密钥:
$ gpg --gen-key
--homedir 指定密钥存放的位置
查看密钥:
--list-keys
--fingerprint
--list-public-keys
--list-secret-keys
修改密钥:
$ gpg --edit-key 标识名
导出公钥:
$ gpg --export 标识名 > 生成文件名 ::导出为二进制形式
$ gpg --export --armor 标识名 > 生成文件名 ::导出为ASCII字符形式
导出私钥:
$ gpg --export-secret-key 标识名 > 生成文件名 ::导出为二进制形式
$ gpg --export-secret-key --armor 标识名 > 生成文件名 ::导出为ASCII字符形式
导入密钥:
$ gpg --import 密钥文件
加密:
$ gpg --encrypt --recipient 标识名 欲加密文件 ::生成gpg后缀的二进制加密文件
$ gpg --encrypt --armor --recipient 标识名 欲加密文件 ::生成asc后缀的ASCII加密文件
解密:
$ gpg --decrypt 已加密文件名 > 生成文件名
签名:
$ gpg --local-user 标识名 --sign 欲签名文件 ::生成gpg后缀的二进制签名文件
$ gpg --local-user 标识名 --sign --armor 欲签名文件 ::生成asc后缀的ASCII签名文件
验证:
$ gpg --verify 签名文件 ::只验证
$ gpg --decrypt 签名文件 > 生成文件名 ::验证并还原信息
此外还有以下两种签名方式:
一种主要用于文本,签名时将签名信息附在文本内容的后面,验证时只要把该文件做参数就行了。
$ gpg --clearsign 欲签名文件
另一种是生成单独的签名文件。
$ gpg --detach-sign 欲签名文件 ::生成sig后缀的二进制签名文件
$ gpg --detach-sign --armor 欲签名文件 ::生成asc后缀的ASCII签名文件

View File

@@ -0,0 +1,250 @@
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2011-12-29T20:11:17+08:00
====== 如何应用GPG加密使您的信息安全保障无忧 ======
Created Thursday 29 December 2011
http://xjsunjie.blog.51cto.com/999372/656687
GPG作为一个开源并且免费的__加密和数字签名__软件已经存在多年。它不但可以为企业、个人之间的重要信息提供加密保护还可以为出版的软件、内核等电子产品进行数字签名防止产品被篡改最大程度地保障信息安全。
加密和数字签名作为保护信息机密性、完整性和不可抵赖性的重要手段在各种信息通信场合得到广泛的应用。目前,已有不少商业加密和数字签名产品,比如**商业软件PGP**Pretty Good Privacy
另外在开放源代码库中也有一些免费的加密和数字签名软件其中最被认可的是GPGGNU Privacy Guard。GPG是一个完全免费、源代码公开并且与PGP完全兼容的软件产品。今天GPG已经拥有众多的企业和个人用户。
在我国由于信息安全及隐私保护意识还比较薄弱PGP或GPG在商业和个人用户中的使用并不普遍。随着信息安全及隐私带来的问题甚至诉讼的增加更多企业和个人开始把眼光投向安全问题的解决。
但是由于非专业用户对签名和加密等概念的畏难情绪GPG的应用还多局限于IT技术人员。本文将对Linux环境下如何应用GPG进行讲解为企业和个人用户应用GPG提供帮助。
===== 建立GPG环境 =====
GPG软件作为用于加密和数字签名的开放源码工具许多Linux发行版本都自带了该软件。在默认安装的情况下gpg会作为一个基本命令事先安装好。
如果选用的Linux发行版默认没有安装GPG可以通过tar包或RPM包进行安装可从http://www.gnupg.org/download/下载安装包。安装过程比较简单,这里省略了。
判断是否安装有GPG的方法也很简单。直接在命令行下输入“gpg -h”命令如果系统已经安装有GPG就会显示关于GPG用法的信息。
确定Linux系统中已经安装了GPG后就可以开始下面加密和签名的工作了。
===== 生成密钥 =====
用户应用GPG首先要有一对自己的密钥。所以第一步就是产生一对密钥。gpg命令通过大量参数提供所需要的几乎所有操作。其中参数“-gen-key”就是用来产生一对密钥的。在安装了GPG的Linux系统上可以运行以下命令
#gpg --gen-key
如果想对产生密钥的操作进行一些个性化设置,还可以加上其它参数。比如,要指定生成密钥存放的位置,可以运行以下命令:
#gpg --gen-key --homedir /mygnupg
命令开始运行后,首先,会看到版本和路径信息如下:
gpg (GnuPG) 1.2.1; Copyright (C) 2002 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
gpg: /home/terry/.gnupg: directory created
gpg: new configuration file `/home/terry/.gnupg/gpg.conf' created
gpg: keyblock resource `/home/terry/.gnupg/secring.gpg': file open error
gpg: keyring `/home/terry/.gnupg/pubring.gpg' created
随后需要回答一系列问题,以帮助产生一对密钥。首先遇到的问题是要求选择密钥使用的算法:
Please select what kind of key you want:
(1) DSA and ElGamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? 1
其中__DSA是数字签名算法__RSA和ElGamal是两种不同原理的非对称密钥算法。通常可以选择“1”这样生成的密钥可以__同时用作签名和加密__两种用途。
接着,会要求选择密钥的长度:
DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
minimum keysize is 768 bits
default keysize is 1024 bits
highest suggested keysize is 2048 bits
What keysize do you want? (1024) 2048
Requested keysize is 2048 bits
这里的密钥长度有768、1024和2048位三种。显然密钥越长越安全但太长又会影响使用的速度。所以可以根据不同的需要选择适合的长度。笔者的应用更重视安全性所以选择了最长的2048位密钥。
另外,还需要设定密钥过期的时间:
Please specify how long the key should be valid.
0 = key does not expire
= key expires in n days
w = key expires in n weeks
m = key expires in n months
y = key expires in n years
Key is valid for? (0) 1y
Key expires at Sat 10 Sep 2005 01:48:07 PM CST
Is this correct (y/n)? y
原则上,密钥使用的频率越高,密钥有效的时间越长,被攻击的可能性就越大。所以,要根据应用的实际情况综合考虑,确定一个适当的时间长度。需要注意的是,密钥要定期更换,建议绝对不要永远使用同一对密钥。
最后需要输入一些个人信息包括真实姓名、电子邮件地址等__用来识别密钥__最好是如实填写。比如
Real name: Terry Yu
Email address: terry@mykms.org
Comment: for test
You selected this USER-ID:
"Terry Yu (for test) "
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
然后,必须输入一个密码。密码用来保护密钥,没有这个密码,任何人都不能看到密钥本身的内容。密码是在密钥文件泄露后惟一的保密措施,它的最大敌人是暴力破解和字典攻击。所以,一定要选择一个强壮的密码,来有效地对抗这些攻击。
密码确定以后,系统开始运算:
We need to generate a lot of random bytes.
It is a good idea to perform some other action
(type on the keyboard, move the mouse, utilize the disks)
during the prime generation;
this gives the random number generator a better
chance to gain enough entropy.
..+++++.+++++.+++++.+++++..++++++++++.++++++++++++++
这时需要随便地敲击键盘或是移动鼠标,以产生一些随机数,协助密钥的顺利生成。注意,如果没有以上动作,很可能最终不能产生密钥。
系统运算完成后,会出现类似以下的信息:
gpg: /home/terry/.gnupg/trustdb.gpg: trustdb created
public and secret key created and signed.
key marked as ultimately trusted.
pub 1024D/6AE573B5 2004-09-29 Terry Yu (for test)
Key fingerprint = 0D58 408E 344F BB7B AB95 D000 82B7 8324 6AE5 73B5
sub 2048g/94BF182C 2004-09-29 [expires: 2005-09-29]
pub 1024D/7234E374 2004-09-10 Terry Yu (for test)
Key fingerprint = A58F D71A 28BA 499D 805B 588E 82FB CD0F 7234 E374
sub 2048g/4907EA0A 2004-09-10 [expires: 2005-09-10]
以上信息表示已经成功地为“Terry
Yu”生成并签名了一对密钥密钥过期时间为“2005-09-10”。在生成密钥的同时默认用户目录的__.gnupg目录__中也存放了与该用户相关的
GPG配置及密钥存储文件。这些文件控制了用户的GPG环境用户不能直接修改这些文件所有改动都将通过“gpg”命令实现。
===== 查看密钥 =====
密匙生成后,可以随时用以下命令查看。
查看所有密钥:
#gpg -list-key
查看所有公钥:
gpg -list-public-key
查看所有私钥:
gpg -list-secret-key
列出所有签名:
gpg -list-sig
===== 导出公钥 =====
在非对称加密体系中,**私钥是由用户保管,而公钥是对外公开**的。用户在生成密钥对后,需要把其中的公钥导出到一个文件中,然后将其分发给其它用户。
导出公钥的方法很简单通过gpg命令的“-export”参数就可完成。为了使导出文件是ASCⅡ编码的还需要加上参数“-a”。比如导出Terry Yu ASCⅡ编码的公钥文件可以使用以下命令
#gpg --export -a terry@mykms.org > terry.asc
该命令最终生成ASCⅡ编码的公钥文件terry.asc
===== 分发公钥 =====
这个包含公钥信息的文件需要对外分发可以通过各种方式将terry.acs文件分发给所有与用户有信息通信需求的人。
最简单的分发方式是将该文件__放到互联网上供人下载__。这种方式需要注意的问题是所发布公钥文件的网站一定要是一个可以信赖的站点。实际应用中类似的做法很普遍。比如Red Hat的公钥就是在它的官方网站上发布的任何人都可以下载获得并用来验证Red Hat所发布软件的签名的正确性。
===== 导入公钥 =====
作为用户也会收到别人的GPG公钥它们可能来自网站、电子邮件、FTP和目录服务等__只要信任其来源__就可以将其导入自己的GPG环境之后才可以与相应的人员进行基于GPG的各种应用。导入公钥的过程可以分为以下三步
=== 1导入 ===
比如Terry收到朋友Brian的公钥文件brian.gpg可以使用以下命令导入文件
#gpg --import terry.gpg
=== 2核对“指纹” ===
公钥是可以伪造的。James可以伪造一个Brian的公钥然后想办法让Terry得到。如果Terry对收到的公钥不加验证那么他发给Brian的加密邮件就可能被James解密。GPG的架构中__并没有一个PKI这样的证书管理系统____GPG的公钥信任是通过“Truth Web”实现__的。
生成Terry__公钥的“指纹”__
#gpg --fingerprint terry@mykms.org
pub 1024D/7234E374 2004-09-10 Terry
Yu (for test)
Key fingerprint = A58F D71A 28BA
499D 805B 588E 82FB CD0F 7234 E374
sub 2048g/4907EA0A 2004-09-10 [expires: 2005-09-10]
这个“指纹”是惟一的。可以通过与对方__核对“指纹”是否一致__来确定这个公钥是否可信和合法。
=== 3签名 ===
在成功导入并确定这个公钥是可以相任之后要立即__对这个公钥进行签名__。这样就可以验证来自对方邮件的真实性了。
对公钥进行签名可以使用如下命令:
#gpg __--sign-key__ brian@mykms.org
或者
#gpg__ --edit-key__ name
#command > sign
检查对方邮件比如Brian的签名
#gpg --check-sigs brian@mykms.org
现在有了Brian签名的公钥通过这个公钥就可以和Brain进行非对称加密通信了。
===== 应用GPG =====
GPG使用的是非对称的密钥体系用户拥有一对密钥包括一个公钥和一个私钥。公钥对外公布私钥则由自己保存。__使用公钥加密的数据可以用私钥解密同样使用私钥加密的数据可以用公钥解密__。
非对称的密钥可以用来加密和做数字签名。当用户关心信息**保密性**时,使用加密功能;当用户关注**信息完整性及不可抵赖性**时使用数字签名功能当用户需要同时关注信息的机密性、完整性及不可抵赖性时可以将加密和数学签名__混合使用__。简单了解这些密码学概念后就可以开始真正的应用实践了。
==== 对文件进行加密和数字签名 ====
KDE中提供了图形化的加密操作方法。比如在KDE中对一个文件加密只需在KDE文件管理器Konqueror中选中该文件单击右键选择“Actions”中的“Encrypt File”就可以加密文件。加密后的文件以__.asc__结尾。
对于图形方式的加密操作不多做介绍,下面将重点放在命令行操作方式上,介绍命令行下的各种文件加密和签名的操作方法。
1对文件进行数字签名
#gpg --clearsign policy.txt
You need a passphrase to unlock the secret key for
user: "test (test) "
1024-bit DSA key, ID ADD93830, created 2004-07-01
运行以上命令生成一个名为report.txt.asc的文件该文件中除了原文件信息外还包含数字签名信息。
2验证文件的数字签名
#gpg --verify policy.txt.asc
gpg: Signature made 2004年11月04日 星期四 15时58分07秒 UTC using DSA key ID ADD93830
gpg: Good signature from "test (test) "
以上命令运行的结果显示该签名是正确的。
3用指定的公钥对文件加密
#gpg --encrypt -r terry@mykms.org report.txt
gpg: checking the trustdb
gpg: checking at depth 0 signed=0 ot(-/q/n/m/f/u)=0/0/0/0/0/1
gpg: next trustdb check due at 2005-09-10
运行以上命令使用对方的公钥加密report.txt文件生成加密文件report.txt.gpg。如果使用编辑软件打开该加密文件会发现它包含的是一些不可理解的字符和乱码。
4用私钥对加密文件解密
#gpg --decrypt report.txt.gpg >report.txt
You need a passphrase to unlock the secret key for
user: "test1 (unclassfication) "
2048-bit ELG-E key, ID 33735683, created 2004-09-29
(main key ID 79EB3D97)
gpg: encrypted with 2048-bit ELG-E key, ID 33735683,
created 2004-09-29
"test1 (unclassfication) "
以上命令要求输入对应私钥的保护口令才能成功解密解密后的文件内容被输出到report.txt文件中。
5用公钥同时进行文件签名和加密
#gpg -se -r test@yahoo.com.cn report.txt
You need a passphrase to unlock the secret key for
user: "test (test) "
1024-bit DSA key, ID ADD93830, created 2004-07-01
以上命令要求输入对应私钥的保护口令,输入正确的口令后,签名和加密成功完成。
这些都是应用GPG签名和加密文件的一些常用命令更详细的用法可以参考GPG的帮助文件。
==== 对电子邮件进行加密和数字签名 ====
实际上GPG应用最多的地方是在电子邮件的加密和数字签名上。许多__电子邮件客户端软件__都支持PGP/GPG方式的加密及数字签名。这里以Kmail为例介绍如何设置Kmail并利用Kmail发送加密及数字签名的电子邮件。
Kmail
是KDE环境中的电子邮件客户端类似于Windows下的Outlook
Express。在选单中选择“Settings→Configure-Kmail→Identites”选定一个身份单击“Modify”进行编
辑。选择其中的“Advanced”标签页可以看到类似图2的界面。
其中“OpenPGP Key”项是该身份所对应的PGP或GPG密钥可以单击“Change”按钮从GPG环境中选择对应的密钥对。
保存后GPG的设置完成。试写一封邮件如图3所示。图中工具栏中凹下去的“钢笔尖”图标表示此邮件使用了数字签名紧靠旁边的锁形图标表示加密如果两个图标都凹下去则表示同时使用了加密和数字签名。
图3 使用数字签名的电子邮件
发送邮件时Kmail会要求给出对应密钥的保护口令如图4所示。
图4 要求输入密钥保护口令
正确输入保护口令后会弹出一个确认窗口如图5。
图5 确认窗口
确认内容无误后单击“OK”按钮一封带有数字签名的电子邮件就成功发出。发送加密邮件以及发送同时加密和数字签名的邮件方法都是类似的。
==== 软件包签名验证 ====
对于Red Hat等Linux发行商来说他们常常会利用GPG对**发布的软件包进行签名**。用户可以通过验证软件包的签名来确保得到的软件包没有损坏,或者是被他人动过手脚。
验证一个下载软件包的GPG签名可以按照以下步骤来进行
1从网上下载或其它方式得到软件发行商的公钥并将其导入自己的GPG环境中。
2通过对比“电子指纹”来__确认公钥__并对此公钥进行签名。
3使用以下命令来验证软件包的GPG签名
#__gpg --verify singaturefile.tar.gz taballpackage.gz__
如果该软件是RPM格式的还可以使用如下命令来验证
#rpm -Kv your.rpm
===== 密钥管理 =====
前面介绍了GPG在加密和签名两方面的应用在应用过程中用户要认真地对待密钥管理问题。GPG的密钥采用的是信任机制并没有一个中心的PKI可以帮助发布和验证GPG用户的公钥。为了防止公钥欺骗保证公钥的不可否认性Non-repudiation需要有一种机制来进行管理。下面是一些有益的建议可供参考。
◆ 备份好私钥
一旦私钥丢失或损坏,则无法打开以前加密的文件。并且,即使知道私钥被他人滥用,也无法使自己的公钥过期。有了私钥的备份,就能有效地回避此类风险。
◆ 建立有过期保护的公钥机制
万一私钥丢失不能人工收回公钥时,公钥也可以在预定时间后自动过期。
◆ 为私钥加上强口令保护
这样,即使私钥文件泄漏,还有口令保护。保护口令一定要有足够的复杂度,才能有效地对抗暴力破解。
◆ 多重机制
在紧急情况下恢复密钥要有多重控制。
◆ 使用版本控制软件
使用版本控制软件来收集和维护自己的公钥库。版本控制软件可以有效地记录历史变更情况,保证公钥库的有条不紊。
===== 小结 =====
GPG作为一个开源并且免费的加密和数字签名软件已经存在多年。它不但可以为企业、个人之间的重要信息提供加密保护还可以为出版的软件、内核等电子产品进行数字签名防止产品被篡改最大程度地保障信息安全。对于Linux用户来说对信息安全的要求相对更高GPG更值得在Linux用户中推广和应用。