[捍衛隱私] PGP 如何運作?

以下的文字摘錄自 PGP 6.5.1 文件集的密碼法導論第一章。 Network Associates, Inc. 及其附屬公司版權所有, 1990-1999 。保留一切權利。本文件是利用 http://access.adobe.com/ 將 PDF 檔轉換為 HTML 格式,再以手動編輯排版所得。

密碼法基礎

當凱撒大帝要傳送信息給他的將軍時,他並不信任他的信差。所以他把信息中每一個字母 A 通通換成了字母 D 、每一個字母 B 都換成字母 E ,所有的字母都如此類推。只有知道這個「上移三」規則的人,才能夠看懂他的信息。
然後讓我們開始吧。

加密和解密

不需要任何特殊方法就能夠被讀取以及瞭解的資料,稱之為純文字明文。把純文字利用某種方法隱藏起來則稱為加密。純文字加密後的結果,會變成一堆無法讀取的亂碼,稱為密文。你使用加密以確定即使是能夠看到加密過資料的人,只要不是訊息真正的接收者,就無法取得隱藏在其後的資訊。把密文轉換回原來純文字的過程稱做解密圖 1-1 描繪了這樣的過程。


圖 1-1 。加密和解密

甚麼是密碼學?

密碼法是利用數學方法來對資料加密和解密的科學。密碼法讓你能夠儲存資訊,或透過並不安全的網路(例如網際網路)來傳遞訊息,而任何不該看到這個資訊的人都將無法讀取它。

相對於密碼法是保密資料的科學,密碼分析則是分析和破壞保密通訊的科學。古典密碼分析需要對分析推理、數學工具使用、板模尋找等興趣的結合,還需要耐心、決心、以及運氣。密碼分析家也被稱做攻擊客

密碼術則同時囊括了密碼法和密碼分析。

強密碼法

「世界上有兩種密碼法:讓你妹妹不再能讀取你的檔案的密碼法,以及阻止政府讀取你的檔案的密碼法。而本書所要討論的是後者。」 — Bruce Schneier, 應用密碼法:協定、公式、和 C 原始碼。

PGP 也是屬於後者的密碼法。密碼法又有的區分,詳述於後。密碼法的強度端看將其還原回純文字訊息所會耗去的時間和資源而定。強密碼法所產生的密文若沒有適當的解碼工具來處理,將會非常難破解。有多難呢?即便集合當今世界上所有的電腦全天執行,即使每一台電腦每秒鐘都能嘗試數十億組密碼,這個強密碼法就算到了世界末日仍然不可能被破解。

於是有人可能會認為強密碼法可以有效對抗極端堅毅的密碼分析家。誰能真的這麼說呢?沒有人能夠證明今天還可維護的強密碼法到了明天會不會因為電腦威力的突飛猛進而掛掉。至少現在由 PGP 所使用的強密碼法仍是最好的。無論如何,保持警覺和保守的態度總比費解的權利還要能夠保護你。

密碼法如何運作?

一個密碼演算法,或稱為密碼本,是一個用來處理加密和解密的數學函式。一個密碼演算法必須和一副金鑰 — 一個文字、數字、或詞組 — 一起將純文字加密。同樣的純文字一旦使用了不同的金鑰,就會加密成不一樣的密文。加密過資料的安全完全依賴兩件事:密碼演算法的強度和金鑰的保密。

一套密碼演算法,加上所有可能的金鑰以及所有可以讓他們工作無間的協定,這就構成了一個密碼系統。 PGP 就是一個密碼系統。

傳統密碼法

傳統密碼法又稱為密鑰加密法對稱式金鑰加密法;在這種密碼法當中,用來加密和解密的是同一把金鑰。資料加密標準法 (Data Encryption Standard, DES) 就是一種被聯邦政府廣泛使用的傳統密碼系統。圖 1-2 描繪了傳統加密程序。


圖 1-2 。傳統加密法

凱撒的密碼本

一個傳統密碼法的簡單例子是取代法密碼本。也就是透過取代法密碼本把一部份的資訊取代成另一些。這種方法常常透過把字母系統偏移數個字母以施行。兩個很好的例子分別是:午夜隊長的秘密解碼戒指(搞不好你小時候也有一個)和凱撒大帝的密碼本。在這兩個例子裡,密碼演算法就是「字母偏移」,而金鑰則是「字母偏移的距離」。

舉例來說,如果我們要把「SECRET」這個字用凱撒的方法來加密,而金鑰的數值是 3 的話,我們要先把字母系統往後偏移到第三個字母 (D) 作為字母系統的開始。

也就是說原先的字母系統應該是

ABCDEFGHIJKLMNOPQRSTUVWXYZ
在把每個字母都挪動 3 個位置後,你會得到
DEFGHIJKLMNOPQRSTUVWXYZABC

也就是 D = A 、 E = B 、 F = C ,依此類推。

利用這個結構,原先的純文字「SECRET」就會被加密成「VHFUHW」。要讓別人能夠解讀密文,你需要告訴他們所用的金鑰數值是 3 。

顯然這個密碼法對於今天的標準來說太過薄弱了;嘿!但是它對凱撒可是有用的很,而且它也描繪了傳統密碼法的運作。

