使用GnuPG进行身份认证(转)
■ 中科院计算所博士 李洋
在功能上,GnuPG和PGP是一样的。但由于PGP使用了IDEA专利算法,所以使用PGP会有许可证的麻烦。而GnuPG并没有使用这个算法,所以对用户来说使用GnuPG没有任何限制。GnuPG使用非对称加密算法,安全程度比较高。
随着网络与计算机技术的发展,数据存储与数据交换的安全性、完整性和一致性已经变得越来越重要。网络信息安全中核心的加密技术也随之应用于数据存储和数据交换。同时,为了确保网络数据交换时的双方身份的正确性以及不可抵赖性,签证体系也已经日趋成熟。如何保证在不安全的网络上传输数据的安全性成为网络信息安全界研究的热点和经典问题。本文将向读者介绍一种Linux下的基于PGP(Pretty Good Privacy)机制的加密及签名软件——GnuPG,通过它可以极大地保证网络用户传输及使用数据的安全性。
PGP的创始人是美国的PhilZimmermann。他创造性地把RSA公钥体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密钥认证管理机制上有非常巧妙的设计,因此PGP成为几乎最流行的公钥加密软件包。
其中,RSA(Rivest-Shamir-Adleman)算法是一种基于“大数不可能质因数分解假设”的公钥体系。它是指每一个用户都拥有一对密钥:公钥和私钥。其中,密钥由用户保存,公钥则由用户尽可能地散发给其他人,以便用户与其他人通信。这两个密钥是互补的,用公钥加密的密文可以用私钥解密,反过来也一样。
GnuPG介绍
PGP(Pretty Good Privacy),是一个基于RSA公钥加密体系的邮件加密软件。它不但可以对用户的数据保密以防止非授权者阅读,还能对用户的邮件加上数字签名从而使收信人确信邮件是由该用户发出。让人们可以安全地和从未见过的人们通信,而事先不需要任何保密的渠道用来传递密钥。PGP采用了审慎的密钥管理,一种RSA 和传统加密的杂合算法,用于数字签名的邮件文摘算法,加密前压缩等。它功能强大,速度很快。
GnuPG是实现安全通信和数据存储的一系列工具集,可以做加密数据和做数字签名之用。在功能上,它和PGP是一样的。由于PGP使用了IDEA专利算法,所以使用PGP会有许可证的麻烦。但是GnuPG并没有使用这个算法,所以对用户来说使用GnuPG没有任何限制。GnuPG使用非对称加密算法,安全程度比较高。GnuPG主要有以下特点:
● 完全兼容PGP;
● 没有使用任何专利算法,没有专利问题;
● 遵循GNU公共许可证;
● 与OpenPGP兼容;
● 使用广泛,安全性高于PGP2,可以加密校验和PGP5.x格式的信息;
● 支持多种加密算法;
● 支持扩展模块;
● 用户标识遵循标准结构;
● 多语言支持(尚未支持中文);
● 支持匿名信息接收;
● 支持HKP密钥服务。
安装GnuPG
GnuPG的源代码安装包可以在网站上取得。当前网上的最新版本为:gnupg-1.9.20.tar.gz。取得GnuPG的源代码,然后执行如下操作:
(1)解压缩软件包
#tar xvzf gnupg-1.9.20.tar.gz
#cd gnupg-version
(2)编译源代码
#./configure
#make
(3)校验生成的工具
#make check
(4)安装
#make install
使用GnuPG
使用GnuPG其实非常简单,Linux系统中已经提供了很多命令来辅助用户使用该软件来进行加解密以及数字签名,下面分别详细介绍这些常用的命令:
● 生成公钥/私钥对
使用GnuPG之前必须生成密钥对(公钥和私钥),具体过程可按如下步骤(一个生成密钥对的实例)进行操作:
#gpg --gen-key
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: keyring `/root/.gnupg/secring.gpg' created
选择要生成的密钥的算法,GnuPG可以生成多种密钥对,有三种选择。这里推荐用户使用缺省的,如下所示:
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.
接着,需要选择密钥的长度。DSA密钥的长度为1024位,Elmagal密钥的长度最小为768位,推荐的最大长度为2048位。生成一个很长的密钥既有优点也有缺点,长的密钥安全性非常高,但是会导致加密的过程变得非常缓慢(用户可以测试一下,使用1024和 2048所耗费的时间区别是比较大的),另外,密钥过长,也会使证书的长度变大。对于用户的普通应用来说,缺省的密钥长度1024位已经够用了。所以这里推荐其采用1024位。
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) 1024
Requested keysize is 1024 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) 2
Key expires at 2006-01-04 CST
Is this correct (y/n)? y
接着,还需要设定产生密钥对所需要的用户ID、用户邮箱地址,并且通过快速地移动鼠标或者键盘等外围设备来增强产生的密钥对的随机性。过程如下:
You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) < heinrichh@duesseldorf.de>"
Real name: patterson
Email address: patterson@sohu.com
Comment: patterson@sohu.com
You selected this USER-ID:
"patterson@sohu.com (patterson@sohu.com) < patterson@sohu.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? patterson@sohu.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.
.................................
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: /root/.gnupg/trustdb.gpg: trustdb created
public and secret key created and signed.
key marked as ultimately trusted.
最后,密钥对产生成功,如下所示:
pub 1024D/137D5D5F 2006-01-02 patterson@sohu.com (patterson@sohu.com)
Key fingerprint = 0095 7550 2C3F B376 8EC0 B857 A375 A2D0 137D 5D5F
sub 1024g/5B20637F 2006-01-02 [expires: 2006-01-04]
● 公钥的导出
在用户使用生成的公钥之前首先需要导出它。用户可以输出公钥到主页或者密钥服务器上供其他的用户与自己传输数据时使用。选项--export可以实现这个功能,在使用这个选项时,还必须使用附加的选项指明用户要输出的公钥。
下面的命令表示以二进制格式将用户super的公钥输出到super.asc(使用前通常都需要导出到以“.asc”结尾的文件)文件:
# gpg --export super >super.asc
如下命令表示以可读的ASCII字符格式将用户super的公钥输出到super.asc文件:
#gpg --export -a super >super.asc
● 公钥的导入
在使用别的用户的公钥之前,需要将其进行导入操作,用下列命令可以将对方的公钥导入:
#gpg --import liyang.asc
上述命令将liyang用户的公钥从liyang.asc导入到本地。
然后,用户可以使用gpg --list-keys命令查看是否成功导入了对方的公钥。
● 加密和解密
通过上述的密钥生成以及公钥分发后,加密和解密数据变得非常容易,用户可以通过使用该功能来达到安全地在网络上传输自己的隐密数据的目的。
如果用户patterson要给用户liyang发送一个加密文件,则他可以使用liyang的公钥加密这个文件,并且这个文件也只有liyang使用自己的密钥才可以解密查看。下面给出加解密的步骤:
1. 用户patterson使用liyang的公钥加密文件gpg.conf,使用下面的指令:
# gpg -e gpg.conf
You did not specify a user ID. (you may use "-r")
Enter the user ID. End with an empty line: liyang
Added 1024g/C50E455A 2006-01-02 "liyang (hello) < liyang@sina.com>"
这样,就可以将gpg.conf文件加密成gpg.conf.gpg,一般用户是无法阅读的
2. 用户liyang 使用自己的私钥来解密该文件,如下所示:
# gpg -d gpg.conf.gpg
You need a passphrase to unlock the secret key for
user: "liyang (hello) < liyang@sina.com>"
1024-bit ELG-E key, ID C50E455A, created 2006-01-02 (main key ID 378D11AF)
GnuPG提示用户,需要输入生成私钥使用的密码:
Enter passphrase:
gpg: encrypted with 1024-bit ELG-E key, ID C50E455A, created 2006-01-02
"liyang (hello) < liyang@sina.com>"
● 对文件进行签名
前面说过,为了保证向接收用户证明数据的发送用户的身份,可以使用GnuPG的签名机制来实现,这样接收用户就能够确定接收到的数据是真正的发送方发送的,从而可以保证其不可抵赖性,具体的命令如下:
#gpg -se -r super test.c
上述命令是对本地用户(liyang)的test.c文件进行加密(使用super用户的公钥)并签名(使用liyang用户的私钥)。需要注意的是,在使用上述命令以前,必须要将两个用户的公钥进行相互的导入才能正常的使用。
● 其他常用命令
除了上述的命令外,还有许多用于显示密钥列表、导入公钥等用途的gpg命令,用户可以使用“man gpg”命令来参看Linux下的文档,并在不同的应用情况下灵活地运用,这里不再详述。
需要注意的问题
在使用GnuPG的过程中,需要注意如下几个问题:
● 需要根据实际的应用来确定生成密钥的算法、密钥的长度以及密钥的有效期限。
● 需要用户通过交互移动鼠标、键盘来保证生成的密钥对的随机性,否则,极有可能被黑客破解。
● 公钥的安全性问题是GnuPG安全的核心,一个成熟的加密体系必然要有一个成熟的密钥管理机制配套。公钥体制的提出就是为了解决传统加密体系的密钥分配难保密的缺点。比如网络黑客们常用的手段之一就是“监听”,如果密钥是通过网络传送就太危险了。对GnuPG来说公钥本来就要公开,就没有防监听的问题。但公钥的发布中仍然存在安全性问题,例如公钥的被篡改,这可能是公钥密码体系中最大的漏洞。
● 私钥的保密也是决定性的。相对公匙而言,私钥不存在被篡改的问题,但存在泄露的问题。GnuPG的办法是让用户为随机生成的RSA私钥指定一个口令。只有通过给出口令才能将私钥释放出来使用,用口令加密私钥的方法保密程度和GnuPG本身是一样的。所以私钥的安全性问题实际上首先是对用户口令的保密。当然私钥文件本身失密也很危险,因为破译者所需要的只是用穷举法试探出口令,虽说很困难但毕竟是一个不可忽视的安全隐患。在这里用户只需要简单地记住一点:要像任何隐私一样保藏你的私钥,不要让任何人有机会接触到它。
● 在实际的使用过程中,用户可以将GnuPG软件灵活地运用到网络数据传输,包括电子邮件发送,FTP文件传送等各个应用领域。
(计算机世界报 2006年04月10日 第13期 B26、B27)
阅读(1138) | 评论(0) | 转发(1) |