1. 程式人生 > >數字簽名與數字證書的原理

數字簽名與數字證書的原理

在瞭解數字簽名和數字證書之前,可以先了解一下加密演算法的一些常見分類,我之前寫了一篇介紹常見加密演算法的文章。https://www.cnblogs.com/mysticbinary/p/12615063.html
# 將軍與士兵通訊 ---- 數字簽名原理 為了用最簡單的方式來講解數字簽名,我下面模擬幾個在軍事角色來講解,加密演算法的起源就是為了戰爭服務的。下面的實驗演示使用一個線上網站:http://tool.chacuo.net/cryptrsapubkey 假設有一個德國將軍和一個德國士兵需要通訊,那麼他們為了安全考慮,決定採用RSA非對稱加密演算法。 ## 將軍拿私鑰、士兵拿公鑰 將軍拿著私鑰: ```shell -----BEGIN PRIVATE KEY----- MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOFLM8+cWfjWJrP6 3i0jiRtpc240U6wjyEV4Ji2XA8UpFsRMdsFLXRsy9Rs5YsW1GBlXcv3bgZD2itui YSYnWdbJpI7yIFtkDKJZQ/k8kmH9v2QePUwzAbvXZsZ9hg92ORGms2nNT3DhQHNQ wopSgdThz8Ztvhd4Er0s1M9ZAvhjAgMBAAECgYEAxwNLTUXsJGfn4Gzm/jC52MEZ +mu2zgT90IAGGZeg+PUG63gwHyeXo4MsCVRz7/m8xAX/ykew+IEQwFt8Pdvc+rrs 5yml4gOBPfhpau5QaI75xNjnyH7UA3mbRCZeyZrvuKqtY/f8pCgzy3EBWnRpkcsq eE6bsOQrD45mltr+0QECQQDynvhKEh+hD5xBpF/DIP8Fp6fizexHdA6+aZT/gLaF A4XgZ9HEDDBhvNdadyYUNOLWhkxRHv6CkT5azfLXsJEhAkEA7begtbBCDXDf1+DR h3j2S8zcv6+utYgcpjvxZqjbPi6UIWXLxI80PIwQ0uouHCUMjikBA6VX9vTbw9TZ /IelAwJBAKI3W7baiz86mrTg3A4w/5GeWQexuurDVCBHo5F5U493nYk+oOe9ZpPS mQIpa9JS0d+xB1GtsWlHBzPbQySnL0ECQA/btCjqvT1QTl6EbPXwp92eqQtQmQMb NW4RiaUjlpyrVs5zkAho1T9EyMqJPNI71n6VVa/8k8WxyAdkZ7ZlBikCQEkNe1+s AKnh+AFGCJ+6WAq1J2RuIgcA6bVL3ip7F2NHdE+N+tR9JqWw3JNCweWmAlzKIGs6 eKSVD5egzKaLXss= -----END PRIVATE KEY----- ``` 士兵拿著公鑰: ```shell -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhSzPPnFn41iaz+t4tI4kbaXNu NFOsI8hFeCYtlwPFKRbETHbBS10bMvUbOWLFtRgZV3L924GQ9orbomEmJ1nWyaSO 8iBbZAyiWUP5PJJh/b9kHj1MMwG712bGfYYPdjkRprNpzU9w4UBzUMKKUoHU4c/G bb4XeBK9LNTPWQL4YwIDAQAB -----END PUBLIC KEY----- ``` ## 士兵給將軍寫信的過程 1. `I am soldier.`就是士兵想要加密的文字; 2. 用公鑰加密文字,得到密文(如下) ```shell l05JLkFyAY5W2AHnrufbPqPCU7VhfFmarBzLUgc/hIIdVVRZ2DUfCPACRUNmIhLWijaXYjHPvnD3QwxNmG4LynggWzDur2Ssj8Ng1EqmPEFA5ujlwUvZeqOENs/PnamTqrxlStxW2MOJZLUbxRsilIcK4807XBRYUThpsmUxZmU= ``` 3. 將這個密文通過郵件的方式傳送給將軍; 過程如下圖: ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401213820524-1712078931.png) ## 將軍收到密文解密的過程 只要將軍不把私鑰洩露出去,那這個密文就是安全的,即使英國佬攔截到了這個密文,也破譯不了,只能看到一堆亂碼。 1. 將軍收到密文; 2. 將軍使用私鑰來解密密文,得到信本身的內容; 過程如下圖: ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401214529660-1815223575.png) ## 將軍給士兵寫信的過程 1. `I am general.`是將軍寫的文字; 2. 用hash的方式,hash一下`I am general.` 得到hash文:`5244FAC4DB90120F1D833C687E0317FF` , 這個hash文叫做摘要(digest); 如下圖: ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401215546054-681859801.png) 3. 使用私鑰加密這個摘要,得到一段密文,這個叫數字簽名(signature); ```shell EtWBVFsxMeP1TMHwGLPdCy9fzmon09b7YGqfcKFNS7F4Db9iFSVKC6gABxuqL59eV6Fm/3hPXZ2NQ+4eq/rY57GiT0kMP4e86gFmUSLwJNHQyuue2zIJrrhLp7/CyVGjKFIyM0KLr+NERt2bv4t5ZkbIJLuN+QLNZUV6WCFugHQ= ``` 如下圖: ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401215935556-262516916.png) 3. 將軍將`I am general.`文字和`數字簽名`一起通過郵件的方式傳送給士兵; ## 士兵接收將軍信的過程 1. 士兵用公鑰解密這個數字簽名, 得到摘要`5244FAC4DB90120F1D833C687E0317FF` ; 如下圖: ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401220333599-90256192.png) 2. 拿到`I am general.`文字使用hash加密,得到`5244FAC4DB90120F1D833C687E0317FF` hash密文 3. 士兵通過對比摘要和hash密文是否一致,就能確認是將軍傳送的,並且沒有被篡改。 這樣就防止了英國佬攔截了將軍的信,並作修改。 ### 簽名的使用場景 - 需要加密傳輸的資料 - Android簽名 - 客戶端與服務端之間的通訊 ## 簽名的安全風險 1. 如果使用的是對稱加密演算法,那麼不管是客戶端還是服務端洩露了金鑰就非常危險了。 2. 使用了非對稱,但是將金鑰參與了傳輸,並洩露,那真是666了。 3. 服務端的金鑰寫死在程式碼,而不是採用訪問介面獲取的方式,會導致離職的程式設計師帶走金鑰。 4. 如果多個客戶端之間的公鑰證書被篡改,那麼也意味著身份認證也被篡改了。
# 為什麼需要數字證書 ## 為什麼需要數字證書 數字證書就是用來解決`4. 如果多個客戶端之間的公鑰證書被篡改,那麼也意味著身份認證也被篡改了。`安全風險的第四條,防止客戶端的公鑰被篡改。 英國佬氣急敗壞,想出對策,既然將軍不好搞,那就搞士兵,就派出英國美女間諜,美女間諜誘騙德國士兵後,偷偷使用了德國士兵的電腦,用自己的公鑰替換了士兵電腦裡的公鑰。此時,士兵本地儲存的是英國間諜的公鑰,士兵還以為這是將軍的公鑰。因此,英國佬就可以冒充德國將軍,用自己的私鑰做成"數字簽名",寫信給士兵,讓德國士兵用`假的將軍公鑰`進行解密,最後得到假信。 ## 數字證書是什麼 德國士兵得到了幾次假信之後,也覺得不對勁了,但是自己又無法確定公鑰是否是將軍的真公鑰。士兵就想到了一個辦法,要求德國將軍去找德意志情報中心(證書中心 certificate authority,簡稱CA),為公鑰做認證。德意志情報中心(CA)用自己的私鑰,對將軍的公鑰和一些相關資訊一起加密,生成"數字證書"(Digital Certificate)。 ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401223123093-886616224.png) 將軍拿到了德意志情報中心(證書中心 certificate authority,簡稱CA)的數字證書以後,就可以放心了。以後再給士兵寫信,除了加上數字簽名,再附上數字證書就行了。 士兵收信後,先去用德意志情報中心的公告板檢視CA證書的真偽性,確認之後,就可以用CA的公鑰解開數字證書,就可以拿到將軍的真實的公鑰了,然後就能證明"數字簽名"是否真的是將軍籤的。 ## Https原理 系統和瀏覽會儲存著CA機構的根證書,然後通過對比服務端傳送過來的證書的過程(這裡不展開講),來保證資料不被中間人篡改。 ![](https://img2020.cnblogs.com/blog/1552062/202004/1552062-20200401230150343-325398032.png) ## 數字證書的應用場景 - Https - 使用非對稱加密,又怕客戶端的公鑰被劫持的場景 # 參考 http://www.youdzone.com/signature.html https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signatu