聲明:
1.本帖轉載自:http://riusksk.blogbus.com/logs/272154406.html,僅供自用,勿噴
2.歡迎交流學習
簽名后的APK,在/META-INF目錄下會生成以下3個文件:
MANIFEST.MF:保存除META-INF文件以外其它各文件的SHA-1+base64編碼后的值。
CERT.SF:在SHA1-Digest-Manifest中保存MANIFEST.MF文件的SHA-1+base64編碼后的值,在后面的各項SHA1-Digest中保存MANIFEST.MF各子項內容SHA-1+Base64編碼后的值
CERT.RSA/DSA/EC:保存用私鑰計算出CERT.SF文件的數字簽名、證書發布機構、有效期、公鑰、所有者、簽名算法等信息
Android應用簽名驗證過程中,滿足以下條件才能安裝應用:
1、SHA-1(除META-INF目錄外的文件) == MANIFEST.MF中的各SHA-1值;
2、(SHA-1 + Base64)(MANIFEST.MF文件及各子項) == CERT.SF中各值
3、公鑰(CERT.SF) == CERT.RSA/DSA對SF文件的簽名
Android 中關於簽名驗證相關源碼分析:
關鍵源碼主要位於:
http://code.metager.de/source/xref/android/4.4/frameworks/base/core/java/android/content/pm/PackageParser.java
http://code.metager.de/source/xref/android/4.4/libcore/luni/src/main/java/java/util/jar/JarVerifier.java
1、讀取DSA/RSA/EC后綴的簽名證書文件,然后調用verifyCertificate進行難,此處並無限制文件名,因此將CERT.RSA改成CERT123.RSA依然有效,但SF文件得跟RSA文件等簽名證書文件同名:
2、讀取SF(與后面證書同名)與RSA/DSA/EC文件的內容,再調用verifySignature進行校驗:
3、在verifySignature進行校驗時會去讀取各項證書信息,包括證書序列號、擁有者、加密算法等等,然后判斷CERT.RSA證書對CERT.SF的文件簽名是否正確,防止CERT.SF被篡改,若成功則返回證書鏈,否則拋出異常:
4、在返回證書鏈時,對於自簽名證書,則直接作為合法證書返回
5、繼續回到verifyCertificate函數,它會校驗SF文件中的MANIFEST.MF中各項Hash值是否正確,防止MF文件被篡改:
6、對於非系統應用,去枚舉除META-INF目錄以外的所有文件,然后進行哈希運算,並將其與MANIFEST.MF中的各文件哈希值進行比對,只有相匹配后才允許安裝應用: