午休時,想起自己以前做的一個配置檔案簽名的例子.這裡簡單回顧一下幾個基本概念!
(1)非對稱密鑰指的是一對密鑰:私鑰和公鑰.
私鑰和公鑰并無特别的區分,隻是對外公布的密鑰稱為公鑰,自己保留的稱為私鑰.這對密鑰中,其中任何一個用來加密,可以使用另一個進行唯一解密.且互相之前無法推到得出.
(2)加密分為兩種情況:對稱加密和非對稱加密.兩者用在不同的情況下.一般情況下,對稱密鑰适用于大量内容的加密.非對稱密鑰用于少量内容的加解密(主要考慮效率的問題,典型的應用為SSL).
(3)數字簽名指的是對資訊摘要進行加密.一般分為兩個步驟:摘要和加密.
<1>首先對明文利用摘要算法抽出一段固定位元組的摘要.關于摘要算法的幾種性質,這裡不做讨論.讀者記住不可逆就可以了.
<2>對上述摘要用自己的私鑰加密.這個過程就稱為簽名.相當于打上了你的資訊.别人也無法冒充你,同時你也無法抵賴哦.
(4)證書指的是封裝公鑰,同時該公鑰已經過公證了,有權威第三方證明過了.表明該公鑰指的信任,是以無法假冒的.
情景假設:
A給B發送資訊.
<1>首先假設A,B都各自擁有了"對方"的公鑰(這裡的公鑰之是以加了引号,表明公鑰不一定真的是對方的,至少使用者是堅信這就是對方的)
<2>還有一個角色是第三方
因為内容需要保密,故A用B的公鑰加密,并發送給B.理論上講B收到資訊後,用自己的私鑰解密就可以了.但是存在以下幾個疑點:
第一:B如何确定這個是A發送過來的呢.
第二:A如何确定自己用于加密的對方的公鑰就是B的呢.
第三:B如何确定自己持有的公鑰就一定是A的呢.
對于第一個問題:就要用到簽名了.即發給B的資訊上加上自己的簽名.
A隻需要使用sha256算法(一種摘要算法)對明文處理,抽出一段摘要.并用自己的私鑰對這段摘要加密.
再把明文和簽名一起用B的公鑰加密.最後将這個加密信件發給B.(注意,這裡的明文和簽名可能經過特殊的封裝.常見的标準是PKCS系列,如:PKCS7.這裡一并封裝了使用了何種摘要算法)
B收到資訊後,使用自己的私鑰解密,拿出兩個東西:明文和簽名.B用向指明的摘要算法對明文再做一次摘要處理得摘要1.然後用A的公鑰解密簽名,拿出摘要2..此時,B手裡有兩份摘要.B比較z這兩份摘要.若一緻.,則表明這個确實是A發送過來的.
以上都是在假定A和B手裡的公鑰都是對方的才正确!!
對于第二和第三個疑點的處理為證書:通常A和B的公鑰都通過了第三方(CA中心)公證過了.CA用自己的私鑰簽名過了.當然CA不可能處理全球這麼多的公證需求.是以存在證書鍊一說.這裡不讨論了.
筆者參加工作的第一個任務就是對公司産品的配置檔案簽名.實作GUI上的下載下傳和上傳.
思路就是:
首先使用openssl生成一對密鑰.要求按照spec生成.然後自簽名一個PKCS12格式證書.pkcs12證書封裝了公鑰和私鑰.不過這裡的私鑰還需要手動設定一段密碼,加密.不用擔心這裡的私鑰的安全性.這裡主要考慮到私鑰需要存放在産品中,已友善使用者上傳配置檔案時進行解簽名.
設計的一對簽名/解簽API是基于openssl庫完成.openssl本身存在一對API實作pkcs7格式的簽名.是以,隻要相應的處理一下即可.
GUI上面的處理比較簡單了,用json實作backup和restore兩步就可以了.這裡不讨論了.具體的code不友善貼出來.有需要的給我留言.
謝謝~~~~