android digest 认证,探究 Android 签名机制和原理
背景
最近在調(diào)研一個(gè)測試工具的使用,在使用中發(fā)現(xiàn)被測試工具處理過的apk文件經(jīng)安裝后打開就會崩潰,分析崩潰日志后原因是簽名不一致導(dǎo)致的。
說到Android中的簽名,可能大家都知道簽名的目的就是為了保護(hù)apk文件的安全,如果apk被惡意篡改后經(jīng)過安裝校驗(yàn)的時(shí)候,就會出現(xiàn)校驗(yàn)失敗,導(dǎo)致安裝包安裝失敗的情況。但如果更深去問一下Android簽名機(jī)制和原理,是不是就被問住了?接下來的就讓我們?nèi)ヌ骄緼ndroid簽名機(jī)制和原理。
Android 簽名機(jī)制和原理
Android系統(tǒng)在安裝APK的時(shí)候,首先會檢驗(yàn)APK的簽名,如果發(fā)現(xiàn)簽名文件不存在或者校驗(yàn)簽名失敗,則會拒絕安裝,所以應(yīng)用程序在發(fā)布之前一定要進(jìn)行簽名。給APK簽名可以帶來以下好處:
應(yīng)用程序升級如果想無縫升級一個(gè)應(yīng)用,Android系統(tǒng)要求應(yīng)用程序的新版本與老版本具有相同的簽名與包名。若包名相同而簽名不同,系統(tǒng)會拒絕安裝新版應(yīng)用。
應(yīng)用程序模塊化Android系統(tǒng)可以允許同一個(gè)證書簽名的多個(gè)應(yīng)用程序在一個(gè)進(jìn)程里運(yùn)行,系統(tǒng)實(shí)際把他們作為一個(gè)單個(gè)的應(yīng)用程序。此時(shí)就可以把我們的應(yīng)用程序以模塊的方式進(jìn)行部署,而用戶可以獨(dú)立的升級其中的一個(gè)模塊。
代碼或數(shù)據(jù)共享Android提供了基于簽名的權(quán)限機(jī)制,一個(gè)應(yīng)用程序可以為另一個(gè)以相同證書簽名的應(yīng)用程序公開自己的功能與數(shù)據(jù),同時(shí)其它具有不同簽名的應(yīng)用程序不可訪問相應(yīng)的功能與數(shù)據(jù)。
應(yīng)用程序的可認(rèn)定性簽名信息中包含有開發(fā)者信息,在一定程度上可以防止應(yīng)用被偽造。例如網(wǎng)易云加密對Android APK加殼保護(hù)中使用的“校驗(yàn)簽名(防二次打包)”功能就是利用了這一點(diǎn)。
簽名的目的:
1. 對發(fā)送者的身份認(rèn)證:
由于開發(fā)商可能通過使用相同的package name來混淆替換已經(jīng)安裝的程序,以此保證簽名不同的包不被替換。
2. 保證信息傳輸?shù)耐瓿尚?#xff1a;
簽名對于包中的每個(gè)文件進(jìn)行處理,以此確保包中內(nèi)容不被替換。
3. 防止交易中的抵賴發(fā)生,market對軟件的要求。
簽名原理:
簡單來說總體分為以下幾個(gè)步驟:
1. 對Apk中的每個(gè)文件做一次算法(數(shù)據(jù)摘要+Base64編碼),保存到MAINFEST.MF
2. 對MAINFEST.MF整個(gè)文件做一次算法(數(shù)據(jù)摘要+B阿瑟64編碼),存放到CERT.SF文件的頭屬性中,在對MAINFEST.MF文件中各個(gè)屬性塊做一次算法(數(shù)據(jù)摘要+Base64編碼),存放到一個(gè)屬性塊中。
3. 對CERT.SF文件做簽名,內(nèi)容存檔到CERT.RSA中
對一個(gè)APK文件簽名之后,APK文件根目錄下會增加META-INF目錄,該目錄下增加三個(gè)文件,分別是:MANIFEST.MF、CERT.SF和CERT.RSA,以下是具體的流程:
MANIFEST.MF
這是摘要文件,文件中保存了APK里面所有文件的SHA1校驗(yàn)值的BASE64編碼,格式如下(一個(gè)文件對應(yīng)一條記錄)。如果改變了APK包中的文件,在apk安裝校驗(yàn)時(shí),改變后的文件摘要信息與 MANIFEST.MF 的檢驗(yàn)信息不同,程序就不會安裝成功。假如攻擊者修改了程序的內(nèi)容,又重新生成了新的摘要,就可以通過驗(yàn)證。
Name: AndroidMainfest.xmlSHA1-Digest: incCj47jcu56R8pKV8dLACZBKD8=Name: META-INF/android.arch.core_runtime.versionSHA1-Digest: BeF7ZGqBckDCBhhvlPj0xwl01dw=
CERT.SF
這是對摘要的簽名文件,對前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用開發(fā)者的私鑰進(jìn)行簽名。在安裝時(shí)只能使用公鑰才能進(jìn)行解密。解密之后,與未加密的MANIFEST.MF進(jìn)行對比,如果相符,則表明內(nèi)容沒有被異常修改。如果在這一步,開發(fā)者修改了程序內(nèi)容,并生成了新的摘要文件,但是攻擊者沒有開發(fā)者的私鑰,所以不能生成正確的簽名文件。系統(tǒng)在對程序進(jìn)行驗(yàn)證的時(shí)候,用開發(fā)者公鑰對不正確的簽名文件進(jìn)行解密,得到的結(jié)果和摘要文件對應(yīng)不起來,導(dǎo)致不能通過檢驗(yàn),不能成功安裝文件。文件格式如下:
Name:?AndroidMainfest.xmlSHA1-Digest:?SyFsd2VUpCg4nq8jSOB7dBwuMyI=Name:?META-INF/android.arch.core_runtime.versionSHA1-Digest:?OPQCkzMXJVPQryHeMowVNZmfRMw=
CERT.RSA
該文件中保存了公鑰、所采用的加密算法等信息。
從上面的內(nèi)容來看,Android系統(tǒng)就是根據(jù)這三個(gè)文件的內(nèi)容對APK文件進(jìn)行簽名檢驗(yàn)的。
總結(jié)
以上是生活随笔為你收集整理的android digest 认证,探究 Android 签名机制和原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贷款自己要打征信么
- 下一篇: android sina oauth2.