apk签名验证机制
聲明:
1.本帖轉(zhuǎn)載自:http://riusksk.blogbus.com/logs/272154406.html,僅供自用,勿噴
2.歡迎交流學(xué)習(xí)
簽名后的APK,在/META-INF目錄下會(huì)生成以下3個(gè)文件:
MANIFEST.MF:保存除META-INF文件以外其它各文件的SHA-1+base64編碼后的值。
?
CERT.SF:在SHA1-Digest-Manifest中保存MANIFEST.MF文件的SHA-1+base64編碼后的值,在后面的各項(xiàng)SHA1-Digest中保存MANIFEST.MF各子項(xiàng)內(nèi)容SHA-1+Base64編碼后的值
CERT.RSA/DSA/EC:保存用私鑰計(jì)算出CERT.SF文件的數(shù)字簽名、證書(shū)發(fā)布機(jī)構(gòu)、有效期、公鑰、所有者、簽名算法等信息
Android應(yīng)用簽名驗(yàn)證過(guò)程中,滿(mǎn)足以下條件才能安裝應(yīng)用:
?
1、SHA-1(除META-INF目錄外的文件)? ==? MANIFEST.MF中的各SHA-1值;
2、(SHA-1 + Base64)(MANIFEST.MF文件及各子項(xiàng)) ==? CERT.SF中各值
3、公鑰(CERT.SF) == CERT.RSA/DSA對(duì)SF文件的簽名
?
Android 中關(guān)于簽名驗(yàn)證相關(guān)源碼分析:
?關(guān)鍵源碼主要位于:
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后綴的簽名證書(shū)文件,然后調(diào)用verifyCertificate進(jìn)行難,此處并無(wú)限制文件名,因此將CERT.RSA改成CERT123.RSA依然有效,但SF文件得跟RSA文件等簽名證書(shū)文件同名:
2、讀取SF(與后面證書(shū)同名)與RSA/DSA/EC文件的內(nèi)容,再調(diào)用verifySignature進(jìn)行校驗(yàn):
3、在verifySignature進(jìn)行校驗(yàn)時(shí)會(huì)去讀取各項(xiàng)證書(shū)信息,包括證書(shū)序列號(hào)、擁有者、加密算法等等,然后判斷CERT.RSA證書(shū)對(duì)CERT.SF的文件簽名是否正確,防止CERT.SF被篡改,若成功則返回證書(shū)鏈,否則拋出異常:
4、在返回證書(shū)鏈時(shí),對(duì)于自簽名證書(shū),則直接作為合法證書(shū)返回
5、繼續(xù)回到verifyCertificate函數(shù),它會(huì)校驗(yàn)SF文件中的MANIFEST.MF中各項(xiàng)Hash值是否正確,防止MF文件被篡改:
6、對(duì)于非系統(tǒng)應(yīng)用,去枚舉除META-INF目錄以外的所有文件,然后進(jìn)行哈希運(yùn)算,并將其與MANIFEST.MF中的各文件哈希值進(jìn)行比對(duì),只有相匹配后才允許安裝應(yīng)用:
?
轉(zhuǎn)載于:https://www.cnblogs.com/JianXu/p/5158413.html
總結(jié)