金鑰管理和傳統加密

傳統加密有個好處:它非常的快。尤其是對於把那些不會流傳到其他地方的資料加密來說更是如此。然後,拿傳統加密來作為傳遞保密資料將會相當的昂貴,因為要保密地傳遞金鑰太過困難了。

回想一下你最喜愛的諜報片角色:用手銬把自己手腕銬在公事包的傢伙。公事包裡頭是甚麼呢?它可能不是飛彈發射的密碼、生化毒氣的分子式、或入侵計畫本身。而是能夠把保密資料解密的金鑰

對於使用傳統加密進行保密溝通的遞送者和收件者來說,他們必須事先對金鑰取得共識,並且在它們之間保密。如果他們身處不同的地理位置,那更必須信任他們的信差、蝙蝠電話、或任何保密溝通媒介以避免在傳輸過程當中秘密金鑰被公開。從 DES 以至於午夜隊長的秘密解碼戒指,傳統加密法未曾改變的問題都是金鑰傳遞:你如何把金鑰遞送給收件者而避免被某人擷取?

公開金鑰密碼法

金鑰傳遞的問題被公開金鑰密碼法給解決了。這個概念最早由 Whitfield Diffie 和 Martin Hellman 在 1975 年所提出。(現在已經被證明英國秘密勤務比 Diffie 和 Hellman 還要早幾年發明了這種方法,但一直把它是當成軍事機密—啥也不做。 [ J H Ellis :非密數位加密的保密可能性, CESG Report , 1970 年一月 ] )

公開金鑰密碼法是一種非對稱性的結構,它使用了一金鑰來進行加密:一把用來加密資料的公鑰,以及相對應用來解密的私鑰、或也稱作密鑰。你把你的公鑰發表到世界各處,同時保密你的私鑰。任何取得你的公鑰複製的人都可以加密出只有你才能閱讀的資訊。即使你從未遇到那個人也一樣。

在運算上要從公鑰追溯出私鑰是不可能的。任何持有公鑰的人都可以加密資訊,但是無法進行解密。只有擁有相對應私鑰的人才能夠將訊息解密。


圖 1-3. 公開金鑰加密

公開金鑰加密法最主要的優點是它允許沒有事先安排保密管道人們仍然可以保密地交換訊息。遞送者和收件者需要透過保密管道共享秘密金鑰的需求消失了;所有的通訊只會涉及公鑰,而不會有任何私鑰被傳遞或共享。公開金鑰密碼系統的例子如 Elgamal (以它的發明者 Taher Elgamal 的名字所命名)、 RSA (以它的發明者 Ron Rivest 、 Adi Shamir 、 Leonard Adleman 的名字所命名)、 Diffie-Hellman (沒錯,你猜到了,仍然是以它的發明者的名字所命名)、還有 DSA ,也就是數位簽章演算法(由 David Kravitz 所發明)。

因為傳統密碼法一度是唯一可行的遞送秘密訊息的方法,因此秘密管道和金鑰傳遞的昂貴花費限制了只有能夠負擔的人才能夠使用這種密碼法;例如政府和大銀行(或者持有秘密解碼戒指的小孩)。公開金鑰密碼法可以說是一項技術上的革命,提供了普羅大眾一個強密碼法。還記得那個把公事包銬在手腕的人嗎?公鑰加密讓他丟了飯碗啦!(搞不好其實對他來說是種解脫)

PGP 如何運作

PGP 結合了傳統密碼法和公開金鑰密碼法的多種最棒的特色。 PGP 是一種混合密碼系統。當使用者使用 PGP 來對純文字加密的時候, PGP 首先會壓縮這段純文字。資料壓縮能夠節省數據機傳輸時間以及磁碟空間,還有更重要的、強化密碼法的保密程度。大部分的密碼分析技術利用純文字理發現的板模來破解密碼本。壓縮可以減少純文字裡的板模,相對來說也就提高了對密碼分析的抵抗力。(若是檔案長度太短以致於無法壓縮或是沒辦法良好壓縮的檔案就不會被壓縮。)

然後 PGP 會產生一個階段金鑰,這把階段金鑰是一種只有當時有效的秘密金鑰,是利用任意的滑鼠移動以及鍵盤輸入所產生的亂數。它以非常秘密而快速的傳統加密演算法來加密純文字,而產生出密文。當資料加密完成後,這把階段金鑰接著就會開始以收信者的公鑰被加密。這個被公鑰加密過的階段金鑰將會與密文一併交付給收信者。


圖 1-4 。 PGP 如何加密

解密的過程就是反向運作了。收信者的 PGP 會利用他的私鑰來還原那把暫時的階段金鑰,然後 PGP 再利用這把階段金鑰來將傳統加密過的密文解密。


如 1-5 。 PGP 如何解密

兩種加密方法的結合匯聚了公開金鑰加密法的便利以及傳統加密法的迅速。傳統加密法大約比公鑰加密法要快上 1,000 倍;而公鑰加密法則解決了金鑰傳遞和資料傳輸的課題。雙管齊下,效率和金鑰傳遞兩者同時改善了,而且不會有任何安全上的犧牲。

