以上學習所有內容,對稱加密、非對稱加密、訊息摘要、數字簽名等知識都是為了理解數字證照工作原理而作為一個預備知識。數字證照是密碼學裡的終極武器,是人類幾千年歷史總結的智慧的結晶,只有在明白了數字證照工作原理後,才能理解Https 協議的安全通訊機制。最終才能在SSL 開發過程中得心應手。
另外,對稱加密和訊息摘要這兩個知識點是可以單獨拿來使用的。
知識點串聯:
數字證照使用到了以上學習的所有知識
- 對稱加密與非對稱加密結合使用實現了祕鑰交換,之後通訊雙方使用該祕鑰進行對稱加密通訊。
- 訊息摘要與非對稱加密實現了數字簽名,根證照機構對目標證照進行簽名,在校驗的時候,根證照用公鑰對其進行校驗。若校驗成功,則說明該證照是受信任的。
- Keytool 工具可以建立證照,之後交給根證照機構認證後直接使用自簽名證照,還可以輸出證照的RFC格式資訊等。
- 數字簽名技術實現了身份認證與資料完整性保證。
- 加密技術保證了資料的保密性,訊息摘要演算法保證了資料的完整性,對稱加密的高效保證了資料處理的可靠性,數字簽名技術保證了操作的不可否認性。
通過以上內容的學習,我們要能掌握以下知識點:
- 基礎知識:bit 位、位元組、字元、字元編碼、進位制轉換、io
- 知道怎樣在實際開發裡怎樣使用對稱加密解決問題
- 知道對稱加密、非對稱加密、訊息摘要、數字簽名、數字證照是為了解決什麼問題而出現的
- 瞭解SSL 通訊流程
- 實際開發裡怎樣請求Https 的介面
一、數字簽名
1. 概述
數字簽名是非對稱加密與數字摘要的組合應用
2. 應用場景
- 校驗使用者身份(使用私鑰簽名,公鑰校驗,只要用公鑰能校驗通過,則該資訊一定是私鑰持有者釋出的)
- 校驗資料的完整性(用解密後的訊息摘要跟原文的訊息摘要進行對比)
3. 簽名過程
“傳送報文時,傳送方用一個雜湊函式從報文文字中生成報文摘要,然後用自己的私人金鑰對這個摘要進行加密,這個加密後的摘要將作為報文的數字簽名和報文一起傳送給接收方,接收方首先用與傳送方一樣的雜湊函式從接收到的原始報文中計算出報文摘要,接著再用傳送方的公用金鑰來對報文附加的數字簽名進行解密,如果這兩個摘要相同、那麼接收方就能確認該數字簽名是傳送方的。
數字簽名有兩種功效:一是能確定訊息確實是由傳送方簽名併發出來的,因為別人假冒不了傳送方的簽名。二是數字簽名能確定訊息的完整性。因為數字簽名的特點是它代表了檔案的特徵,檔案如果發生改變,數字摘要的值也將發生變化。不同的檔案將得到不同的數字摘要。一次數字簽名涉及到一個雜湊函式、傳送者的公鑰、傳送者的私鑰。”
4. 使用步驟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//獲取signature 物件,初始化演算法:MD2withRSA, MD5withRSA, or SHA1withRSA Signature signature = Signature.getInstance("MD5withRSA"); //建立私鑰(從磁碟上讀取) PrivateKey privateKey = (PrivateKey)SerializableUtil.readObject( "heima.privateKey"); //使用私鑰進行初始化 signature.initSign(privateKey); //傳入需要簽名的資料 signature.update(content.getBytes()); //執行簽名 byte[] sign = signature.sign(); //建立公鑰(從磁碟上讀取) PublicKey publicKey = (PublicKey) SerializableUtil.readObject( "heima.publicKey"); //使用公鑰進行初始化 signature.initVerify(publicKey); //傳入需要校驗的資料(即上面的原文) signature.update(content.getBytes()); //執行校驗 boolean verify = signature.verify(sign); |
5. 總結
數字簽名一般不單獨使用,基本都是用在數字證照裡實現SSL 通訊協議。下面將學習的數字證照就是基於數字簽名技術實現的。
二、數字證照
1. 概述
數字證照就是網際網路通訊中標誌通訊各方身份資訊的一串數字,提供了一種在Internet 上驗證通訊實體身份的方式,數字證照不是數字身份證,而是身份認證機構蓋在數字身份證上的一個章或印(或者說加在數字身份證上的一個簽名)。它是由權威機構——CA 機構,又稱為證照授權(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份。
2. 應用場景
- 交易者身份的確定性、不可否認性、不可修改性
- 對應用進行簽名認證(例如Android 的apk)
3. 數字證照格式
數字證照的格式普遍採用的是X.509V3 國際標準,一個標準的X.509 數字證照包含以下一些內容:
- 證照的版本資訊;
- 證照的序列號,每個證照都有一個唯一的證照序列號;
- 證照所使用的簽名演算法;
- 證照的發行機構名稱,命名規則一般採用X.500 格式;
- 證照的有效期,通用的證照一般採用UTC 時間格式,它的計時範圍為1950-2049;
- 證照所有人的名稱,命名規則一般採用X.500 格式;
- 證照所有人的公開金鑰;
- 證照發行者對證照的簽名。
4. 數字證照原理
數字證照是安全領域裡的終極武器,SSL 通訊協議裡最核心的東西就是數字證照。他涉及到前面提到的所有知識:對稱加密、非對稱加密、訊息摘要、數字簽名等。
數字證照可以通過Java 自帶的KeyTool 工具生成,生成後的數字證照一般保管在KeyStore 裡。KeyStore可以叫做祕鑰倉庫。
祕鑰倉庫可以保管3 種型別的資料:KeyStore.PrivateKeyEntry(非對稱機密裡的私鑰)、KeyStore.SecretKeyEntry (對稱加密裡的祕鑰)、KeyStore.TrustedCertificateEntry(受信任的證照)
5. KeyTool工具
路徑:jre\bin\keytool.exe
常用命令:
生成keypair
1 2 |
keytool -genkeypair keytool -genkeypair -alias lisi(後面部分是為證照指定別名,否則採用預設的名稱為mykey) |
看看keystore 中有哪些專案:
1 2 |
keytool -list 或keytool -list -v keytool -exportcert -alias lisi -file lisi.cer |
生成可列印的證照:
1 |
keytool -exportcert -alias lisi -file lisi.cer –rfc |
顯示數字證照檔案中的證照資訊:
1 |
keytool -printcert -file lisi.cer |
直接雙擊lisi.cer,用window 系統的內建程式開啟lisi.cer
6. Android 的keystore 相關知識
debug 簽名路徑:user.Android\debug.keystore
debug.keystore 的別名(alias)及密碼:
別名:androiddebugkey,密碼:android
簽名命令(jdk1.6):
1 |
jarsigner -verbose -keystore debug.keystore -signedjar 1signed.apk 1.apk androiddebugkey |
簽名命令(jdk1.7):
1 2 |
jarsigner -verbose -keystore debug.keystore -signedjar 1signed.apk 1.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA |
優化命令:
1 |
zipalign -v 4 1signed.apk 1signedaligned.apk |
驗證簽名是否成功:
1 |
jarsigner -verify 1signed.apk |
7. 補充
簽名證照:
由權威頒發機構頒發給伺服器或者個人用於證明自己身份的東西,預設客戶端都是信任的。主要目的是用來加密和保證資料的完整性和不可抵賴性
例如根證照機構Symantec 頒發給百度的就是簽名證照,是受信任的。
自簽名證照:
由伺服器自己頒發給自己,用於證明自己身份的東西,非權威頒發機構釋出,預設客戶端都是不信任的,主要目的是用來加密和保證資料的完整性和不可抵賴性,與簽名證照相同.
例如中鐵集團(SRCA)辦法給12306 的證照就是自簽名證照,自己給自己頒發的。