與apk簽名有關的那些概念與命令,apk簽名概念命令
一、概念篇
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