金鑰

一把金鑰是用來和密碼演算法產生特定密文的數值。本質上,金鑰是一個非常、非常、非常大的數字。金鑰的大小可以用位元組來計算;顯示為 1024 位元組大小的金鑰已經是天殺的大了。對公開金鑰密碼法來說,金鑰越大,密文就越保密。

然而,公鑰大小和傳統密碼法的私鑰大小全然無關。一把 80 位元組的傳統金鑰擁有和 1024 位元組公開金鑰相當的強度;一把 128 位元組大小的傳統金鑰擁有和 3000 位元組大小公開金鑰相當的強度。同樣地,金鑰越大就越保密;但是每一種密碼法的演算法相差甚多,就好像蘋果和橘子一樣有著天壤之別。

雖然公鑰和私鑰在數學上具有相關性,但是單從公鑰要想推知私鑰是非常困難的;雖然只要有足夠的時間和電腦威力,總是有機會解出私鑰。因此挑選正確大小的金鑰就顯得格外重要了:必須夠大才安全、必須夠小才夠快。另外,你也需考慮誰可能會讀取你的檔案、他們多有益力、他們有多少時間、以及他們可能有甚麼資源。

較大的金鑰在密碼法上來說會比較安全,但也會花去較長的運算時間。如果你打算把某個需要藏上幾年的資料加密,你也許會想要用一把非常大的金鑰。當然,誰會知道當明天電腦變得更快更有效率時,測出你的金鑰會花上多久?至少就目前來說, 56 位元組大小的對稱金鑰已經夠安全了。

金鑰會以加密過的形式儲存下來。 PGP 將金鑰儲存在你硬碟上的兩個檔案裡:其中一個用來儲存公鑰,另一個拿來儲存私鑰。這些檔案被稱作金鑰鑰匙圈。當你敻 PGP 時,你需要把收件者的公鑰加進你的公鑰鑰匙圈裡。你的私鑰則儲存在你的私鑰鑰匙圈裡。如果你弄丟了你的私鑰鑰匙圈,你將沒辦法對任何以鑰匙圈裡的金鑰加密過的資訊解密。

數位簽章

公開金鑰密碼法的一個主要好處是它提供了一種數位簽章的方法。數位簽章允許資訊收件者來驗證資訊來源的可信度,同時驗證資訊本身是否完整。也就是說,公鑰數位簽章提供了證明和資料完整性。數位簽章同時提供了不可否認性的證明,也就是說它可以避免資訊遞送者否認自己曾經送出過那樣的訊息。這些密碼法的功能正是隱私權的基礎,不多也不少。

數位簽章的功效就和親筆簽名一樣。然後親筆簽名很容易被偽造,而數位簽章幾乎不可能被偽造,而且還能夠證明文件的內容和剛被簽署的時候保持一致。

有些人傾向於使用簽署更勝於加密。例如說,你並不在乎任何人知道你剛存了 1000 元到你的戶頭裡,但是你很想確定和你打交道的傢伙市銀行的出納員。

創造數位簽章的基本方法描繪於圖 1-6 。數位簽章的作法是拿你的私鑰來進行加密,而非像加密資訊那樣使用別人的公鑰。如果這個資訊能夠被你的公鑰解密,那麼它顯然是出自你手中。


圖 1-6 。簡單的數位簽章

雜湊函式

上述的系統還有些問題。它很慢,而且會產生龐大的資料 — 至少是原始資訊的兩倍量。要改良上述的架構得用到一個單向的雜湊函式來進行處理。單向的雜湊函式取得變異長度的輸入 — 在這個例子當中,任何長度的訊息,甚至是上千或上百萬位元組 — 並且產生一個固定長度的輸出;呃,就說是 160 位元組吧。這個雜湊函式能夠確認原始資訊中如果有任何一絲更動 — 那怕只有一個位元的不同 — 都會產生全然不同的輸出結果。

PGP 對使用者簽署的純文字使用密碼法上的強雜湊函式。這會產生一個固定長度的資料,稱做訊息摘要(當然,任何訊息的改變都會產生出全然不同的摘要。)

然後 PGP 使用這個摘要和私鑰以產生「簽章」。 PGP 把簽章和純文字一起傳遞。當收件者收到訊息後,就利用 PGP 重新計算摘要,然後驗證這個簽章。不論 PGP 有沒有對純文字加密,對純文字簽署都是很有用的。特別當某些收件者並沒有興趣或沒有辦法去驗證簽章的時候。

一旦採用了保密雜湊函式後,就沒有任何方法把某人的簽章從文件中截下、貼到另一份文件上,或改變任何被簽署過的訊息。任何在簽署過的文件上所動的細小手腳,都會導致數位簽章驗證的結果失敗。


圖 1-7 。保密數位簽章

數位簽章在鑑定以及驗證其他 PGP 使用者的金鑰上扮演了相當重要的角色。

數位憑證

