apk簽名驗證機制


聲明:

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中的各文件哈希值進行比對,只有相匹配后才允許安裝應用:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM