1 GnuPG简介
随着网络与计算机技术的发展,数据存储与数据交换的安全性、完整性和一致性已经变得越来越重要。如何保证在不安全的网络上传输数据的安全性成为网络信息安全界研究的热点和经典问题。本文将通过具体的加解密实例向用户来介绍一种Linux下的基于PGP(Pretty Good Privacy)机制的加密及签名软件——GnuPG,包括密钥生成、公钥导出、加密文件、解密文件、对文件进行数字签名等重要步骤,通过它可以极大地保证网络用户传输及使用数据的安全性。并且,用户可以通过灵活运用本文的技术来对网络传送的文档、电子邮件等进行安全传输。
PGP(Pretty Good Privacy),是一个基于RSA公钥加密体系的邮件加密软件。它不但可以对用户的数据保密以防止非授权者阅读,还能对你的邮件加上数字签名从而使收信人确信邮件是由你发出。让人们可以安全地和从未见过的人们通讯,而事先不需要任何保密的渠道用来传递密钥。PGP采用了审慎的密钥管理,一种RSA和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等。它功能强大,速度很快。
PGP的创始人是美国的PhilZimmermann。他创造性地把RSA公钥体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密钥认证管理机制上有非常巧妙的设计。因此PGP成为几乎最流行的公钥加密软件包。其中,RSA(Rivest-Shamir-Adleman)算法是一种基于“大数不可能质因数分解假设”的公钥体系。简单地说就是找两个很大的质数,一个公开给世界,一个不告诉任何人。一个称为“公钥”,另一个叫“私钥”。这两个密钥是互补的,就是说用公钥加密的密文可以用私钥解密,反过来也一样。
具体地说,GnuPG是实现安全通讯和数据存储的一系列工具集,可以做加密数据和做数字签名之用。在功能上,它和PGP是一样的。由于PGP使用了IDEA专利算法,所以使用PGP会有许可证的麻烦。但是GnuPG并没有使用这个算法,所以对用户来说使用GnuPG没有任何限制。GnuPG使用非对称加密算法,安全程度比较高。所谓非对称加密算法,就是每一个用户都拥有一对密钥:公钥和私钥。其中,密钥由用户保存,公钥则由用户尽可能地散发给其他人,以便用户之间的通讯。该软件可以从网站http://www.gnupg.org/上进行下载安装。
GnuPG支持的算法有如下:
公钥:RSA, RSA-E, RSA-S, ELG-E, DSA
对称加密:3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
散列:MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
压缩:不压缩, ZIP, ZLIB, BZIP2
其使用的基本语法为:gpg [选项] [文件名]
其实现的功能包括签名、检查、加密或解密,默认的操作依输入数据而定。
#p#
2 详细使用方法
1.生成密钥对
使用GnuPG之前必须生成密钥对(公钥和私钥),参数选项"--gen-key"可以生成密钥对。可按如下步骤操作,如图1、图2所示。在图1中,首先用户需要注意有如下几个关键的步骤:
(1)GnuPG要求输入要生成的密钥的算法:GnuPG可以生成多种密钥对,这里有三种选择。DSA密钥是生成证书的最基本的密钥格式。ElGamal密钥对可以用来加密。第二种选择与第一种相似,但是仅仅生成DSA密钥对,第三种选择可以生成供签证和加密使用的ElGamal密钥对。对大多数用户来说,使用缺省的选择是非常方便的。
(2)选择密钥的长度,DSA密钥的长度在512位~1024位之间,Elmagal密钥的长度则没有限制。生成一个很长的密钥既有优点也有缺点,长的密钥无疑安全性非常高,但是会导致加密的过程变得缓慢,另外,密钥过长,也会使证书的长度变大。缺省的密钥长度1024位已经够用了,确定了密钥的长度之后,就不能再改变它。
(3)需要指定这个密钥对的有效日期,如果选择了生成ElGamal或者 DSA密钥对,它们需要指定密钥对的失效日期。对于大多数用户来说,密钥对没有失效期限是可以的。虽然在密钥对产生以后,可以改变它的有效日期,但是仍要谨慎选择这个参数。因为公钥发送出去以后,很难再改变其他用户拥有的您的公钥。
图1 |
图1 生成密钥对的前3个关键步骤
完成上述步骤后,用户还需要注意如图5所示的后续几个关键步骤:
(4)用户需要指定一个用户ID来标识选择的密钥,GnuPG可以根据用户的真实姓名、注释和E-mail地址产生一个用户ID。在图2中,我们使用姓名(liyang),电子邮件地址(liyang@tsinghua.com)和注释(liyang@tsinghua),并设定了密钥的密码,来完成了该步骤。这个口令的目的是用来加密用户的私钥,这样,即使有人偷走了用户的私钥,没有这个口令,也无法使用,这个口令的长度没有限制,但是,正如我们所知道的,一个短的口令是很容易被破解的。同样,如果用户的口令是一个单词,也很容易被破解。
(5)在产生密钥的过程中,GnuPG需要得到一些随机的数字。这些随机的数字可以从用户的系统当前状态中得到,所以这时候,用户可以随机敲一下键盘或者移动鼠标,来产生高质量的随机数。图2中系统就明显地要求笔者尽量多产生一些随机数字来生成密钥,以保证质量。
图2 |
图2 生成密钥的后续2个关键步骤示意
完成了上述5个关键步骤后,如果系统显示如图3所示的成功界面,则生成密钥成功,否则用户需要再重复如上5个步骤。
图3 |
图3 生成密钥成功
2.为密钥建立吊销证书
当用户的密钥对生成之后,用户应该立即做一个公钥回收证书,如果忘记了私钥的口令或者私钥丢失或者被盗窃,用户可以发布这个证书来声明以前的公钥不再有效。生成回收证书的选项是"--gen-revoke"。具体使用的命令是:
# gpg --output revoke.asc --gen-revoke mykey
其中mykey 参数是可以表示的密钥标识,产生的回收证书放在revoke.asc文件里,一旦回收证书被发放,以前的证书就不能再被其他用户访问,因此以前的公钥也就失效了。具体的过程如图4至6所示。在该过程中我们为用户liyang的密钥建立了一份吊销证书,在建立过程中需要依次输入吊销理由和为密钥设定的密码才能成功建立:
图4 |
图4 输入吊销理由
图5 |
图5 输入为密钥建立的密码
图6 |
图6 成功建立吊销证书
3.显示密钥列表
完成上述操作后可以使用 --list-keys 选项列出我们生成的密钥,如图7所示:
图7 |
图7 密钥列表
4.输出公钥
用户可以输出您的公钥供您的主页使用,也可以把它放在密钥服务器上,当然,还可以使用于其他的途径。在使用此公钥之前用户首先要导出它。选项--export可以实现这个功能,在使用这个选项时,还必须使用附加的选项指明用户要输出的公钥。
下面的命令表示以二进制格式输出公钥:
# gpg --output pubring.gpg --export samsunglinux@minigui.org
如下命令表示以ASCII字符格式输出:
#gpg --output pubring.gpg --export--armor> liyang_public-key.asc
5.导入公钥
用户可以把从第三方的公钥数据库中得到的公钥导入自己的私有数据库,在与他人进行通讯时使用。命令如下:
#gpg --import < filename >
其中,参数filename为公钥文件。
图8给出了将用户liyang的公钥导入到用户samsunglinux自己的私有数据库的例子:
图8 |
图8 导入公钥示例
#p#
6.确认密钥
导入密钥以后,使用数字签名来验证此证书是否合法。查看数字签名使用 --fingerprint 选项。其命令如下所示:
#gpg --fingerprint < UID >
其中,UID为用户要验证的公钥。图9给出了验证证书的例子:
图9 |
图9 确认密钥示意
7.密钥签名
导入密钥之后,可以使用 --sign-key 选项进行签名,签名的目的是证明用户完全信任这个证书的合法性。其命令格式为:
# gpg --sign-key < UID >
其中,UID 是要签名的公钥。图10为使用该命令的结果示意:
图10 |
图10 确认密钥示意
8.检查签名
用户可以使用 --check-sigs选项来检查在上面对密钥所作的签名。其命令格式为:
# gpg --check-sigs < UID >
这个选项可以列出此密钥文件的所有的签名。图11给出了相应的示意:
图11 |
图11 检查签名示意
9.加密和解密
使用GnuPGP加密和解密一个文件非常容易,如果用户要给对方用户发送一个加密文件,可以使用对方用户的公钥加密这个文件,并且这个文件也只有对方用户使用自己的密钥才可以解密查看。
加密一个文件可以使用下面的指令
#gpg –r < UID > --encrypt < file >
其中,UID是对方的公钥,file为要加密的文件。
对应地,如果用户要解开一个其他用户发给您的文件可以使用下面的指令:
#gpg -d < file >
其中,file是要解密的文件。解密过程中,GnuPG会提示用户输入使用密钥所需要的口令,也就是在产生私钥时用户所输入的口令,否则,该文件将无法正常解密和为用户进行使用。图12和图13分别显示了用户samsung对文件gpg.conf进行加密传输,用户liyang对该加密文件gpg.conf.gpg进行解密的过程。
图12 |
图12 用户samsunglinux对文件gpg.conf进行加密
图13 |
图13 用户liyang对文件进行解密并浏览(白色部分)
#p#
3 GnuPG使用实例
1.使用GPG收发数据
下面详细介绍如何使用GPG收发数据,主要会涉及到数据交换的两种方式:
数字签名传输(Signed data):发送者使用私钥对数据加密,接收者使用公钥对数据解密。
数据加密传输(Encrypted data):发送者使用公钥对数据加密,接收者使用私钥对数据解密。
(1)数字签名传输
发送者使用私钥对数据进行签名,接收者拥有发送者的公钥,对之信任并使用它验证接收数据的完整性。对数据进行签名的最简单的方法是使用clearsign命令,这将使GPG创建一个易读的签名,很适于发送Email。具体命令及执行情况如下,参见图14:
#gpg --clearsign mymessage.txt
图14 |
图14 对文件tansmit.txt生成签名(transmit.txt.asc)
从图14中可以看到:输入密码后,就将生成一个扩展名为.asc的新文件,这里就是transmit.txt.asc。这个文件包含了transmit.txt文件的原始内容以及签名信息(参见图15):
图15 |
图15 文件transmit.txt.asc的内容
当接收者收到包含上述签名的信息或文件时,他可以使用发送者的公钥来验证信息的完整性,具体命令及执行情况如下,参见图16:
#gpg --verify transmit.txt.asc
图16 |
图16 验证数字签名的完整性
(2)数据加密传输
第2种传输方式的目的是为了只让个别人看到发送信息发送者使用其公钥对文件或数据进行加密,接收者使用发送者的私钥对接收数据进行解密。加密命令包含两个部分,一部分指定接收者的Email,另一部分指定要加密的文件。具体命令如前面所述的加密和解密的流程完全一致,这里不再赘述,这里只给出一个加密后的transmit.txt文件的示例,如图17所示。在网络中传输时,即算该文件为黑客或者其他用户截获到,没有私钥,该用户也无法对该文件进行识别,因而具有很高的安全性。
图17 |
图17 加密后的transmit.txt文件
另外,值得一提的是:通过以上方式被加密的信息也可以被签名,方法是在上述命令中再加上一个-s参数。如下命令所示:
#gpg –r < UID > --encrypt -s< file >
那么,在使用-d选项来解密该文件时,将会出现如图18所示的情况,该图的白色部分给出了对签名的检验情况:
图18 |
图18 解密过程中检验数字签名
2.使用GPG验证RPM包
一旦学会使用RPM,很容易安装好它们就不管了,并且忘记了安全性问题。破解者可能会在网络上发布的RPM中植入病毒或木马。rpm命令包括了检查RPM完整性的方法,它同样使用的是GPG。它也可以验证程序包,甚至验证一个文件的内容。
该系统的关键是Fedora Core GPG密钥。它们应默认安装为/etc/gpg/rpm-gpg/RPM-GPG-KEY.*。接着,导入GPG公共密钥。例如,如果从安装CD或DVD导入,应该用下面的命令导入/var/lib/rpm /Pubkeys文件:
# rpm --import /media/disk/RPM-GPG-KEY
(1)验证程序包
现在可以验证RPM程序包是否有真正的Fedora Core签名。例如,在重新编译前想验证内核源RPM的完整性。要在本地目录验证kernel .src RPM的下载版本,可执行下面的命令:
# rpm -K kernel-2.6.15-1.2054_FC5.src.rpm
kernel-2.6.15-1.2054_FC5.src.rpm: (shal) dsa sha1 md5 gpg OK
该命令对照声明的加密方案(包括GPG)来验证内核源RPM的完整性。
(2)验证文件
对照原始配置检查文件是很有用的。例如,想了解计算机上的一个文件是否被破解者修改,需要对比原始配置检查文件的一系列标准属性。与通过RPM程序包安装的每个文件相关联的数据存储在/var/lib/rpm目录下的RPM数据库中。
如果怀疑某个命令运行不正常,可以对照此RPM数据库检查该命令。以mount命令为例。用下面的命令能检查mount的完整性:
# rpm -Vf /bin/mount
如果看不到任何输出,该命令还和原来安装时一样。
如果有人篡改了mount命令,会生成下面的输出:
# rpm -Vf /bin/mount
S.5 T /bin/mount
该命令将检查/bin/mount的9个属性。如果见到表1中的一个字母,说明文件在某一方面不同于原始文件。上面的例子说明文件大小、MD5校验和以及文件修改时间有变化。
表1 验证文件的错误输出
图19 |
在某些情况下,测试失败不是问题。比如,如果修改了/etc/inittab文件,就会看到一个像是验证失败的结果:
# rpm -Vf /etc/inittab
S.5 T c /etc/inittab
但这个失败也许不表示存在问题。例如,我是在修改了此配置文件中的initdefault变量后得到这个结果的。也就是说,文件大小(S)和校验和(5)发生变化是因为修改了文件的内容,文件修改时间(T)自然也不同于在计算机上安装Fedora Core的时间。
4 GnuPG使用技巧
在使用GnuPG的过程中,需要注意如下几个问题:
需要根据实际的应用来确定生成密钥的算法、密钥的长度以及密钥的有效期限;
需要用户通过交互移动鼠标、键盘来保证生成的密钥对的随机性;否则,极有可能被黑客破解;
公钥的安全性问题是GnuPG安全的核心,一个成熟的加密体系必然要有一个成熟的密钥管理机制配套。公钥体制的提出就是为了解决传统加密体系的密钥分配难保密的缺点。比如网络黑客们常用的手段之一就是“监听”,如果密钥是通过网络传送就太危险了。对GnuPG来说公钥本来就要公开,就没有防监听的问题。但公钥的发布中仍然存在安全性问题,例如公钥的被篡改,这可能是公钥密码体系中最大的漏洞,因为大多数新手不能很快发现这一点。你必须确信你拿到的公钥属于它看上去属于的那个人。
私钥的保密也是决定性的。相对公匙而言,私钥不存在被篡改的问题,但存在泄露的问题。GnuPG的办法是让用户为随机生成的RSA私钥指定一个口令。只有通过给出口令才能将私钥释放出来使用,用口令加密私钥的方法保密程度和GnuPG本身是一样的。所以私钥的安全性问题实际上首先是对用户口令的保密。当然私钥文件本身失密也很危险,因为破译者所需要的只是用穷举法试探出你的口令了,虽说很困难但毕竟是损失了一层安全性。在这里只用简单地记住一点,要像任何隐私一样保藏你的私钥,不要让任何人有机会接触到它。
在实际的使用过程中,用户可以将GnuPG软件灵活地运用到网络数据传输,包括电子邮件发送,FTP文件传送等各个应用领域。
【51CTO.COM 独家特稿,转载请注明出处及作者!】
【编辑推荐】