原博文地址:https://www.jianshu.com/p/4932cb1499bfhtml
最近在開發關於PDF合同文檔電子簽章的功能,大概意思就是在一份PDF合同上簽名,蓋章,使其具備法律效應。簽章有法律效應必須知足兩個條件:git
在紙質合同中,因爲簽名字跡的不可複製性,蓋章的惟一性以及紙質合同對塗改的防範措施(好比金額用大寫)能夠保證上述兩點,從而具有法律效應,那麼PDF合同如何保障呢?兩個重要的概念就是數字簽名和數字證書。這項技術普遍運用於文件認證,數據傳輸等。
爲了弄懂這些,我花了2天時間從加密算法開始,到數字簽名和CA證書,最後再從新認識下https的原理。算法
加密我瞭解的很少,只知道有這麼兩種算法:對稱加密和非對稱加密。windows
接着聊上面發郵件的例子,假設A用本身的私鑰對Email加密發送,這存在下面問題:瀏覽器
對文件自己加密多是個耗時過程,好比這封Email足夠大,那麼私鑰加密整個文件以及拿到文件後的解密無疑是巨大的開銷。
數字簽名能夠解決這個問題:
1.A先對這封Email執行哈希運算獲得hash值簡稱「摘要」,取名h1
2.而後用本身私鑰對摘要加密,生成的東西叫「數字簽名」
3.把數字簽名加在Email正文後面,一塊兒發送給B
(固然,爲了防止郵件被竊聽你能夠用繼續公鑰加密,這個不屬於數字簽名範疇)
4.B收到郵件後用A的公鑰對數字簽名解密,成功則表明Email確實來自A,失敗說明有人冒充
5.B對郵件正文執行哈希運算獲得hash值,取名h2
6.B 會對比第4步數字簽名的hash值h1和本身運算獲得的h2,一致則說明郵件未被篡改。安全
看完這個過程,是否是以爲數字簽名不過如此。其實就是利用算法(不必定是非對稱算法)對原文hash值加密,而後附着到原文的一段數據。數字簽名的做用就是驗證數據來源以及數據完整性!解密過程則稱爲數字簽名驗證。
不過先彆着急,我在梳理數字簽名流程時候有下面幾點疑惑,不知你也是否同樣?服務器
上面第2點描述的安全漏洞根源在哪?就是A的公鑰很容易被替換!那麼數字證書是怎麼生成的呢?以及如何配合數字簽名工做呢?網站
首先A去找"證書中心"(certificate authority,簡稱CA),爲公鑰作認證。證書中心用本身的私鑰,對A的公鑰和一些相關信息一塊兒加密,生成"數字證書"(Digital Certificate):google
A在郵件正文下方除了數字簽名,另外加上這張數字證書加密
B收到Email後用CA的公鑰解密這份數字證書,拿到A的公鑰,而後驗證數字簽名,後面流程就和圖1的流程同樣了,再也不贅述。
和數字簽名同樣我在梳理這個流程時有下面幾點疑惑:
上面一直在說虛擬場景,下文舉個實際例子看看數字簽名+數字證書如何驗證文件的來源,以及文件的完整性。好比下載文件:咱們開發中通常是服務端給文件信息加上md5,客戶端下載完成後校驗md5來判斷文件是否損壞,這個其實就是簡單的校驗機制,而不少正規企業好比google都會給官方軟件簽署數字簽名和證書,而windows已經預置了不少CA根證書:
而後看下我以前從網上下載的Chrome.exe,右鍵屬性,經過鼠標點擊一步驗證:
Google Inc就是google從CA中心申請的數字證書。這樣看來,這個軟件確實來源於google官方,而且文件完整。接下來我乾點壞事,用notepad打開這個exe文件而且篡改裏面的內容(修改二進制數據,09 改成33),保存:
再看下數字簽名還正常嗎?
文件被篡改致使數字簽名無效,數字證書沒有問題。
數字簽名和數字證書能夠用於文件,固然也能用於html網頁數據。本人沒有https相關開發經驗,故不作深刻探討只是簡單介紹下。
而https就是專門解決這三個問題,https使用數字簽名+數字證書解決了前2個問題,不少大型網站好比baidu.com都會採用https協議,網址左側會出現綠色加鎖標識:
點擊能夠查看證書,另外瀏覽器都會內置CA根證書,來對這些網站的服務器證書進行校驗。
而後,再用SSL協議對傳輸通道加密,保證數據傳輸不被竊聽,這個SSL加密原理分爲不少步驟不在本文討論範圍。
全文比較深刻地探討了非對稱加密,數字簽名和數字證書的原理,最後引出https的簡單介紹,若有差錯盡請指正。