2009年7月21日 星期二

數位簽章(Digital Signature)簡介

此篇假設您對密碼學的一些術語已有基本的認識, 若您時間有限急於進入主題, 不妨閱讀上篇"密碼學閒話 ".

簽章, "簽名/蓋章", 基本上就是早期用來"證明某人身分", 進而認定某些東西的"有效性". 舉例來說, 文件/信件的署名, 合約上的簽名/蓋章 ... 但以簽章方式來證明文件或合約的有效性通常會衍生另一個問題, 也就是"完整性"或是文件或合約內容是否會遭到"竄改"的問題. 例如通常簽章都在"最後一頁", 前幾頁的內容有可能遭有心人士抽換以獲取不當利益. 所以我們常會看到有所謂的"騎縫章",用來蓋在夾頁上, 以確保內容的完整性.

所以, 用"數位方式"做成的"簽名蓋章", 當然要能達到證明某人身分與確保資料的完整性.
在討論實際做法之前, 我們來看看一個非對稱密碼學裏一個重要的部分 "Hash", 也就是有些朋友在修資料結構課時碰到的Hash.

Hash基本上是一種方法, 把大量資料內容消化然後產生一個"固定長度"的結果資料. 固定長度的結果資料比起原始資料通常小的多. 好的Hash演算法基本上可確保不同內容的資料會產生不同的Hash結果. 所以這個固定長度的結果資料又稱為 "fingerprint" 或 "digest". 也就是說, 對於兩分數百頁的文件(當然是頁數一樣, 或看起來一樣), 要確認兩份文件是否真正相同, 一種方式就是逐頁逐字比對, 另一種更有效的方式就是比對這兩份文件的fingerprints(Hash結果).

在製作數位簽章時就用到了Hash. MD5與SHA-1是比較常見用於數位簽章的Hash演算法. 製作數位簽章的步驟為: 1. 將欲被簽署之資料(如文件或合約)以選定之Hash演算法產生fingerprint. 2. 將產生之fingerpint用簽屬人之私鑰加密 (由於fingerprint很小, 用非對稱演算法加密沒問題) 3. 將以私鑰加密後的fingerprint加上其他輔助資訊, 如演算法名稱, 合成所謂的數位簽章.

因此簽署人可以把資料(文件或合約)以明碼的方式傳給其他人. 其他人可用簽署人之"公鑰", 先把數位簽章裏頭那一個用簽署人"私鑰"加密的fingerprint還原. 再用數位簽章內指定的Hash演算法, 為資料(文件或合約)重新產生fingerprint. 將兩個fingerprints比對, 即可知道文件被竄改與否.
聽起來前輩們的心血終於為我們建立了完美世界! 但是我們很快就發現, 人心之邪惡遠非科技所能敵. 試想一個狀況, 當你拿到一把公鑰(例如接到自稱為某個你熟知人士的電子郵件, 附上一把他的公鑰), 你怎麼知道哪把私鑰是真正在誰手裡? 公私鑰機制的假設就是持有公鑰的人可以確定那一把唯一的私鑰 一定是在那個人手裏. 但是現實生活, 網路世界, 我們真能或很容易證明這個假設嗎? 假設一旦不成立, 數位信封與數位簽章就只是白忙一場罷了..

似乎人惹出來的問題還需要人來解. 下篇主題就來討論怎樣把人,尤其是有錢, 有權, 有勢或有公信力的人拖下水的解決方案: "憑證" (Certificate).

沒有留言:

張貼留言