在公開金鑰密碼系統當中有一個課題是使用者必須時時保持警戒以確定他們加密的時候所用的金鑰是正確的。透過一個能夠自由且安全地交換金鑰的公開伺服器環境下,中介攻擊其實是一個潛在的威脅。在這類的攻擊中,某人以你預期的收信者的名字和使用者 ID 刊登了一把假造的金鑰。結果資料其實加密給 — 以及被攔截給 — 這把假金鑰的真正主人,於是流入了他人之手。

在一個公開金鑰的環境中,確認你拿來加密資料的公鑰確實是那個收信者所擁有而非偽造的,乃是極其重要的事。你當然可以僅用那些被親手交給你的金鑰來加密。但是假設你需要和從未見過面的人交換資訊,你要怎麼分辨你拿到了正確的金鑰呢?

數位憑證,或稱憑證,使得確認某把公鑰是不是真的屬於某個人變成一項簡單的工作。

憑證其實是一種認證,像是你的駕照、身份證、或出生證明之類的。這些東西上都有一些資訊,用以辨識你、並且經過授權以表示另外有人確認了這是你的身份沒錯。某些憑證像是你的護照,重要到能夠完全確認你的身份,所以你不會想要遺失它們,免得別人拿它來假冒成你。

數位憑證是一筆具有類似實際憑證功能的資料。在數位憑證通常包括在一個人的公鑰當中以助於其他人能夠驗證這把金鑰是真的或有效的。通常數位憑證能夠阻止將某人的金鑰代換成另一個的不良意圖。

一個數位憑證由三件事情組成:

  • 一把公鑰。
  • 憑證資訊。(使用者的「身份」資訊,像是名字、使用者 ID 之類的。)
  • 一個以上的數位簽章。

在憑證的時候,數位簽章的目的是要聲明這份憑證資訊已經被其他人或實體所驗證了。數位簽章並不能對整個憑證驗證其可信度;它只能擔保說,那些簽署的身份資訊確實是跟隨著或附著在那一把公鑰上。

也就是說,一個憑證通常會是一把公鑰附加上一種或兩種形式的 ID ,以及由其他信任的個體所批准的衷心印戳。


圖 1-8 。 PGP 憑證解剖圖

憑證散佈

憑證用於有需要和他人交換公鑰的時候。對於一小群想要保密通訊的人來說,手動交換包含有彼此公鑰的磁片或電子郵件是一件很容易的事。這就是手動公鑰散佈,而且只在某個程度上行得通。除此之外,必須要架設起一套能夠提供足夠的安全、儲存、交換機制的系統,來讓協同工作者、商業伙伴、或陌生人在需要的時候得以溝通。這可以源自僅提供儲存功能的憑證伺服器,或者提供更多額外金鑰管理功能的公鑰基礎建設 (Public Key Infrastructures, PKIs)

憑證伺服器
憑證伺服器也被稱做憑證伺服器金鑰伺服器,是一個允許使用者提交和收回數位憑證的資料庫。憑證伺服器通常會提供一些管理功能讓公司行號能夠維護它們的保密政策 — 例如只允許合規定的金鑰被儲存。

公鑰基礎建設
PKI 包含了憑證伺服器所具備的儲存能力,另外又提供了憑證管理能力(發行、撤銷、儲存、收回、以及信任憑證的能力)。 PKI 的主要特色被稱之為憑證中心(Certification Authority, CA) 是由一個人類實體 — 一個個人、團體、部門、公司、或任何協會 — 認可了並發行它們所有電腦使用者的憑證。( CA 所扮演的角色可以類比成國家政府的護照管理處。) CA 建立憑證並且使用 CA 的私鑰對其進行數位簽署。因為它們的角色是建立憑證,所以 CA 也就成了 PKI 的核心組成。藉由使用 CP 的公鑰,任何人想要驗證憑證授權其實就是在驗證 CA 發行的數位簽署以及憑證內容的完整性(更重要的,是憑證持有者的公鑰和其身份)。

憑證格式

數位憑證基本上是把辨識資訊和公鑰以及由信任的第三者用以證明其授權的簽署打包蒐集起來。它可以有許多不同的格式

PGP 能夠理解兩種不同的憑證格式:

  • PGP 憑證
  • X.509 憑證

PGP 憑證格式
一份 PGP 憑證包括(但不限於)下列的資訊:

  • PGP 版本號碼 — 用以辨識與憑證相關的金鑰是由哪一個版本的 PGP 所製造的。
  • 憑證持有者的公鑰 — 你的金鑰對的公開部分以及這把金鑰所採用的演算法: RSA 、 DH (Diffie-Hellman) 、或 DSA (Digital Signature Algorithm) 。
  • 憑證持有者的資訊 — 由關於使用者的「身份」資訊組成,像是名字、使用者 ID 、照片等。
  • 憑證持有者的數位簽章 — 這也被稱為自簽,也就是拿欲憑證的金鑰對裡的私鑰直接對其公鑰加簽。
  • 憑證有效期限 — 憑證的啟用日期/時間和到期日期/時間;用以指出這個憑證何時會過期。
  • 這把金鑰偏好的非對稱性加密演算法 — 指出這個憑證持有者所偏好的資訊加密演算法。可用的演算法有 CAST 、 IDEA 、或 Triple-DES 。

