2003
01 02 03 04 05 06 07 08 09 10 11 12
2006
01 02 03 04 05 06 07 08 09 10 11 12
2007
01 02 03 04 05 06 07 08 09 10 11 12
2008
01 02 03 04 05 06 07 08 09 10 11 12
2009
01 02 03 04 05 06 07 08 09 10 11 12
2010
01 02 03 04 05 06 07 08 09 10 11 12
2011
01 02 03 04 05 06 07 08 09 10 11 12
2017
01 02 03 04 05 06 07 08 09 10 11 12
2018
01 02 03 04 05 06 07 08 09 10 11 12
 
Jun
20
2005

關於簽章、公開金鑰系統與安全性

最近看到老地方冰果室的一篇文章,裡面講的功能真的很不賴。但是我奉勸大家:如果你搞不清楚什麼是憑證(Certificate)、數位簽章(Digital Signature)、公開金鑰建設(PKI, Public Key Infrastructure)是什麼的話,最好不要隨便亂用! 為什麼呢?比方說,我們用指紋可以確定一個人的身份。但若某人把你的指紋偷走了,他就可以假冒你做壞事,讓別人堅信不移地認為做壞事的人就是你,而且你幾乎無法辯駁:因為現場都是你的指紋! 所以,這篇文章解釋了一些安全性的概念以及使用 .mac 數位簽章所應該注意的事項。首先,我們必須知道,現在大家用的 TCP/IP 網路是很不安全的,你要把資料傳送到別的地方去,就好像寄明信片一樣,大家都看得到你寫的是什麼東西。因此網路軟體只好自己做加密編碼,如此一來別人雖然看得到你網路上傳送些什麼,但因傳送的是編碼過的資料,別人就算看到也看不懂一堆亂碼,於是這就達到了網路安全的最基本需求:secure channel。

一、多摩君想要在不安全的網路下送信給青蛙兄。

 

 

二、多摩君把信加密。

 

 

三、太空鴨看不懂加密的信件。

 

 

四、青蛙兄收到密文。

 

 

五、青蛙兄解密以後,讀到多摩君的信。

 

更具體點來說,加密就好像將資料上鎖一樣,只有擁有鑰匙的人才能打開,否則其他人只看得到被鎖住的盒子。但是問題來了:你用了一把鎖把資料鎖上,希望對方收到以後可以打開,那你就得把鑰匙想辦法寄給他。但網路並不是安全的,鑰匙一寄到網路上就會被別人偷走,所以我們必須把鑰匙鎖起來。把鑰匙鎖起來又要用另外一把鑰匙,另外一把鑰匙的傳送又要額外的鑰匙…。 以上,加密和解密用同一把 key 的加解密方案,我們稱為 private key encryption scheme 或 symmetric encryption scheme。這種加解密方案的最大問題就是 key 的傳送必須安全,但是既然有辦法安全傳送 key 的話,那把資料一起安全傳送不就好了?幹嘛要加密? 為了解決 private key encryption scheme 的金鑰交換問題, Diffie Hellman 發展出一種巧妙的方法。這牽涉到稱為 Discrete Logarithm 的數學問題。主要概念是:

一、雙方各自產生一對 key ,共有四把 key。

 

 

二、多摩君和青蛙兄各自將其中一把透過網路傳給對方,另外一把自己藏好。

 

 

三、在網路上的太空鴨取得了兩把公開的 key。

 

 

四、現在多摩君和青蛙兄手上有兩把 key ,一把是自己藏的 key ,另外一把是對方公開的 key;而太空鴨手上有兩個人公開的 key。

 

 

五、多摩君和青蛙兄各自把自己藏的 key 和對方公開的 key 加起來,生成一把新的 key 。而他們的 key 有個數學性質:多摩君自己藏的 key + 青蛙兄公開的 key = 青蛙兄藏的 key + 多摩君公開的 key ,所以他們倆現在就有共同的 key 了;而太空鴨手上只有兩把公開的 key ,沒有辦法結合產生和他們一樣的 key。

