数据保护可以通过不现的软件使用不同的方法来实现,例如在网络上的数据传输我们可以通过SSL的加密来实现数据的安全性,在邮件传输方面我们可以使用PGP或申请证书来保护数据和实现邮件的签名功能。在以前的文章有有说过Windows邮件方面的加密传输,通过使用微软的证书服务器来实现。具体文件可参考( [url]http://waringid.blog.51cto.com/65148/50492[/url] );也谈到了Linux下Web服务器的安全防护,也是使用证书的方式来实现,相关文章参见( [url]http://waringid.blog.51cto.com/65148/59685[/url] )。今天我们来介绍下GnuPG
  GnuPG是实现安全通讯和数据存储的一系列工具集,可以做数据加密和数字签名用。在功能上,和PGP一样,但是由于PGP使用了IDEA专利算法,所以使用PGP会有许可的麻烦,但是GnuPG没有使用这个算法,所以对用户来说没有任何限制。
  GnuPG的下载地址为 [url]http://www.gnupg.org[/url] ;我机器的环境是新安装的机器,除了安装“开发工具”的组件外,其它组件都没有安装。所以在安装之前需要下载以下的软件包安装。不然会出现下图所示的错误。
使用GnuPG为数据保驾护航_第1张图片  
  如果发生上述的错误,表示缺少相应的组件,你需要下载它们重新编译并安装,我的机器上需要下载的有以下这些:当然也许你机器上出现的提示不太一样,照着提示做就可以了。
[url]ftp://ftp.gnupg.org/gcrypt/libgpg-error[/url]
[url]ftp://ftp.gnupg.org/gcrypt/libgcrypt/[/url]
[url]ftp://ftp.gnupg.org/gcrypt/libassuan/[/url]
[url]ftp://ftp.gnupg.org/gcrypt/libksba/[/url]
[url]ftp://ftp.gnu.org/gnu/pth/[/url]
  有编译这些软件包的时候有两个地方需要注意,第一是如果你的系统中的libgcrypt的库文件是小于1.22版的,在后面的编译中会出问题,所以你需要先删除系统中自带的那个版本,然后再安装libgcrypt这个软件。在出现找不到libgcrypt.so.11这个文件的时候将/usr/local/lib/libgcrypt.so.11拷到/usr/lib下面就可以。下图是我系统中自带的libgcrypt的版本,是1.20的。第二点是在编译pth软件包时需要加入参数--enable-pthread。其它就没什么好说的了,平常的编译方式就可以搞定了。
使用GnuPG为数据保驾护航_第2张图片
使用GnuPG为数据保驾护航_第3张图片
tar zxvf gnupg-1.9.20.tar.gz
cd gnupg-1.9.20
./configure --prefix=/usr/local/gnupg
make
make check
make install
  完成的页面如下图所示:
使用GnuPG为数据保驾护航_第4张图片
使用GnuPG为数据保驾护航_第5张图片
GnuPG应用:
  一:生成公钥/私钥对
gpg --gen-key
    1:选择要生成的密钥算法,这里有三种选择。DSA密钥是生成证书的最基本的格式,EIGamal密钥对可以用来加密。第二种选择与第一种相似,但是仅生成DSA密钥对。第三种选择可以生成供签证和加密使用的EIGamal密钥对。一般选择默认。
    2:选择密钥的长度。DSA的长度为1024位,而EIGamal的最小长度为768位,推荐的最大长度为2048位。对于普能的应用选1024就可以了。
    3:设定密钥的有效期。对于安全性较高的应用,可以将有效期设得较短一些,防止别有用心的人有较长的时间破解。
  在生成公钥/私钥对时,如果当前用户目录下不存在.gnupg的文件夹,则会出现下图所示的错误,解决的办法是新建这个文件夹。
使用GnuPG为数据保驾护航_第6张图片
使用GnuPG为数据保驾护航_第7张图片  
使用GnuPG为数据保驾护航_第8张图片
  二:导出公钥
    在用户使用生成的公钥之前,需要先导出它。用户可以输出公钥到主页或是密钥服务器上供其它有需要的用户与自己传输数据时使用,选项“Export”可以实现这个功能。下面的命令表示以二进制的格式将用户super的公钥输出到super.asc文件。
gpg --export waringid#gmail.com >root.asc
使用GnuPG为数据保驾护航_第9张图片
  下面的命令表示以可读的ASCII字符格式将用户super的公钥输出到super.asc文件。
gpg --export -a waringid#gmail.com >root_r.asc
使用GnuPG为数据保驾护航_第10张图片
  三:公钥的导入
    在使用别的用户的公钥之前,需要进行导入操作,下面的命令表示将waring用户的公钥从waring.asc导入到本地。导入完成后可以使用gpg --list-keys查看是否成功导入了对方的公钥。
gpg --import root.asc
使用GnuPG为数据保驾护航_第11张图片   
  四:加密和解密
    密钥生成及公钥分发后,用户就可以安全地在网络上传输自己的隐密数据。如果用户peter要给用户root发送一个加密文件,可以使用root的公钥加密这个文件,且这个文件只有root使用自己的密钥才可以解密查看。下面是实现的步骤。
    1:用户peter使用root的公钥加密pgp.conf文件
gpg -e gpd.conf
使用GnuPG为数据保驾护航_第12张图片     
    2:用户root使用自己的私钥解密该文件
gpg -d gpg.conf.gpg
使用GnuPG为数据保驾护航_第13张图片
  四:对文件进行签名
    前面有提到,为了保证向接收用户证明数据的发送用户的身份,可以使用GnuPG的签名机制来实现,这样接收用户就能确定接收到的数据是真正的发送方发送的,命令如下示。它表示是对本地用户waring的test.c文件进行加密(使用peter用户的公钥)并签名(使用waring用户和私钥)。当然,在使用上述命令之前要确保两个用户的公钥都进行了导入操作。
gpg -se -r peter test.c
   当然,它的应用远远不止如此,更多的应用可以参考它的说明文档。在现实中,安全的等级是相对的,并不是采取了相应的安全方法就能保证100%的安全,就像“木桶理论”说的那样,一个系统或是一个程序的安全不是取决它最安全最长的那块木板,恰恰是最短的那块。非对称加密分离了公钥和私钥在一定程度上比对称加密要强,但是私钥的保密性就成了决定性的因素。相对公钥而言,私钥不存在被篡改的问题,但存在泄露的问题。GnuPG的办法是让用户为随机生成的RSA私钥指定一个口令。只有通过给出口令才能将私钥解压并使用,所以私钥的安全性实际上首先是对用户口令的保密。