你可以把 PGP 憑證想成是一把貼上一大堆標籤的公鑰(參見圖 1-9 )。在這些「標籤」上你可以找到足以辨識金鑰持有者的資訊,以及金鑰持有者的簽署,用以聲明這些資訊和金鑰是一併送出的。(這個部分的簽署就稱做自簽;每一份 PGP 憑證都會包含有自簽。)

PGP 憑證格式的一個獨特之處在於一份憑證可以包含有多份簽署。多數人可能會簽署金鑰/身份對以表明他們確認公鑰顯然屬於某個特定的持有者。如果你在公開憑證伺服器上尋找,你會發現許多憑證都有很多簽署;例如 PGP 之父 Phil Zimmermann 的就是。

某些 PGP 憑證包含了擁有多個標籤的公鑰,每一個標籤都包含了不同的金鑰持有身份實體(例如持有者的姓名和公司電子郵件帳號、持有者暱稱和家用電子郵件帳號、持有者的照片 — 通通在同一份憑證裡)。每一個身份的簽署列表可能不同;簽署只能證明公鑰裡某個標籤被授權,並不代表金鑰理所有的標籤也都被授權了。(請注意「有效」是對旁觀者而言的 — 簽署是一種輿論,而不同的人在簽署一把金鑰前的注意程度並不相同。)


圖 1-9 。 PGP 憑證

X.509 憑證格式
X.509 是另一個非常常見的憑證格式。所有的 X.509 憑證完全是由 ITU-T X.509 國際標準而來的;所以(理論上) X.509 憑證可以適用於任何遵從 X.509 的程式。然後,事實上不同的公司創造了他們自己的 X.509 延伸版本憑證所以沒辦法放在一起運作。

一份驗證需要某人來使一把公鑰和金鑰主人的名字一起生效。在 PGP 憑證下,任何人都可以擔任驗證者的角色;而在 X.509 憑證下,驗證者永遠都是憑證中心或由憑證中心指明的人。(請記住 PGP 憑證也同樣完全支援權力體系架構下的 CA 來驗證憑證。)

一份 X.509 憑證是由一組包括了使用者或設備資訊的標準格式範疇和他們相對應的公鑰所組成的。 X.509 標準定義了憑證裡應有的資訊,以及描述了它們如何組成(資料格式)。所有的 X.509 憑證都具備了下列的資料:

  • X.509 版本號碼 — 指出這份憑證運用了那個版本的 X.509 ,這會影響到哪些資訊可以被包含在其中。最新的版本是第 3 版。
  • 憑證持有者的公鑰 — 憑證持有者的公鑰,以及用來指定這把金鑰用了何種密碼系統的演算法鑑定碼,還有任何其他跟這把金鑰相關的參數。
  • 憑證的序號 — 建立憑證的實體(程式或個人)需要提供一個獨一無二的序號來和其所發出的其他憑證區隔開來,以示負責。這項資訊被以多種方法使用;例如當一個憑證被撤銷時,它的序號就會被放進憑證撤銷清單CRL 裡。
  • 憑證持有者獨一無二的鑑定碼 — (或稱 DN — 區別名 distinguished name)。這個名字應該是在網路上獨一無二的。一個 DN 包括了多個子區段,看起來可能像這樣:
    CN=Bob Allen, OU=Total Network Security Division, O=Network
    Associates, Inc., C=US
    (它們提到了主體的一般名字、組織單位、組織、以及國家。)
  • 憑證的有效期限 — 憑證的生效日期/時間以及截止日期/時間,指出這份憑證那個時候會過期。
  • 憑證發行者獨一無二的名字 — 簽署這份憑證實體獨一無二的名字。通常這會是一個 CA 。使用一份憑證暗指著信任簽署這份憑證的實體。(請注意在某些情況下,像是最高頂級的 CA 憑證,其發行者會簽署自己的憑證。)
  • 發行者的數位簽章 — 使用發行這份憑證的實體的私鑰的簽章。
  • 簽章演算法鑑定碼 — 指出 CA 簽署這份憑證時所使用的演算法。

在 X.509 憑證和 PGP 憑證間有許多差異,其中較顯著的列出如下:

  • 你可以建立你自己的 PGP 憑證;但是 X.509 憑證卻只能經過申請的手續,由憑證中心發行
  • X.509 憑證自然地只能接受金鑰持有者使用單一名字
  • X.509 憑證只能接受單一一個數位簽章來證明金鑰的有效性。

要維護一份 X.509 憑證,你必須要求 CA 發行給你一份憑證。你得提供你的公鑰,證明你持有相對應的私鑰,以及某些關於你的特定資訊。然後你得數位加簽資訊並把所有的東西 — 需求 — 寄出去給 CA 。然後 CA 執行某些該做的事以驗證你提供的資訊是否都是正確的,如果是的話,它們才會產生新的憑證並且寄回給你。

你可以把 X.509 憑證想程式標準的書面憑證(很像你可能會有的基礎急救訓練證書)附加上一把公鑰。上面有你的名字和一些關於你的資訊,然後加上這份憑證發行者的簽署。


圖 1-10 。一份 X.509 憑證