(更詳細一點點,Diffie Hellman 的方法中,每個人產生兩把 key 是在整數環 Zn 下的數對 (a, g^a),a 自己藏起來, g^a 傳給對方。收到別人傳來的 B 以後,和 a 結合,變成 B^a ,就是共同的 key) 這個概念啟發了公開金鑰加密方案(public key encryption scheme 或 asymmetric encryption scheme)的發展。公開金鑰加密方案加密與解密所用的是不同的 key。你可以把 public key 想像成鎖頭,private key 想像成鑰匙(注意我在本篇用的示意圖全都是具體化的比喻,鎖啦、鑰匙啦。那是為了讓沒學過的人也能夠理解,所以不要問我為什麼 key 明明是鑰匙,我卻把他比喻成鎖頭。因為 key 本身是抽象的,可能只是一個數字或一串字母。我只是按照 key 在加密方案中所扮演的角色賦予它們一個具體的隱喻)。每個人都有一雙成對的鎖和鑰匙,只有自己的鑰匙才能開自己的鎖。大家都把鎖放在網路上公開來,鑰匙藏在自己家裡。今天你要傳東西給別人,就去網路上把他的鎖拿下來,把資料鎖上以後傳給他。由於只有他的鑰匙能開他的鎖,所以別人沒法開。

一、青蛙兄要送包裹給多摩君,大家的鎖頭都是公開在網路上的。

 

 

二、青蛙兄把多摩君的鎖從網路上抓下來,把包裹鎖起來。

 

 

三、透過網路傳送給多摩君。太空鴨雖然拿得到每個人的鎖,但大家的鑰匙都是藏起來的,所以太空鴨解不開。

 

 

四、多摩君收到以後,用自己藏的鑰匙把自己的鎖解開。

 

 

五、多摩君取得包裹。

 

既然有了 Diffie Hellman 的私鑰交換方法,我們就可以用私密金鑰加密方案達成 secure channel ,為何還需要公開金鑰加密方案?我們前面有提過,secure channel 只是網路安全的基本需求,而公開金鑰加密方案可以和其他的安全方案(訊息認證方案、簽章方案等)結合,提供多面向的安全性。或者說,我們現在用的公開金鑰加密方案有一些好的性質,可以「順便」用來做別的安全方案。(目前網路上還有很多協定連 secure channel 這基本要求都沒有達成!例如 http、ftp、telnet BBS、msn、smtp、pop3 等。為了補足 secure channel 的要求,才有一些我們常看到的「變形」: https、sftp、ftp over ssl、ssh、… 等) 在現代的密碼學中,除了傳統密碼學研究的加密方案以外,還加入了簽章方案(Signature Scheme)與訊息認證方案(Message Authentication Scheme)。這些方案要解決的問題就是數位資訊的竄改非常容易。我們在文件(例如 email)上附一個簽章,就等於替這份文件掛保證說,這的確是本人寫的。並且,簽名是無法偽造的!別人可以把你的文件連同簽名一起拷貝,但是他沒有辦法捏造文件後在捏造的文件簽上你的名字。所以只要看到有帶簽名的文件,你就可以去確認這個簽名筆跡對不對,如果對的話,那文件就沒有被偽造。 大家也許還不知道簽章的重要性,我舉個發生在我家人身上的實例。我姊姊在 Yahoo 上拍賣東西,就有詐騙集團在我姐結標以後,偽造我姐的 email (偽造 email 地址非常簡單,毫無技術可言),寫信給其他沒標到的用戶說:「哈嘍~我是○○○啦。那個第一名標到的人說他不想買了,我便宜賣給你唷!你只要把錢匯到 xxxxxxxxxx (人頭帳戶)就可以了!我最近手機不方便接聽,這個信箱也爆掉了(怕買家真的連絡到我姐就漏餡了),要連絡我請寄到 xxxx@xxxx.xxx.xx(詐騙集團的 email)」。就這樣,很多人上當匯錢過去了。你真的能確定寄來的 email 就是那個人寫的嗎?這時簽章就發揮作用了。 更詳細點說,安全的簽章方案(Signature Scheme)必須達到下列三點要求:

  • 每個人都可以迅速地為任何他想要的文件產生簽名
  • 每個人都可以迅速地確定任何一個簽名,是不是某個簽名者對於某個特定文件所產生的
  • 沒有辦法(在合理時間內)幫其他人為他們沒有簽過的文件產生簽名

