1. 程式人生 > >數字簽名和數字證書的學習總結

數字簽名和數字證書的學習總結

本文主要是對網上資源的一些列舉和總結,主要涉及的內容有以下幾點:

  • 非對稱加密,對稱加密,摘要演算法
  • 數字簽名
  • 數字證書
  • SSL/TLS
  • iOS中的證書以及簽名過程

非對稱加密,對稱加密,摘要演算法

非對稱加密
  • 需要一對公鑰和私鑰,對於一個私鑰,只有一個對應的公鑰
  • 公鑰可以公開,但是通過公鑰幾乎不可能推算出私鑰
  • 通過公鑰加密的內容只有私鑰才可以解密,反之,通過私鑰加密的內容,也只有公鑰才可以解密
  • 缺點:加密速度慢,效率低
對稱加密
  • 雙方使用同一個金鑰進行加密和解密
  • 加密速度快,加密效率高

主要演算法有:DES演算法

摘要演算法
  • 具有不可逆性,也就是通過加密後的內容無法知道原文(否則能量不守恆~~)
  • 不同的原文加密後的內容肯定不同

主要演算法有:MD5,SHA1,SHA256

題外話,Google在2017年2月23日宣佈攻破SHA-1加密技術,具體可參考Google震驚密碼界:攻破SHA-1加密技術, 但是也是非常費電費時的,不過保險起見,還是使用SHA256等更加不容易破解的加密方法。

數字簽名和數字證書

關於數字簽名和數字證書,阮一峰老師的這篇文章描寫的非常清晰。 我自己有如下一些認知:

數字簽名就相當於是用自己的私鑰對釋出的內容進行加密後得到的密文(此處一般為了提高效率,一般會先對原文進行摘要加密,然後在對密文進行簽名)

數字證書是為了解決客戶端的公鑰有可能被篡改,從而偽造中間人的問題。通過第三方CA認證機構簽發證書,從而保證證書中的釋出者的公鑰是正確的。 數字證書會包含以下內容:

  • 申請者的資訊
  • 申請者的公鑰(很重要的資訊)
  • 使用證書發行方(CA機構)的私鑰對整個證書資訊進行加密後的簽名(這個簽名主要就是用來驗證證書的內容是否被人篡改)
  • 其他資訊,比如證書有效期,CA機構的公鑰等等

SSL/TLS

  • 生成對話金鑰一共需要三個隨機數,其中兩個是客戶端生成,一個是伺服器生成,前兩個隨機數都是明文傳遞,只有第三個隨機數是加密傳遞
  • 整個握手階段都不加密(也沒法加密),都是明文的
  • 握手階段結束之後整個通話使用 對話金鑰 進行對稱加密
  • 公鑰私鑰(非對稱加密)只用於加密解密 Premaster secret (第三個隨機數),從而生成 對話金鑰
  • 伺服器的公鑰存放在伺服器的數字證書中

iOS中籤名,證書總結

關於iOS簽名相關的內容,漫談iOS程式的證書和簽名機制中的圖和描述很好,可供參考。 以下是我的一些總結內容。

(一)蘋果生成證書具體是幹了什麼?
  1. 開發者在本地做成CertificateSigningRequest檔案,其實就是生成公鑰私鑰,私鑰儲存在本地,公鑰會在csr檔案中,用於上傳。
  2. 開發者通過apple develop網站上傳csr檔案,生成證書。生成證書的過程其實就是蘋果對開發者的資訊(包括基本資訊,公鑰資訊)進行雜湊加密,然後使用自己的WWDR私鑰對雜湊加密的結果再次進行加密形成簽名,同時將基本資訊明文和簽名結果一併合成到證書中。
(二)蘋果系統如何驗證證書?
  1. 系統會拿到證書中的明文資訊,然後進行雜湊加密,得到雜湊結果A
  2. 系統使用WWDR公鑰對證書中的簽名信息進行解密,得到摘要資訊B
  3. 如果A和B相同的話,那麼說明證書沒有被篡改,從而可以拿出證書中的開發者的公鑰,用於驗證程式碼簽名
(三)程式碼簽名在幹什麼?

程式碼簽名就是使用開發者的私鑰對程式碼中的每個檔案進行簽名,然後把簽名的結果放到一個檔案中_CodeSignature/CodeResources

(四)iOS系統如何驗證程式包?
  1. 首先iOS會先提取出app包中的描述檔案(mobileprovision檔案),該檔案是通過apple develop網站生成下載的。
  2. 確認描述檔案沒有被篡改過(方法同上面的(二))
  3. 如果描述檔案正常,那麼拿出描述檔案中的證書資訊,從證書中可以拿到開發者的公鑰
  4. 使用開發者的公鑰對_CodeSignature/CodeResources中的簽名進行解密,同時對指定的檔案進行摘要加密,比對雙方的結果

參考連結部落格中提出的一些命令總結

列出系統中可用於簽名的有效證書:

security find-identity -v -p codesigning

檢視蘋果生成的證書中具體有哪些內容:

openssl x509 -inform der -in ios_development.cer -noout -text

檢視CertificateSigningRequest檔案中有啥內容:

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

檢視描述檔案內容:

security cms -D -i embedded.mobileprovision

將描述檔案中的DeveloperCertificates中的證書單獨copy到一個檔案中,組織成如下格式後,

# 這裡要注意每行是64個字元,然後要有換行
-----BEGIN CERTIFICATE-----
MIIFnjCCBIagAwIBAgIIE/IgVItTuH4wDQYJKoZIhvcNAQEFBQAwgZYxCzA…
-----END CERTIFICATE-----

可通過命令檢視:

openssl x509 -text -in file.pem

列出一些有關 Example.app 的簽名信息:

codesign -vv -d Example.app

驗證簽名是否完好:

codesign --verify Example.app

參考連結

(The End)