也許現今最常見到的 X.509 憑證運用是在網頁瀏覽器上。

驗證和信任

每一個在公鑰系統中的使用者都難以防止由偽造的金鑰(憑證)所導致的錯誤。驗證以確認某個公鑰憑證確實屬於它該屬於的主人。驗證在公鑰環境當中相當地必要,尤其在你需要常常注意是否有一部份的憑證是可信的時候。

當你確認某個屬於別人的簽署是有效的,你可以在你的金鑰鑰匙圈的複製當中給予加簽,表住你已經檢查過憑證而且確認那份憑證是有效的了。如果你想讓其他人知道你給予這份憑證加簽了你的認可印戳,你可以把這份簽署輸出到某個憑證伺服器而讓別人看見。

如同在公鑰基礎建設段落所描述的,有些公司設計了一個以上的憑證中心 (CAs) 來直接驗證憑證。對一個使用 PKI 和 X.509 憑證的組織來說, CA 的工作就是要發行憑證給使用者 — 通常承擔來自使用者提出憑證要求的回應程序。但對於使用 PGP 憑證而不使用 PKI 的組織來說, CA 僅需檢查所有 PGP 憑證的可信度,並且擇優簽署即可。基本上 CA 的主要目的是要把公鑰和識別資訊打包在一起放到憑證中,以確定第三者可以確認這些被打包的識別資訊和金鑰是可信賴的。

CA 可以說是一個組織裡負責驗證的達官顯要;組織裡任何一個即使大家都相信的人,就像在使用 PKI 一樣,如果沒有被可信的 CA 簽署的話,其憑證就不會有效。

驗證檢驗

一個建立驗證的方法是透過一些手動程序。有許多方法可以達到這個目的。你可以要求你預期的收信者親自交給你他的公鑰副本。但是這通常既不方便也沒效率。

另一個方法是手動核對憑證的指紋。就好比每個人都有獨一無二的指紋,每一個 PGP 憑證也有它獨一無二的指紋。這個指紋其實是使用者憑證的雜湊摘要,會成為憑證中的一項屬性。在 PGP 中,這個指紋會以十六進位的數值或一系列所謂的生統字符,使得他們在語音上保持很大的差異,如此一來要進行核對的手續時就會簡單些。

想要檢驗憑證是否可信,你可以打電話給金鑰主人(也就是你主動開始)並請他讀出他的金鑰指紋給你聽,然後你可以藉此判斷。這項任務只有在你確知金鑰主人的聲音時才有意義;但是你要如何檢驗你不認識的人的身份?有些人因此把他們的金鑰指紋印在名片上。

另一個建立驗證某人的憑證的方法是去信任第三者所做的驗證。

例如說有個 CA 回應了確認曾經發行了一份憑證,他小心地檢查過那把公鑰確實屬於它應該屬於的人。任何人信任 CA 的話,也會自動認定由這個 CA 所簽署的憑證是有效的。

另一個驗證檢驗的觀點是去確認該憑證沒有被撤銷。請閱讀 憑證撤銷的段落以取得更多資訊。

建立信任

你驗證了一份憑證。你信任了一個。更精確的來說,你藉由驗證別人的憑證來信任他。一般說來,除非憑證主人自己把憑證交給你,否則你總是得從別人那兒確認它是可信的。

超級引薦人和受信任引薦人
在大多數的情況下,人們完全信任 CA 所建立的憑證是可信的。這表示任何其他人依賴 CA 來進行完全手動驗證程序。這對相當數量的使用者或同一個工作區域中的成員來說是很好的,但 CA 並不可能保持相同等級的驗證品質。在這種情況下,在系統中增設其他的驗證者就很必須了。

一個 CA 同時也可以是一個超級引薦者。一個超級引薦者不只使用金鑰的可信度,同時也使用對其他人信任金鑰的能力。就像是國王將玉璽交給他所信任的大使,所以大使得以授權行動;超級引薦者能夠讓其他人具有受信任引薦者的位階。這些受信任引薦者能像超級引薦者一樣地驗證金鑰。然而,他們並不能提拔出新的受信任引薦者。

超級引薦者和受信任引薦者都是 PGP 術語。在 X.509 環境當中,超級引薦者被稱為最高憑證中心 (root CA)而受信任引薦者隸屬於其下,稱為憑證中心。

最高 CA 使用與稱之為最高 CA 憑證的特殊憑證類別相關的私鑰來簽署憑證。任何被最高 CA 簽署的憑證都會被視為和被其他由最高 CA 簽署過憑證再來簽署的憑證一樣具有效力。這個憑證程序即便是系統中其他 CA 簽署的,也一樣能夠運作 — 只要次級 CA 的憑證是經由最高 CA 所簽署的,任何在這個階級關係中的憑證簽署都會具有相同的效力。這個在系統中回溯檢查前一個簽署者的程序稱之為憑證路徑憑證鍊

信任模式

在相對封閉的系統當中,例如在小公司裡,很容易就能夠回溯簽署路徑回最高 CA 。然後,使用者必須經常和公司環境外的人溝通,包括他們從未見面的人,像是零售商、顧客、客戶、協同者之類的。要對一個從未明確被你的 CA 所信任的信任管道很困難。

