一、數字簽名
1. 概述
數字簽名是非對稱加密與數字摘要的組合應用
2. 應用場景
- 校驗使用者身份(使用私鑰簽名,公鑰校驗,隻要用公鑰能校驗通過,則該資訊一定是私鑰持有者釋出的)
- 校驗資料的完整性(用解密後的消息摘要跟原文的消息摘要進行對比)
3. 簽名過程
“發送封包時,發送方用一個哈希函數從封包文本中生成封包摘要,然後用自己的私人密鑰對這個摘要進行加密,這個加密後的摘要将作為封包的數字簽名和封包一起發送給接收方,接收方首先用與發送方一樣的哈希函數從接收到的原始封包中計算出封包摘要,接着再用發送方的公用密鑰來對封包附加的數字簽名進行解密,如果這兩個摘要相同、那麼接收方就能确認該數字簽名是發送方的。
數字簽名有兩種功效:一是能确定消息确實是由發送方簽名并發出來的,因為别人假冒不了發送方的簽名。二是數字簽名能确定消息的完整性。因為數字簽名的特點是它代表了檔案的特征,檔案如果發生改變,數字摘要的值也将發生變化。不同的檔案将得到不同的數字摘要。一次數字簽名涉及到一個哈希函數、發送者的公鑰、發送者的私鑰。”
4. 使用步驟
//擷取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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
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
keytool -genkeypair
keytool -genkeypair -alias lisi(後面部分是為證書指定别名,否則采用預設的名稱為mykey)
- 1
- 2
看看keystore 中有哪些項目:
keytool -list 或keytool -list -v
keytool -exportcert -alias lisi -file lisi.cer
- 1
- 2
生成可列印的證書:
keytool -exportcert -alias lisi -file lisi.cer –rfc
- 1
顯示數字證書檔案中的證書資訊:
keytool -printcert -file lisi.cer
- 1
直接輕按兩下lisi.cer,用window 系統的内置程式打開lisi.cer
6. Android 的keystore 相關知識
debug 簽名路徑:user.android\debug.keystore
debug.keystore 的别名(alias)及密碼:
别名:androiddebugkey,密碼:android
簽名指令(jdk1.6):
jarsigner -verbose -keystore debug.keystore -signedjar signed.apk apk androiddebugkey
- 1
簽名指令(jdk1.7):
jarsigner -verbose -keystore debug.keystore -signedjar signed.apk apk androiddebugkey -digestalg
SHA1 -sigalg MD5withRSA
- 1
- 2
優化指令:
zipalign -v signed.apk signedaligned.apk
- 1
驗證簽名是否成功:
jarsigner -verify signed.apk
- 1
7. 補充
簽名證書
由權威頒發機構頒發給伺服器或者個人用于證明自己身份的東西,預設用戶端都是信任的。主要目的是用來加密和保證資料的完整性和不可抵賴性
例如根證書機構Symantec 頒發給百度的就是簽名證書,是受信任的。
自簽名證書
由伺服器自己頒發給自己,用于證明自己身份的東西,非權威頒發機構釋出,預設用戶端都是不信任的,主要目的是用來加密和保證資料的完整性和不可抵賴性,與簽名證書相同.
例如中鐵集團(SRCA)辦法給12306 的證書就是自簽名證書,自己給自己頒發的。
三、Android簽名機制
1、什麼是簽名?
Android要求所有已安裝的應用程式都使用數字證書做數字簽名,數字證書的私鑰由開發者持有。Android使用數字證書作為辨別應用程式開發者的一種方式,并在應用程式之間建立信任的關系,證書并不用來控制使用者能否安裝那個應用程式,證書不需要有證書認證中心簽名,完全可以使用自簽名證書(seft-signed certificates)
沒有正确簽名的應用,Android系統不會安裝或運作,此規則适用于任何地方運作的Android系統,不管是在模拟器還是在真實裝置上。因為這個原因,在真機或模拟器上運作或調試應用前,必須為其設定好簽名。
2、為什麼需要簽名?
開發Android的人很多,完全可以把包名,類名起成同樣的名字,這時候如何區分?簽名可以區分開發商或者惡意的開發者可以通過相同的包名混淆替換已安裝應用。簽名可以保證相同包名但是簽名不同的包不被替換。
應用如果使用一種key簽名,另外一個key簽名的檔案将無法安裝或覆寫老的版本。防止已安裝的應用被惡意的第三方覆寫或替換。簽名可以防止交易抵賴
3、Android簽名機制
在Android 系統中,所有安裝到系統的應用程式都必有一個數字證書,此數字證書用于辨別應用程式的作者和在應用程式之間建立信任關系。
Android 系統要求每一個安裝進系統的應用程式都是經過數字證書簽名的,數字證書的私鑰則儲存在程式開發者的手中。
Android 将數字證書用來辨別應用程式的作者和在應用程式之間建立信任關系,不是用來決定最終使用者可以安裝哪些應用程式。
這個數字證書并不需要權威的數字證書簽名機構認證(CA),它隻是用來讓應用程式包自我認證的。
同一個開發者的多個程式盡可能使用同一個數字證書,這可以帶來以下好處。
- 有利于程式更新,當新版程式和舊版程式的數字證書相同時,Android 系統才會認為這兩個程式是同一個程式的不同版本。如果新版程式和舊版程式的數字證書不相同,則Android 系統認為他們是不同的程式,并産生沖突,會要求新程式更改包名。
- 有利于程式的子產品化設計和開發。Android 系統允許擁有同一個數字簽名的程式運作在一個程序中,Android程式會将他們視為同一個程式。是以開發者可以将自己的程式分子產品開發,而使用者隻需要在需要的時候下載下傳适當的子產品
在簽名時,需要考慮數字證書的有效期
- 數字證書的有效期要包含程式的預計生命周期,一旦數字證書失效,持有改數字證書的程式将不能正常更新。
- 如果多個程式使用同一個數字證書,則該數字證書的有效期要包含所有程式的預計生命周期。
- Android Market 強制要求所有應用程式數字證書的有效期要持續到2033 年10 月22 日以後。
Android 數字證書包含以下幾個要點
- 所有的應用程式都必須有數字證書,Android 系統不會安裝一個沒有數字證書的應用程式
- Android 程式包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
- 如果要正式釋出一個Android ,必須使用一個合适的私鑰生成的數字證書來給程式簽名,而不能使用adt 插件或者ant 工具生成的調試證書來釋出
- 數字證書都是有有效期的,Android 隻是在應用程式安裝的時候才會檢查證書的有效期。如果程式已經安裝在系統中,即使證書過期也不會影響程式的正常功能
4、Android簽名過程
建立證書
5、Android APP 更新流程
簽名沖突:
如果兩個應用程式, 包名相同, 但是簽名不同, 就無法覆寫安裝
正式簽名:
- 有效期比較長,一般大于25年
- 需要設定密碼
- 正式釋出應用時,必須用正式簽名來打包
測試簽名(debug.keystore)
- 有效期是1年,很短
- 有預設的别名,密碼,alias=android,密碼是androiddebugkey
- 在Android Studio中直接運作項目是,系統預設采用此簽名檔案
如果正式簽名丢失了怎麼辦?
- 修改包名,釋出,會發現有兩個手機衛士,使用者會比較糾結
- 請使用者先删掉原來的版本,再進行安裝,使用者會流失
- 作為一名有經驗的開發人員,請不要犯這種低級錯誤