一、概念篇 1、消息摘要-Message Digest 消息摘要:在消息數據上,執行一個單向的hash函數,生成一個固定長度的hash值,這個Hash值就是消息摘要,也成為數字指紋。 消息摘要特點: (1)無論輸入消息多長,計算出來的消息摘要長度總是固定的; (2)不可逆性,通過摘要無法推算出消息本 ...
一、概念篇
1、消息摘要-Message Digest
消息摘要:在消息數據上,執行一個單向的hash函數,生成一個固定長度的hash值,這個Hash值就是消息摘要,也成為數字指紋。
消息摘要特點:
(1)無論輸入消息多長,計算出來的消息摘要長度總是固定的;
(2)不可逆性,通過摘要無法推算出消息本身;
(3)如果修改了消息,摘要會發生變化(長明文生成短摘要的Hash必然會碰撞);
作用:只能保證消息的完整性,無法保證消息的防篡改。使用場景:文件下載的MD5校驗。
消息摘要演算法:MD5、SHA-0、SHA-1
2、數字簽名-Signature
數字簽名:消息發送者用自己的私鑰對消息摘要加密產生的一個字元串,加密演算法確保別人無法偽造生成這段字元串。這段數字字元串也是對消息發送者發生消息真實性的一個有效證明,故稱數字簽名。
數字簽名是非對稱機密演算法+數字摘要技術的結合。
作用:保證消息完整性、也可以防篡改。
數字簽名原理:消息發送者將信息摘要用私鑰加密,與原文一起傳送給接收者。消息接收者用公鑰才能將信息摘要解密,再使用相同的Hash函數對收到原文計算產生一個信息摘要,對比二者是否一致。基於非對稱加密演算法的數字簽名保證防篡改,消息摘要保證完整性。
思考:為什麼只對消息摘要進行數字簽名?
加密演算法普遍存在計算耗時較長的瓶頸,MD5、SHA等消息摘要演算法則不存在該問題,只針對消息摘要進行簽名,可以大大減少加密內容,提升整個數字簽名過程的效率。
3、數字證書-Certificate
數字證書是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公鑰的文件。
數字證書包含內容:
證書發佈機構 Issuer
證書有效期Validity
消息發送方的公鑰
證書所有者 Subject
數字簽名使用的演算法
備註:Android APK中的CERT.RSA是自簽名的,並不需要第三方權威機構發佈或者認證,用戶可以在本地機器生成這個自簽名證書。
二、Android APK兩種簽名方式
1、jarsign和apksign工具
jarsign —— 是Java本身自帶的一個工具,可以對jar進行簽名。
signapk —— 是專門為Android應用程式apk進行簽名的工具。
二者的簽名演算法沒有什麼區別,主要是簽名時使用的文件不一致。
2、keystore和pk8、x509.pem的區別
jarsian 工具簽名時使用的是keystore文件。Eclipse的Debug包預設使用jarsign工具簽名。
apksign 工具簽名時使用的pk8、x509.pem文件
3、Android中是允許使用多個keystore對apk進行簽名的。
jarsign簽名文件:文件尾碼名是簽名演算法,文件名是keystone別名。
apksign簽名之後的apk中的META-INF寫死了是CERT的名字。
4、apksign簽名
eg: apksign publickey.x509.pem privatekey.pk8 input.apk output.apk
publickey.x509.pem ——包含證書和證書鏈,包含了公鑰和加密演算法;
privatekey.pk8 —— 私鑰
apk中簽名文件:
MANIFEST.MF —— 包含了input.jar所有文件內容的摘要值
CERT.SF —— 保存MANIFEST.MF 的摘要值以及MANIFEST.MF中每一個摘要項的SHA1並base64後記錄。
CERT.RSA —— 保存了簽名和公鑰證書。簽名用到的摘要信息就是CERT.SF內容。
最終保存在CERT.RSA中的是CERT.SF的數字簽名,簽名使用privateKey生成,簽名演算法會在publicKey中定義,同時會把publicKey保存在CERT.RSA中,即CERT.RSA包含了簽名和簽名用到的證書,且證書要求是自簽名的。
5、系統預設debug.keystore
(1)預設debug.keystore信息如下:
Keystore name: “debug.keystore”
Keystore password: “android”
Key alias: “androiddebugkey”
Key password: “android”
CN: “CN=Android Debug,O=Android,C=US”
(2)使用自帶debug.keystore重新簽名APK文件。
jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore debug.keystore -storepass android -keypass android xxx.apk androiddebugkey
JDK 1.7,需要加上:-digestalg SHA1 -sigalg MD5withRSA
6、查看簽名信息
查看keystore信息:keytool -list -keystore xxx.keystore -alias xxx -v
查看keystore公鑰證書信息: keytool -list -keystore xxx.keystore -alias xxx -rfc
查看apk簽名信息:jarsigner -verify -verbose -certs xxx.apk