不安全網(wǎng)絡(luò)中的數(shù)據(jù)安全傳輸利器——GnuPG
原創(chuàng)1 GnuPG簡介
隨著網(wǎng)絡(luò)與計(jì)算機(jī)技術(shù)的發(fā)展,數(shù)據(jù)存儲(chǔ)與數(shù)據(jù)交換的安全性、完整性和一致性已經(jīng)變得越來越重要。如何保證在不安全的網(wǎng)絡(luò)上傳輸數(shù)據(jù)的安全性成為網(wǎng)絡(luò)信息安全界研究的熱點(diǎn)和經(jīng)典問題。本文將通過具體的加解密實(shí)例向用戶來介紹一種Linux下的基于PGP(Pretty Good Privacy)機(jī)制的加密及簽名軟件——GnuPG,包括密鑰生成、公鑰導(dǎo)出、加密文件、解密文件、對(duì)文件進(jìn)行數(shù)字簽名等重要步驟,通過它可以極大地保證網(wǎng)絡(luò)用戶傳輸及使用數(shù)據(jù)的安全性。并且,用戶可以通過靈活運(yùn)用本文的技術(shù)來對(duì)網(wǎng)絡(luò)傳送的文檔、電子郵件等進(jìn)行安全傳輸。
PGP(Pretty Good Privacy),是一個(gè)基于RSA公鑰加密體系的郵件加密軟件。它不但可以對(duì)用戶的數(shù)據(jù)保密以防止非授權(quán)者閱讀,還能對(duì)你的郵件加上數(shù)字簽名從而使收信人確信郵件是由你發(fā)出。讓人們可以安全地和從未見過的人們通訊,而事先不需要任何保密的渠道用來傳遞密鑰。PGP采用了審慎的密鑰管理,一種RSA和傳統(tǒng)加密的雜合算法,用于數(shù)字簽名的郵件文摘算法,加密前壓縮等。它功能強(qiáng)大,速度很快。
PGP的創(chuàng)始人是美國的PhilZimmermann。他創(chuàng)造性地把RSA公鑰體系的方便和傳統(tǒng)加密體系的高速度結(jié)合起來,并且在數(shù)字簽名和密鑰認(rèn)證管理機(jī)制上有非常巧妙的設(shè)計(jì)。因此PGP成為幾乎最流行的公鑰加密軟件包。其中,RSA(Rivest-Shamir-Adleman)算法是一種基于“大數(shù)不可能質(zhì)因數(shù)分解假設(shè)”的公鑰體系。簡單地說就是找兩個(gè)很大的質(zhì)數(shù),一個(gè)公開給世界,一個(gè)不告訴任何人。一個(gè)稱為“公鑰”,另一個(gè)叫“私鑰”。這兩個(gè)密鑰是互補(bǔ)的,就是說用公鑰加密的密文可以用私鑰解密,反過來也一樣。
具體地說,GnuPG是實(shí)現(xiàn)安全通訊和數(shù)據(jù)存儲(chǔ)的一系列工具集,可以做加密數(shù)據(jù)和做數(shù)字簽名之用。在功能上,它和PGP是一樣的。由于PGP使用了IDEA專利算法,所以使用PGP會(huì)有許可證的麻煩。但是GnuPG并沒有使用這個(gè)算法,所以對(duì)用戶來說使用GnuPG沒有任何限制。GnuPG使用非對(duì)稱加密算法,安全程度比較高。所謂非對(duì)稱加密算法,就是每一個(gè)用戶都擁有一對(duì)密鑰:公鑰和私鑰。其中,密鑰由用戶保存,公鑰則由用戶盡可能地散發(fā)給其他人,以便用戶之間的通訊。該軟件可以從網(wǎng)站http://www.gnupg.org/上進(jìn)行下載安裝。
GnuPG支持的算法有如下:
公鑰:RSA, RSA-E, RSA-S, ELG-E, DSA
對(duì)稱加密:3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
散列:MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
壓縮:不壓縮, ZIP, ZLIB, BZIP2
其使用的基本語法為:gpg [選項(xiàng)] [文件名]
其實(shí)現(xiàn)的功能包括簽名、檢查、加密或解密,默認(rèn)的操作依輸入數(shù)據(jù)而定。
#p#
2 詳細(xì)使用方法
1.生成密鑰對(duì)
使用GnuPG之前必須生成密鑰對(duì)(公鑰和私鑰),參數(shù)選項(xiàng)"--gen-key"可以生成密鑰對(duì)??砂慈缦虏襟E操作,如圖1、圖2所示。在圖1中,首先用戶需要注意有如下幾個(gè)關(guān)鍵的步驟:
(1)GnuPG要求輸入要生成的密鑰的算法:GnuPG可以生成多種密鑰對(duì),這里有三種選擇。DSA密鑰是生成證書的最基本的密鑰格式。ElGamal密鑰對(duì)可以用來加密。第二種選擇與第一種相似,但是僅僅生成DSA密鑰對(duì),第三種選擇可以生成供簽證和加密使用的ElGamal密鑰對(duì)。對(duì)大多數(shù)用戶來說,使用缺省的選擇是非常方便的。
(2)選擇密鑰的長度,DSA密鑰的長度在512位~1024位之間,Elmagal密鑰的長度則沒有限制。生成一個(gè)很長的密鑰既有優(yōu)點(diǎn)也有缺點(diǎn),長的密鑰無疑安全性非常高,但是會(huì)導(dǎo)致加密的過程變得緩慢,另外,密鑰過長,也會(huì)使證書的長度變大。缺省的密鑰長度1024位已經(jīng)夠用了,確定了密鑰的長度之后,就不能再改變它。
(3)需要指定這個(gè)密鑰對(duì)的有效日期,如果選擇了生成ElGamal或者 DSA密鑰對(duì),它們需要指定密鑰對(duì)的失效日期。對(duì)于大多數(shù)用戶來說,密鑰對(duì)沒有失效期限是可以的。雖然在密鑰對(duì)產(chǎn)生以后,可以改變它的有效日期,但是仍要謹(jǐn)慎選擇這個(gè)參數(shù)。因?yàn)楣€發(fā)送出去以后,很難再改變其他用戶擁有的您的公鑰。
![]() |
圖1 |
圖1 生成密鑰對(duì)的前3個(gè)關(guān)鍵步驟
完成上述步驟后,用戶還需要注意如圖5所示的后續(xù)幾個(gè)關(guān)鍵步驟:
(4)用戶需要指定一個(gè)用戶ID來標(biāo)識(shí)選擇的密鑰,GnuPG可以根據(jù)用戶的真實(shí)姓名、注釋和E-mail地址產(chǎn)生一個(gè)用戶ID。在圖2中,我們使用姓名(liyang),電子郵件地址(liyang@tsinghua.com)和注釋(liyang@tsinghua),并設(shè)定了密鑰的密碼,來完成了該步驟。這個(gè)口令的目的是用來加密用戶的私鑰,這樣,即使有人偷走了用戶的私鑰,沒有這個(gè)口令,也無法使用,這個(gè)口令的長度沒有限制,但是,正如我們所知道的,一個(gè)短的口令是很容易被破解的。同樣,如果用戶的口令是一個(gè)單詞,也很容易被破解。
(5)在產(chǎn)生密鑰的過程中,GnuPG需要得到一些隨機(jī)的數(shù)字。這些隨機(jī)的數(shù)字可以從用戶的系統(tǒng)當(dāng)前狀態(tài)中得到,所以這時(shí)候,用戶可以隨機(jī)敲一下鍵盤或者移動(dòng)鼠標(biāo),來產(chǎn)生高質(zhì)量的隨機(jī)數(shù)。圖2中系統(tǒng)就明顯地要求筆者盡量多產(chǎn)生一些隨機(jī)數(shù)字來生成密鑰,以保證質(zhì)量。
![]() |
圖2 |
圖2 生成密鑰的后續(xù)2個(gè)關(guān)鍵步驟示意
完成了上述5個(gè)關(guān)鍵步驟后,如果系統(tǒng)顯示如圖3所示的成功界面,則生成密鑰成功,否則用戶需要再重復(fù)如上5個(gè)步驟。
![]() |
圖3 |
圖3 生成密鑰成功
2.為密鑰建立吊銷證書
當(dāng)用戶的密鑰對(duì)生成之后,用戶應(yīng)該立即做一個(gè)公鑰回收證書,如果忘記了私鑰的口令或者私鑰丟失或者被盜竊,用戶可以發(fā)布這個(gè)證書來聲明以前的公鑰不再有效。生成回收證書的選項(xiàng)是"--gen-revoke"。具體使用的命令是:
# gpg --output revoke.asc --gen-revoke mykey
其中mykey 參數(shù)是可以表示的密鑰標(biāo)識(shí),產(chǎn)生的回收證書放在revoke.asc文件里,一旦回收證書被發(fā)放,以前的證書就不能再被其他用戶訪問,因此以前的公鑰也就失效了。具體的過程如圖4至6所示。在該過程中我們?yōu)橛脩鬺iyang的密鑰建立了一份吊銷證書,在建立過程中需要依次輸入吊銷理由和為密鑰設(shè)定的密碼才能成功建立:
![]() |
圖4 |
圖4 輸入吊銷理由
![]() |
圖5 |
圖5 輸入為密鑰建立的密碼
![]() |
圖6 |
圖6 成功建立吊銷證書
3.顯示密鑰列表
完成上述操作后可以使用 --list-keys 選項(xiàng)列出我們生成的密鑰,如圖7所示:
![]() |
圖7 |
圖7 密鑰列表
4.輸出公鑰
用戶可以輸出您的公鑰供您的主頁使用,也可以把它放在密鑰服務(wù)器上,當(dāng)然,還可以使用于其他的途徑。在使用此公鑰之前用戶首先要導(dǎo)出它。選項(xiàng)--export可以實(shí)現(xiàn)這個(gè)功能,在使用這個(gè)選項(xiàng)時(shí),還必須使用附加的選項(xiàng)指明用戶要輸出的公鑰。
下面的命令表示以二進(jìn)制格式輸出公鑰:
# gpg --output pubring.gpg --export samsunglinux@minigui.org
如下命令表示以ASCII字符格式輸出:
#gpg --output pubring.gpg --export--armor> liyang_public-key.asc
5.導(dǎo)入公鑰
用戶可以把從第三方的公鑰數(shù)據(jù)庫中得到的公鑰導(dǎo)入自己的私有數(shù)據(jù)庫,在與他人進(jìn)行通訊時(shí)使用。命令如下:
#gpg --import < filename >
其中,參數(shù)filename為公鑰文件。
圖8給出了將用戶liyang的公鑰導(dǎo)入到用戶samsunglinux自己的私有數(shù)據(jù)庫的例子:
![]() |
圖8 |
圖8 導(dǎo)入公鑰示例
#p#
6.確認(rèn)密鑰
導(dǎo)入密鑰以后,使用數(shù)字簽名來驗(yàn)證此證書是否合法。查看數(shù)字簽名使用 --fingerprint 選項(xiàng)。其命令如下所示:
#gpg --fingerprint < UID >
其中,UID為用戶要驗(yàn)證的公鑰。圖9給出了驗(yàn)證證書的例子:
![]() |
圖9 |
圖9 確認(rèn)密鑰示意
7.密鑰簽名
導(dǎo)入密鑰之后,可以使用 --sign-key 選項(xiàng)進(jìn)行簽名,簽名的目的是證明用戶完全信任這個(gè)證書的合法性。其命令格式為:
# gpg --sign-key < UID >
其中,UID 是要簽名的公鑰。圖10為使用該命令的結(jié)果示意:
![]() |
圖10 |
圖10 確認(rèn)密鑰示意
8.檢查簽名
用戶可以使用 --check-sigs選項(xiàng)來檢查在上面對(duì)密鑰所作的簽名。其命令格式為:
# gpg --check-sigs < UID >
這個(gè)選項(xiàng)可以列出此密鑰文件的所有的簽名。圖11給出了相應(yīng)的示意:
![]() |
圖11 |
圖11 檢查簽名示意
9.加密和解密
使用GnuPGP加密和解密一個(gè)文件非常容易,如果用戶要給對(duì)方用戶發(fā)送一個(gè)加密文件,可以使用對(duì)方用戶的公鑰加密這個(gè)文件,并且這個(gè)文件也只有對(duì)方用戶使用自己的密鑰才可以解密查看。
加密一個(gè)文件可以使用下面的指令
#gpg –r < UID > --encrypt < file >
其中,UID是對(duì)方的公鑰,file為要加密的文件。
對(duì)應(yīng)地,如果用戶要解開一個(gè)其他用戶發(fā)給您的文件可以使用下面的指令:
#gpg -d < file >
其中,file是要解密的文件。解密過程中,GnuPG會(huì)提示用戶輸入使用密鑰所需要的口令,也就是在產(chǎn)生私鑰時(shí)用戶所輸入的口令,否則,該文件將無法正常解密和為用戶進(jìn)行使用。圖12和圖13分別顯示了用戶samsung對(duì)文件gpg.conf進(jìn)行加密傳輸,用戶liyang對(duì)該加密文件gpg.conf.gpg進(jìn)行解密的過程。
![]() |
圖12 |
圖12 用戶samsunglinux對(duì)文件gpg.conf進(jìn)行加密
![]() |
圖13 |
圖13 用戶liyang對(duì)文件進(jìn)行解密并瀏覽(白色部分)
#p#
3 GnuPG使用實(shí)例
1.使用GPG收發(fā)數(shù)據(jù)
下面詳細(xì)介紹如何使用GPG收發(fā)數(shù)據(jù),主要會(huì)涉及到數(shù)據(jù)交換的兩種方式:
數(shù)字簽名傳輸(Signed data):發(fā)送者使用私鑰對(duì)數(shù)據(jù)加密,接收者使用公鑰對(duì)數(shù)據(jù)解密。
數(shù)據(jù)加密傳輸(Encrypted data):發(fā)送者使用公鑰對(duì)數(shù)據(jù)加密,接收者使用私鑰對(duì)數(shù)據(jù)解密。
(1)數(shù)字簽名傳輸
發(fā)送者使用私鑰對(duì)數(shù)據(jù)進(jìn)行簽名,接收者擁有發(fā)送者的公鑰,對(duì)之信任并使用它驗(yàn)證接收數(shù)據(jù)的完整性。對(duì)數(shù)據(jù)進(jìn)行簽名的最簡單的方法是使用clearsign命令,這將使GPG創(chuàng)建一個(gè)易讀的簽名,很適于發(fā)送Email。具體命令及執(zhí)行情況如下,參見圖14:
#gpg --clearsign mymessage.txt
![]() |
圖14 |
圖14 對(duì)文件tansmit.txt生成簽名(transmit.txt.asc)
從圖14中可以看到:輸入密碼后,就將生成一個(gè)擴(kuò)展名為.asc的新文件,這里就是transmit.txt.asc。這個(gè)文件包含了transmit.txt文件的原始內(nèi)容以及簽名信息(參見圖15):
![]() |
圖15 |
圖15 文件transmit.txt.asc的內(nèi)容
當(dāng)接收者收到包含上述簽名的信息或文件時(shí),他可以使用發(fā)送者的公鑰來驗(yàn)證信息的完整性,具體命令及執(zhí)行情況如下,參見圖16:
#gpg --verify transmit.txt.asc
![]() |
圖16 |
圖16 驗(yàn)證數(shù)字簽名的完整性
(2)數(shù)據(jù)加密傳輸
第2種傳輸方式的目的是為了只讓個(gè)別人看到發(fā)送信息發(fā)送者使用其公鑰對(duì)文件或數(shù)據(jù)進(jìn)行加密,接收者使用發(fā)送者的私鑰對(duì)接收數(shù)據(jù)進(jìn)行解密。加密命令包含兩個(gè)部分,一部分指定接收者的Email,另一部分指定要加密的文件。具體命令如前面所述的加密和解密的流程完全一致,這里不再贅述,這里只給出一個(gè)加密后的transmit.txt文件的示例,如圖17所示。在網(wǎng)絡(luò)中傳輸時(shí),即算該文件為黑客或者其他用戶截獲到,沒有私鑰,該用戶也無法對(duì)該文件進(jìn)行識(shí)別,因而具有很高的安全性。
![]() |
圖17 |
圖17 加密后的transmit.txt文件
另外,值得一提的是:通過以上方式被加密的信息也可以被簽名,方法是在上述命令中再加上一個(gè)-s參數(shù)。如下命令所示:
#gpg –r < UID > --encrypt -s< file >
那么,在使用-d選項(xiàng)來解密該文件時(shí),將會(huì)出現(xiàn)如圖18所示的情況,該圖的白色部分給出了對(duì)簽名的檢驗(yàn)情況:
![]() |
圖18 |
圖18 解密過程中檢驗(yàn)數(shù)字簽名
2.使用GPG驗(yàn)證RPM包
一旦學(xué)會(huì)使用RPM,很容易安裝好它們就不管了,并且忘記了安全性問題。破解者可能會(huì)在網(wǎng)絡(luò)上發(fā)布的RPM中植入病毒或木馬。rpm命令包括了檢查RPM完整性的方法,它同樣使用的是GPG。它也可以驗(yàn)證程序包,甚至驗(yàn)證一個(gè)文件的內(nèi)容。
該系統(tǒng)的關(guān)鍵是Fedora Core GPG密鑰。它們應(yīng)默認(rèn)安裝為/etc/gpg/rpm-gpg/RPM-GPG-KEY.*。接著,導(dǎo)入GPG公共密鑰。例如,如果從安裝CD或DVD導(dǎo)入,應(yīng)該用下面的命令導(dǎo)入/var/lib/rpm /Pubkeys文件:
# rpm --import /media/disk/RPM-GPG-KEY
(1)驗(yàn)證程序包
現(xiàn)在可以驗(yàn)證RPM程序包是否有真正的Fedora Core簽名。例如,在重新編譯前想驗(yàn)證內(nèi)核源RPM的完整性。要在本地目錄驗(yàn)證kernel .src RPM的下載版本,可執(zhí)行下面的命令:
# 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
該命令對(duì)照聲明的加密方案(包括GPG)來驗(yàn)證內(nèi)核源RPM的完整性。
(2)驗(yàn)證文件
對(duì)照原始配置檢查文件是很有用的。例如,想了解計(jì)算機(jī)上的一個(gè)文件是否被破解者修改,需要對(duì)比原始配置檢查文件的一系列標(biāo)準(zhǔn)屬性。與通過RPM程序包安裝的每個(gè)文件相關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)在/var/lib/rpm目錄下的RPM數(shù)據(jù)庫中。
如果懷疑某個(gè)命令運(yùn)行不正常,可以對(duì)照此RPM數(shù)據(jù)庫檢查該命令。以mount命令為例。用下面的命令能檢查mount的完整性:
# rpm -Vf /bin/mount
如果看不到任何輸出,該命令還和原來安裝時(shí)一樣。
如果有人篡改了mount命令,會(huì)生成下面的輸出:
# rpm -Vf /bin/mount
S.5 T /bin/mount
該命令將檢查/bin/mount的9個(gè)屬性。如果見到表1中的一個(gè)字母,說明文件在某一方面不同于原始文件。上面的例子說明文件大小、MD5校驗(yàn)和以及文件修改時(shí)間有變化。
表1 驗(yàn)證文件的錯(cuò)誤輸出
![]() |
圖19 |
在某些情況下,測(cè)試失敗不是問題。比如,如果修改了/etc/inittab文件,就會(huì)看到一個(gè)像是驗(yàn)證失敗的結(jié)果:
# rpm -Vf /etc/inittab
S.5 T c /etc/inittab
但這個(gè)失敗也許不表示存在問題。例如,我是在修改了此配置文件中的initdefault變量后得到這個(gè)結(jié)果的。也就是說,文件大?。⊿)和校驗(yàn)和(5)發(fā)生變化是因?yàn)樾薷牧宋募膬?nèi)容,文件修改時(shí)間(T)自然也不同于在計(jì)算機(jī)上安裝Fedora Core的時(shí)間。
4 GnuPG使用技巧
在使用GnuPG的過程中,需要注意如下幾個(gè)問題:
需要根據(jù)實(shí)際的應(yīng)用來確定生成密鑰的算法、密鑰的長度以及密鑰的有效期限;
需要用戶通過交互移動(dòng)鼠標(biāo)、鍵盤來保證生成的密鑰對(duì)的隨機(jī)性;否則,極有可能被黑客破解;
公鑰的安全性問題是GnuPG安全的核心,一個(gè)成熟的加密體系必然要有一個(gè)成熟的密鑰管理機(jī)制配套。公鑰體制的提出就是為了解決傳統(tǒng)加密體系的密鑰分配難保密的缺點(diǎn)。比如網(wǎng)絡(luò)黑客們常用的手段之一就是“監(jiān)聽”,如果密鑰是通過網(wǎng)絡(luò)傳送就太危險(xiǎn)了。對(duì)GnuPG來說公鑰本來就要公開,就沒有防監(jiān)聽的問題。但公鑰的發(fā)布中仍然存在安全性問題,例如公鑰的被篡改,這可能是公鑰密碼體系中最大的漏洞,因?yàn)榇蠖鄶?shù)新手不能很快發(fā)現(xiàn)這一點(diǎn)。你必須確信你拿到的公鑰屬于它看上去屬于的那個(gè)人。
私鑰的保密也是決定性的。相對(duì)公匙而言,私鑰不存在被篡改的問題,但存在泄露的問題。GnuPG的辦法是讓用戶為隨機(jī)生成的RSA私鑰指定一個(gè)口令。只有通過給出口令才能將私鑰釋放出來使用,用口令加密私鑰的方法保密程度和GnuPG本身是一樣的。所以私鑰的安全性問題實(shí)際上首先是對(duì)用戶口令的保密。當(dāng)然私鑰文件本身失密也很危險(xiǎn),因?yàn)槠谱g者所需要的只是用窮舉法試探出你的口令了,雖說很困難但畢竟是損失了一層安全性。在這里只用簡單地記住一點(diǎn),要像任何隱私一樣保藏你的私鑰,不要讓任何人有機(jī)會(huì)接觸到它。
在實(shí)際的使用過程中,用戶可以將GnuPG軟件靈活地運(yùn)用到網(wǎng)絡(luò)數(shù)據(jù)傳輸,包括電子郵件發(fā)送,F(xiàn)TP文件傳送等各個(gè)應(yīng)用領(lǐng)域。
【51CTO.COM 獨(dú)家特稿,轉(zhuǎn)載請(qǐng)注明出處及作者!】
【編輯推薦】