而安全的訊息認證方案(Message Authentication Scheme)要達到下列三點要求:

  • 組織內的人都可以迅速地為任何他想要的文件產生認證
  • 組織內的人都可以迅速地確定任何一個認證,是不是屬於特定文件
  • 外人沒有辦法(在合理時間內)幫組織內的人為他們沒有認證過的文件產生認證

其實簽章方案和訊息認證方案是一樣的事情,只是簽章方案的 signing key 和 verification key 是不同把,訊息認證方案的 signing key 和 verification key 是同一把。這相對於 public/private key encryption scheme,我們也把他們稱為 public/private signature scheme。 以下多摩君和青蛙兄又要現身說法,解釋實際應用上 Signature Scheme 的運作概念:

一、多摩君要送公告給大家。因為是公告,所以不用加密,越多人看到越好。在簽章方案中,大家把鎖(private key)藏起來,鑰匙(public key)放到網路上公開。

 

 

二、多摩君把訊息複製一份,並且用自己的鎖(private key)鎖好,這部份就是簽章,透過網路傳給青蛙兄。這時太空鴨又想惡作劇了…

 

 

三a、狀況一,太空鴨把公告修改了,簽章沒有動。

 

 

四a、青蛙兄收到公告以後,用多摩君的鑰匙(public key)解開簽章。

 

 

五a、青蛙兄發現和公告不一樣!肯定是有人偷改過了~

 

 

三b、狀況二,這次太空鴨變聰明了,懂得把簽章一起改掉。太空鴨雖然可以用多摩君公開在網路上的鑰匙「解開」簽章,但是和現實生活不一樣,他沒有辦法藉著這種行為拿到多摩君的鎖頭。因此,他只好隨便掛個鎖頭上去。

 

 

四b、青蛙兄收到公告以後,用多摩君的鑰匙(public key)解開簽章。

五b、青蛙兄發現簽章解不開!肯定是有人偷改過了~

以上是大略的簽章概念。你可以發現,在初始設置上,他和公開金鑰加密方案是差不多的!同樣每個人都藏一把 private key ,並且公開一把 public key 在網路上。只是在公開金鑰加密方案中,public key 扮演鎖的角色;而在簽章方案中,是由 private key 扮演鎖的角色。又,我曾提到,在這篇文章中,鎖與鑰匙只是一種具體化的比喻,實際上 public key 和 private key 只是抽象的一串字母、一個數字。因此,如果我們的 public/private key 具有鎖和互相解鎖的功能(以及一些安全上的性質),就可以讓一組金鑰,同時在兩種系統下應用:你可以用自己的 private key 去簽文件,並且用對方的 public key 把文件和簽章一起加密。那到底有沒有這種系統存在呢?有!我們現在用得最廣的 RSA 以及大部份其他公開金鑰系統的 key 都符合這些性質。(實際上 RSA 光這樣做是不符合以上安全性的定義的!還要經過一道把明文 hash 後再鎖上的過程。不過那牽涉到 RSA 實際上運作的細節,也很難用鑰匙和鎖的隱喻來說明,為了避免混淆就不繼續說明下去。有興趣者可以留言討論)