公司行號採用了另一種信任模式,要求使用者去建立憑證驗證。有三種不同的模式:

  • 直接信任
  • 階級信任
  • 信任網

直接信任
直接信任是最簡單的信任模式。在這個模式中,使用者因為知道一把金鑰從哪裡來而信任它是有效的。所有的密碼系統在某種程度上都使用了這樣的信任形式。例如在網頁瀏覽器上,最高憑證中心金鑰直接被信任,這是因為它們來自製造商。如果還有任何其他的位階,就會從這個直接信任憑證中延伸出去。

在 PGP 中,若使用者不經任何受信任引薦者而兀自信任自己的金鑰,就是使用了直接信任。


圖 1-11 。直接信任

階級信任
在階級系統中,會有許多來自「最高」憑證所延伸出來的信任。這些憑證也許為他們自己擔保、或擔保更低層的憑證。你可比這樣的情形想做是巨大的信任「樹」。「枝葉」憑證的驗證藉由追溯回他們的保證書到另一個保證書,直到直接由最高憑證所信任為止。


圖 1-12 。階級信任

信任網
信任網圍繞著另外兩種模式,但又增加了一個新的觀點:信任是來自旁觀者的眼睛(這也是真實世界的角度),而認為越多資訊越好。他同時也是信任累積模式。一個憑證可能直接地被信任,或者被某個可追溯回直接信任的最高憑證(超級引薦者)所信任,或由其他群的引薦者所信任。

也許你也聽過六級分離這個詞,它的意思是說世界上每個人都可以向別人畫出關聯線;而這樣的關聯線可以精簡到與你直接相關的中介人不超過六個。這就是引薦網。

這也是 PGP 的信任觀點。 PGP 使用數位簽章作為引薦的形式。當任何使用者加簽了別人的金鑰,他就會成為那把金鑰的引薦者。當這樣的程序被持續地進行著,就會形成一張信任網

在 PGP 環境下,任何使用者都可以像被完全授權般地行動。任何 PGP 使用者都可以驗證其他 PGP 使用者的公鑰憑證。然而這樣的憑證只有在第三方也認為驗證者是可信任的引薦者時,才會被信任。(也就是說,你若要信任我所認為有效的金鑰,得先認定我是可被信任的引薦者。不然的話我對於另一把金鑰的驗證對你來說是毫無意義的。)

儲存在每一個使用者的公鑰鑰匙圈裡的東西代表著

  • 使用者認為某把金鑰是否有效
  • 使用者對那把金鑰信任的程度,這關係著金鑰主人能否成為其他金鑰的驗證者

你根據我的金鑰副本指出對我的評斷的計數。這真的是一個名聲系統:有些人們因為被給予簽署而有好的聲望,而人們因而信任他們對其他金鑰的驗證是有效的。

PGP 中的信任等級
對一把金鑰的最高信任等級是絕對的信任,有如信任你自己的金鑰對一樣。 PGP 假設如果你擁有私鑰,你一定完全信任相對應的那把公鑰。任何被你完全信任的金鑰所簽署的金鑰也一樣是有效的。

你可為別人的公鑰設定三種不同的信任等級:

  • 完全信任
  • 信任邊緣
  • 不信任(或未信任)

為了把事情弄得更複雜,有效程度也有三種:

  • 有效
  • 有效邊緣
  • 無效

要將另一把金鑰定做你的受信任引薦者,你得

  1. 從一把有效的金鑰開始,它必須兼備
    • 由你簽署過,或
    • 由其他受信任引薦者所簽署過
    然後
  2. 設定擬任為金鑰主人該有的信任程度

例如說,假設你的金鑰鑰匙圈裡有一把 Alice 的金鑰。你對其驗證過而且加簽以示認可。你知道 Alice 對於驗證別人的金鑰是斤斤計較的。所以你把他的金鑰設為完全信任。這使得 Alice 成為你的憑證中心。如果 Alice 加簽了別人的金鑰,那把金鑰在你的金鑰鑰匙圈裡也會同樣地有效。

PGP 需要一個完全信任的簽署或兩個信任邊緣的簽署才能將一把金鑰視為有效。 PGP 將兩個邊緣視為一個完整的方法很像對零售商要求兩個 ID 格式。你也許會認為 Alice 相當值得信賴,也覺得 Bob 相當值得信賴。他們之中任何一個其實都有簽署到偽造金鑰的機會,所以你也許會不想要對任何一個做完全的信任。然而,兩個人同時簽署同一把偽造金鑰的機率實在是小多了。

憑證撤銷

憑證只有當他們是有效的時候才有用。單純地假設某個憑證會永遠有效是不安全的。在大部分的組織和所有的 PKIs 中,憑證都有其受限的壽命。對於一個易受損的系統來說,有效期限的壓迫不啻為一種妥協方案。

因此憑證會依事先安排好的有效週期被製造:一個生效日期/時間和一個有效日期/時間。這個憑證在這段有效週期(它的壽命)中會是有效的。然而當憑證過期了,它就不再有效,而它所信賴的金鑰—身份配對也不再確定。(這個憑證仍然可以用來再度確認那些由它在有效期限內所加密或簽署的資訊 — 只不過它不應該繼續被信任以及在密碼法事務上被使用。)

