轉自:http://blog.sina.com.cn/s/blog_cfee55a70102wn3h.html
數字簽名和數字證書:https://www.jianshu.com/p/80aa37311151
1 公鑰密碼體系(Public-key Cryptography)
公鑰密碼體系,又稱非對稱密碼體系。它使用二個密鑰,一個用於加密信息,另一個用於解密信息。 這二個密鑰間滿足一定數學關系,以至用二個密鑰中的任何一個加密的數據,只能用另外一個進行數據解密。每個用戶擁有二個密鑰,一個被稱之為公鑰,另一個被稱之為私鑰,並將公鑰分發給其它用戶。由於這二個密鑰間的數學關系, 任何收到該用戶公鑰的其它用戶可以保證發送用此公鑰進行加密的數據只有該用戶用自己的私鑰才能進行解密。 當然此項保證是建立在用戶私鑰的私有性基礎之上。目前最著名的公鑰密碼算法為RSA算法,它是由Rivest、Shamir和Adleman共同發明的。見圖示:
2 摘要算法
摘要算法是一種方法,它將一個任意長度的數據變換為一個定長的數據串,這一定長的數據串被稱為消息摘要,也有數據指紋之稱。合格的摘要算法必須滿足下列條件:
找出具有相同摘要的消息集合在技術上是不可能的;
對一給定的消息摘要,反向計算出消息本身在技術上是不可行的。
數據發送方在數據發送前,首先用摘要算法對數據計算消息摘要,然后將數據和消息摘要一起發送給接受方。接受方用相同的摘要算法對數據重新計算消息摘要,通過對二個消息摘要的比較,可以明確地判斷出數據在傳輸過程中是否被篡改。結果相同表示數據未被修改,而結果不同表明數據被修改或數據被丟失,從而保證數據在傳輸過程中的完整性。常用的摘要算法有MD2和MD5,它是由RSA實驗室發明的,具體算法請參閱RFC1319和RFC1321。 見圖示:
3 數字簽名
數字簽名實際上是非對稱密碼算法和消息摘要算法的一種組合應用,其目的在於:如某人張三對一段消息進行了數字簽名,那么其它的人都能驗證這個簽名確實是張三簽的,同時也能驗證張三簽名后數據是否被篡改。下面的例子將詳細介紹Alice如何對一份合同M進行數字簽名,同時Bob又是如何來驗證她所簽的合同。見圖示:
Alice准備了一份合同M;
Alice用摘要算法計算出該合同M的消息摘要MD;
Alice用非對稱算法和自己的私鑰對合同消息摘要MD進行加密,該密文S就是合同的數字簽名;
Alice將合同M和合同的數字簽名S合並在一起,通過網絡傳送到合同的接受者Bob;
Bob收到Alice的合同M及合同的數字簽名S;
Bob用Alice的公鑰對合同簽名S進行解密,得到Alice計算的合同摘要MD;
Bob采用相同摘要算法對收到的合同重新計算消息摘要MD';
Bob比較MD與MD'是否相等?
如結果相等,根據摘要算法的特性表明合同在傳輸過程中未被篡改。同時由於非對稱加密算法的特性可以斷定合同確實是Alice發送的,因為用Alice公鑰能解密成功的數據只有Alice用她自己私鑰對其進行加密才能產生,而她的私鑰其它人是無法獲取的。
為保證用戶之間在網上傳遞信息的安全性、真實性、可靠性、完整性和不可抵賴性,不僅需要對用戶的身份真實性進行驗證,也需要有一個具有權威性、公正性、唯一性的機構,負責向電子商務的各個主體頒發並管理符合國內、國際安全電子交易協議標准的電子商務安全證,並負責管理所有參與網上交易的個體所需的數字證書,因此是安全電子交易的核心環節。所以需要向電子商務認證授權機構(CA, Certificate Authority)申請簽發公鑰證書。
4 數字簽名私鑰及公鑰證書生成
以在windows平台生成為例:
第一步,下載openSSL工具,下載
第二步,打開 openssl 文件夾下的 bin 文件夾,執行 openssl.exe 文件;
第三步,生成 RSA 私鑰,輸入genrsa -out rsa_private_key.pem 1024,此時,我們可以在 bin 文件夾中看到一個文件名為 rsa_private_key.pem 的文件,用 記事本打開它,可以看到-----BEGIN RSA PRIVATE KEY-----開頭,-----END RSA PRIVATE KEY-----結尾的沒有換行的字符串,這個就是原始的 RSA 私鑰。(PHP簽名需要原始私鑰,JAVA需要對原始私鑰做pkcs8轉碼后再去除開頭和結尾)
第四步,創建證書請求。使用私鑰生成一個證書請求,輸入req -new -out cert.csr -key private.pem,這里我們會要求輸入國家、組織、姓名等信息,但是不會要求輸入證書有效天數,因為證書有效天數是CA認證中心給我們的;然后我們會把這個生成好的cert.csr(Certificate Signing Request (CSR):證書簽名申請)發給CA認證中心,證書請求提交到CA認證中心后會得到一份證書。
(測試時,根據cert.csr生成自簽署根證書,暫時不通過CA認證中心自行進行證書簽名,這里用是x509
openssl x509 -req -in cert.csr -out public.der -outform der -signkey private.pem -days 3650 //10年有效)