(補充一些進階題,這段可跳過:其實 RSA 在理論上並不安全。我所謂的理論,是指以計算複雜度為根基的密碼學,computational complexity based cryptography,為標準的安全。另外一種以二次互反的隨機加密方案在這種標準下可能會比 RSA 安全。但是也不必緊張,計算複雜度這個課題所談論的東西都很虛幻,也非常嚴格。他常常假設一些不知道是否真的存在的條件,來導出安全性。也就是說有點像這樣:我不知道你的敵人有沒有能力摧毀太陽系,所以你要在敵人的攻擊下安全存活,就必須比太陽系還要堅固。在現實生活中,RSA 是一個被廣泛利用的加密方案) 當你有了 secure channel(傳輸過程不會被竊聽) ,並且有了 signature (文章內容不會被竄改)的時候,還未必安全。

重點是,你怎麼知道「對方」真的是你以為的那個人?要是我申請一個網址 http://www.paypa1.com ,並且也造了一對 key ,而你以為我就是 www.paypal.com ,輸入了你的信用卡號碼。於是你的信用卡資料透過 secure channel 很「安全地」到了我手上,我也藉著 signature 確信這就是你的信用卡號碼。是啊,資料傳輸很安全,也不會被竄改,但是到了不對的人手上就是不安全,一切又搞砸了。 於是,如何確定身份(Identity)是網路安全中相當重要的話題。一些 hackers 甚至堅持舉行「面對面交換 public key」聚會。他們認為,只有在現實生活中確認了對方的身份後,拿到的 public key 才算安全。當然能這樣子做是最好,可是你要飛去地球的另一端交換 public key 實在有點不切實際。

憑證(Certificate)就是用來確定某個 public key 是屬於哪個人的。憑證上記載了 email (identity)、public key 和其他相關資訊,然後讓別人來簽章做為第三方保證人。因為簽章具有不可偽造性,所以當我看見一張憑證上有人簽過章,就可以相信,的確是簽章的那個人替這張憑證的可信度掛保證。問題是,你怎麼知道簽章的那個人是不是胡亂掛保證的?所以檢驗一張憑證的可信度,可以靠一種稱為「Web of Trust」的機制:在這種機制下,信度是會傳播的。簡單來說,你信任的人幫別的憑證簽章,那這張憑證的信度就會提高﹔憑證擁有人的信度一旦提高,他簽過的憑證的信度也會增加。 Web of Trust 提供了一種憑證信度的檢驗方法,但我們仍然需要找到足夠多的信任者!這對使用者來說是有點麻煩的一件事。如果有一個大家都能信任的公正第三者來做這件事呢?這個大家都信任的第三者就叫做憑證中心(Certificate Authority, CA)。如果你信任 CA 的話,那麼你就可以信任 CA 所簽過的 certificates 。你也可以想辦法證明你的身分,讓 CA 去簽你的憑證,這樣就可以讓其他信任 CA 的人也同樣信任你的憑證。你要是不相信 CA 也可以,就見面交換 public key 來確認身分吧!誰能確保 CA 的管理者中沒有故意要整你的冤家呢?當然 CA 的管理必須是非常嚴格的,可能要 M 個人裡面有 N 個人在場才能做某些更動等,種種政策想辦法讓大家相信他們是公正、安全的。即使如此,還是不能停止陰謀論者的猜疑。

以上一整套相關的安全性軟硬體配套措施稱為公開金鑰建設(Public Key Infrastructure)。要建設 PKI 是非常麻煩的一件事情,使用起來也不容易。例如國內最近推廣的「自然人憑證」,家裡的長輩根本不知道要怎麼用,氣急敗壞地說以前只要怎樣怎樣,現在好麻煩。殊不知安全的代價有多大!為什麼會這麼麻煩?因為安全性是一種要做就全做,做一半等於沒做的事情。今天只要一個環節有漏洞,其他地方所做的努力都是白費力氣!假設以上提到的什麼加密啦、簽章啦、憑證啦… 我都有做,但是今天只要我用來產生 key pairs 的軟體是個木馬程式,偷偷把你的 private key 寄到網路上不知道哪台伺服器,甚至公開給大家知道,以上的一切安全措施就全完了。

下一篇文章我想探討 .Mac 所提供的安全性以及弱點,希望大家在使用的時候不要因為一個小環節疏失就把全部的安全性給搞砸。有漏洞的安全措施比沒有安全措施還來得糟糕!沒有安全措施的話,至少你會比較小心。

 

Annotations RSS

“好文一篇!我之前總是會把public key和private key的涵義給搞混,你用鎖和鑰匙的這個比喻讓我一看就了解secure channel和電子簽章有啥不同處(至少未來忘記了,也很好推理),實在是太感謝了…orz”

---zishen. 12/21, 2005

“歡迎揪錯或補充~

我再看了一遍,覺得 certificate 那邊寫得可能會讓人誤解。我想要強調的是,certificate 做的是,確保「你抓到的 public key 真的屬於某個 email 位址」,不是其他人發的煙霧彈。情況是這樣:

多摩君要寄祕密信給青蛙兄,他要去抓青蛙兄的 public key 來加密﹔如果太空鴨把自己的 public key 給多摩君,謊稱「這個就是青蛙兄的 public key 啦!你用這個加密就對了!」,於是傳到網路上的祕密信用就是用太空鴨的 public key 加密過的,太空鴨就可以輕鬆解密了,青蛙兄收到以後反而解不開。

本文裡面設計的 scenario 並不是非常好…

天,我真是囉唆老頭子。這系列文章要是沒有超過十個人 cite ,某狗是不是就要送我一隻 skype phone 謝罪?”

---yllan. 12/21, 2005

“這幾天加班加到天亮,已經不知何年何月,到現在才看到這篇大作,沒想到還有下集!

看在有下集的份上,留言超過十個也送你 skype phone 啦~”

---digdog. 12/23, 2005

“這樣的精簡的說明,應該能讓許多人有概念吧!
個人認為是不是在敘述上能更段落“極簡“?因為我某女同事還是“ㄧ臉霧水“∼比ㄧ頭霧水好一些!
呵呵!加油!是我要求過多吧!
祝 “碼安!“呵呵!”

---Marc. 12/23, 2005

“我倒希望 yllan 能夠多鋪陳一些說。其實大部分人要的是白話而不是極簡…”

---孟叡. 12/23, 2005

“敝人覺得您寫得很好,可以拿來當成上課的教材嗎?
敝人會直接連到您的網站上來作說明。”

---Bob. 12/23, 2005

“Marc:
謝謝你的建議~只是尺度在哪真的很難拿捏,我大概也沒有力氣重新校訂…
Feynman 好像說過:如果沒有辦法把一個概念解釋給普通人聽懂,就代表你對這個概念還不夠了解。我想我還不夠通透吧!
p.s. 結果是 Hilbert 講的。陳文進老師唬人嘛…

孟叡:
也對,這篇文章定位的觀眾也不是那些不需要白話的人,否則我只要列式子就好了。不過,再多鋪陳的話… 囧 (累死人了)

Bob:
誠惶誠恐,希望不要誤人子弟才好。敢問 Bob 在哪個單位工作?要用很歡迎,希望您能夠提供教學上遇到的問題與建議,幫忙讓這篇文章更嚴謹、通俗。”

---yllan. 12/25, 2005

“寫的不賴 🙂”

---Jason. 1/5, 2006

“以前唸密碼學如果也有多摩君跟青蛙兄應該會有趣的多
把一整個學期的課簡介的清楚自然
謝謝 XD

當數學系學生唸密碼學總是看得懂後面的數學公式
卻很難猜測為什麼要搞得這麼複雜的原因”

---kaojohnny. 4/2, 2006

“你好
我可以把這篇轉貼到我的網站嗎?”

---路人. 8/28, 2006

“寫的超好的,一解我多年的疑惑!”

---Judy. 12/28, 2007
 
 

Write Concisely