不安全網絡中的數據安全傳輸利器——GnuPG
原創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 獨家特稿,轉載請注明出處及作者!】
【編輯推薦】