還有一個狀況是需要將一份憑證終結的時候;例如當憑證持有者離職或者當那個憑證所對應的私鑰被洩漏之後。這種情況叫做撤銷。已撤銷的憑證遠比過期的憑證還要可疑。過期的憑證只是不能使用而已,可別抱持與已註銷的憑證一樣的擔心。

任何曾經簽署過憑證的人都可以撤回他們憑證上的簽章(他必須用和建立簽章相同的私鑰來做這件事)。撤銷的憑證表示簽署者不再信任這把公鑰及其連帶的身份資料;或者是憑證的公鑰(或相對應的私鑰)已經被洩漏了。一個被撤銷的簽章應該背負著幾乎和被撤銷的憑證一樣多的份量。

在 X.509 憑證中,一份撤銷的簽章,如果該認證上僅有一份由 CA 簽署的簽章,事實上與遭到撤銷的憑證是一樣的。 PGP 憑證提供了額外的功能,於是如果你覺得你的憑證被曝光了,你可以撤銷你的實體憑證(而不是只有其上的簽章)。

只有憑證的持有者(也就是相對應私鑰的持有者)或是被憑證持有者所指派為撤銷者的人才能夠撤銷 PGP 憑證。(指派撤銷者是常有的事,因為通常都是因為遺失了憑證相對應私鑰的密語使得使用者需要撤銷憑證 — 然而沒有辦法使用私鑰就沒有辦法進行撤銷程序。)只有憑證的發行者才能撤銷 X.509 憑證。

傳遞某個憑證已經被撤銷的消息

當某個憑證被撤銷了,讓這個憑證的潛在使用者注意到它不再有效是一件很重要的事。在 PGP 憑證中,最尋常地傳遞某個憑證已經被註銷的方法,就是把這個消息發佈到憑證伺服器上;其他想要和你溝通的使用者就會被警告別再使用那把公鑰了。

在 PKI 環境中,傳遞某個憑證已經被註銷的最常見方法是透過一個稱做憑證撤銷清單CRL 的資料結構;這是由 CA 所出版的。在 CRL 中包含有時間印戳、所有撤銷的認證、系統終未過期的憑證。以註銷的憑證會一直留在清單中直到過期為止,然後就會被移除 — 以避免清單變得太長。

CA 會定期(任何有憑證被撤銷的時候,它也會不定期地做這件事)對使用者發佈 CRL 。理論上,這會避免使用者不知情地使用已經曝光的憑證。但是,仍有可能在 CRLs 發佈週期間,有某一把剛曝光的憑證被誤用了。

甚麼是密語?

大部分的人對於透過密碼來進入受限制的電腦系統應該相當熟悉。密碼是指一個獨一無二的文字串,由使用者輸入作為鑑定碼。

密語其實就是較長版本的密碼,而且在理論上也更安全。通常由多個字所組成的密語,能夠有效地抵抗標準的字典攻擊、也就是嘗試以所有字典當中查得到的字試圖破解你的密碼的攻擊方法。最好的密語最好相當之長且複雜,並且包含混雜有大寫及小寫字母、數字、和標點符號。

PGP 使用密語來在你的機器上加密你的私鑰。你的私鑰在你的硬碟上被以雜湊表的方式而成為密鑰。你可以透過密語來解密及使用你的私鑰。一個密語應該是你不容易忘記而別人卻很難猜得到的。它應當要是某個穩固存在你腦海中的長期記憶,而不是臨時抓出而癌賒。為什麼呢?因為如果你忘記了你的密語,那可不幸運。沒有你的密語,你的私鑰完全絕對地沒有用處,而不能做任何事。還記得本章稍早的引言嗎? PGP 是能夠把政府驅離你的檔案的密碼法。它同樣地也可以把你驅離。當你打算把密語改成你永遠記不住的笑話的最後一行前,先把這件事謹記在心。

金鑰分解

俗話說,超過一個人知道的秘密就不是秘密。分享私鑰對的人就會有這個問題。雖然我們並不推薦如此做,但有時的確還是得分享私鑰對。例如說,團體簽署金鑰就是一把由公司來簽署的金鑰 — 例如 — 法律文件、敏感性的個人資訊、或者那些需要證明其來源的出版品。在這種情況下,公司裡有許多人同時持有一把私鑰確實是有必要的。然而,這也表示任何單獨個體都能完全代表公司行動。

在這種情況下,把金鑰拆解成許多份,而必須要有超過一個或兩個人出示所持金鑰片段才能組合成有用的金鑰的作法,的確是明智的。如果所能湊到的部分不夠多,這把金鑰就會失效。

一個例子是把金鑰分解成三份,而必須要有其中任兩份才能重新組合回原來的金鑰;或把金鑰拆解成兩份,唯有當兩份俱備的時候才能組合回原先的金鑰。如果在重新組合的過程當中能夠使用保密的網路連線,這些金鑰片段的持有人就不需要為了重新組合金鑰而匯聚一堂。

jedi.org: