實用密碼學工具——Digital Signature
一位lord寫了一封文書,將它裝入了一個信封,然後拿出了蠟燭在封口處滴了幾滴,最後用代表自己身份的印章壓了下去,遞給了他的僕從……
我們來仔細看看,在這個過程中,到底發生了什麼事情:
- 「一位lord寫了一封文書」:注意這個文書是公開的明文,並不是某種神奇的隱形墨水,也就是人人都能看。
- 「將它裝入了一個信封,然後拿出了蠟燭在封口處滴了幾滴」:這個過程可以看做把明文進行了包裝,封口蠟和信封保證了裡面的文件不會被篡改和調換,因為一旦這樣做,就不得不破壞信封和封口蠟。
- 「最後用代表自己身份的印章壓了下去」:這保證了收件人可以驗證寄件人的身份。沒有這個印章,在不拆開信封的情況下,整個信封都可能被調換,收件人並不確定信件來自於寄件人還是其他人。
- 「遞給了他的僕從」:他人是不可靠信道,僕從可能被收買,信件可能中途被截獲,但是一旦到達了收件人處,只要封口蠟和信封完整,印章紋樣清晰可認,就可以保證裡面的內容被安全地傳遞了。
在現代,使用數字簽名(Digital Signature)人人都可以有一個屬於自己的,獨一無二的印章+封口蠟。相比之下,普通的簽名,只能在原文件的基礎上附加身份信息,不能保證文件的完整性,文件可以被篡改、被掉包(常見的多張文件用一次印章簽名的方式可以一定程度上保證文件的完整性)。數字簽名能做到的事情,超越了普通的簽名,又比中世紀貴族用的方式更加的便捷。
數字簽名可以保證信息的三個屬性:
- 完整性:數據傳輸過程中保持完整,沒有被篡改。
- 認證性:僅由發送方提供簽名,第三方不能偽造發送方的身份。
- 不可抵賴性:發送方不能否認數據由其發出。
值得注意的是,數字簽名並不會加密數據,它只是在保證數據完整的同時給數據綁定上發送者的身份信息。
在傳統印章的使用上,要保證簽名的有效性,印章應該隨身攜帶,另第三方難以仿造。我們看到,這時方式其實並不可靠,因為印章的使用是「對稱」的,簽名和驗證簽名使用的是「同一套紋樣」。而現在廣泛使用的數字簽名則是「非對稱」的,簽名使用的「密鑰」是不對外公開的,而驗證簽名使用的是和「密鑰」相匹配的,可以公開的「公鑰」。密鑰可以通過演算法生成公鑰,但反過來就非常困難。
其實,還有一類認證數據的方式Message Authentication Code,同樣可以用來驗證發信者的身份和校驗數據的完整性,只不過使用的是對稱的「密鑰」。在通信雙方都認可某一共享的密鑰,同時第三方無法獲取的時候,這種認證方式才能保證不被偽造。而這個共享密鑰自然需要額外的安全通道進行傳遞,並不如數字簽名的公鑰那樣可以任意傳播,便利性上打了折扣。
上篇說的密鑰交換,和這篇說的數字簽名是非對稱密碼學的兩大應用方向,前者可以在不可靠信道傳遞共享密鑰,但不能驗證雙方身份,後者在不可靠信道傳遞公開信息,但可以驗證發送者身份。
推薦閱讀:
※Do not claim, show me the proof:記一個困擾了我小一年的問題
※Don't Panic! KRACK 沒你想像的那麼糟
※(一)Python密碼學之旅---01古典密碼之初識