apk簽名作用:
在Android 系統(tǒng)中,所有安裝 到 系統(tǒng)的應(yīng)用程序都必有一個(gè)數(shù)字證書,此數(shù)字證書用于標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,如果一個(gè) permission的protectionLevel為signature,那么就只有那些跟該permission所在的程序擁有同一個(gè)數(shù)字證書的應(yīng) 用程序才能取得該權(quán)限。Android使用Java的數(shù)字證書相關(guān)的機(jī)制來 給apk加蓋數(shù)字證書,要理解android的數(shù)字證書,需要先了解以下數(shù)字證書的概念和java的數(shù)字證書機(jī)制。Android系統(tǒng)要求每一個(gè)安裝進(jìn)系 統(tǒng)的應(yīng)用程序都是經(jīng)過數(shù)字證書簽名的,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中。Android將數(shù)字證書用來標(biāo)識(shí)應(yīng)用程序的作者和在應(yīng)用程序之間建立信 任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。這個(gè)數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機(jī)構(gòu)認(rèn)證,它只是用來讓應(yīng)用程序包自我認(rèn)證的;也是用來判斷該應(yīng)用是否被別人破解,二次打包的一個(gè)標(biāo)準(zhǔn),但是簽名并不能防止被破解。 Android數(shù)字證書包含以下幾個(gè)要點(diǎn): (1)所有的應(yīng)用程序都必須有數(shù)字證書 ,Android系統(tǒng)不會(huì)安裝一個(gè)沒有數(shù)字證書的應(yīng)用程序; (2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個(gè)權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證; (3)如果要正式發(fā)布 一個(gè)Android ,必須使用一個(gè)合適的私鑰生成的數(shù)字證書來給程序簽名 ,而不能使用adt插件 或者ant工具 生成的調(diào)試證書來發(fā)布。 (4)數(shù)字證書都是有有效期 的,Android只是在應(yīng)用程序安裝的時(shí)候才會(huì)檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會(huì)影響程序的正常功能。 (5)Android使用標(biāo)準(zhǔn)的java工具 Keytool and Jarsigner 來生成數(shù)字證書,并給應(yīng)用程序包簽名。 (6)使用zipalign 優(yōu)化 程序。 簽名原理: Android系統(tǒng)簽名主要有ROM簽名和應(yīng)用程序APK簽名兩種形式。ROM簽名是針對(duì)已經(jīng)生成的Android系統(tǒng)ROM包進(jìn)行簽名。應(yīng)用程序APK簽名是針對(duì)開發(fā)者開發(fā)的應(yīng)用程序安裝包APK進(jìn)行簽名。前者是對(duì)整個(gè)Android系統(tǒng)包簽名,后者只對(duì)Android系統(tǒng)中一個(gè)應(yīng)用程序APK簽名。 Android 應(yīng)用程序APK是jar包,簽名采用的工具是signapk.jar包,對(duì)應(yīng)用程序安裝包簽名的執(zhí)行命令如下: java -jar signapk.jar publickey privatekey input.apk output.apk 此命令實(shí)現(xiàn)了對(duì)應(yīng)用程序安裝包input.apk簽名的功能。在signapk.jar命令中,第一個(gè)參數(shù)為公鑰publickey,第二個(gè)參數(shù)為私鑰privatekey,第三個(gè)參數(shù)為輸入的包名,第四個(gè)參數(shù)簽名后生成的輸出包名。在此命令中,signapk.jar使用公鑰publickey和私鑰privatekey對(duì)input.apk安裝包進(jìn)行簽名,生成output.apk包。signapk源碼位于build/tools/signapk/SignApk.java中。 完成簽名后APK包中多了一個(gè)META-INF文件夾,其中有名為MANIFEST.MF、CERT.SF和CERT.RSA的三個(gè)文件。MANIFEST.MF文件中包含很多APK包信息,如manifest文件版本、簽名版本、應(yīng)用程序相關(guān)屬性、簽名相關(guān)屬性等。CERT.SF是明文的簽名證書,通過采用私鑰進(jìn)行簽名得到。CERT.RSA是密文的簽名證書,通過公鑰生成的。MANIFEST.MF、CERT.SF和CERT.RSA三個(gè)文件所使用的公鑰和私鑰的生成可以通過 development/tools/make_key 來獲得。下面分別介紹MANIFEST.MF、CERT.SF和CERT.RSA三個(gè)文件的生成方法。 (1)生成MANIFEST.MF文件 生成MANIFEST.MF是對(duì)APK包中所有未簽名文件逐個(gè)用算法SHA1進(jìn)行數(shù)字簽名,再對(duì)數(shù)字簽名信息采用Base64進(jìn)行編碼,最后將編完碼的簽名寫入MANIFEST.MF文件中。添加數(shù)字簽名到manifest文件通過調(diào)用addDigestsToManifest方法實(shí)現(xiàn),具體代碼如下: (簡(jiǎn)言之:MANIFESt.MF 文件中的內(nèi)容就是通過遍歷apk中所有文件(entry),逐一生成SHA-1數(shù)字簽名,然后通過Base64編碼轉(zhuǎn)碼)
需要說明,生成MANIFEST.MF使用了SHA1算法進(jìn)行數(shù)字簽名,SHA1是一種Hash算法,兩個(gè)不同的信息經(jīng)Hash運(yùn)算后不會(huì)產(chǎn)生同樣的信息摘要,由于SHA1是單向的,所以不可能從消息摘要中復(fù)原原文。如果惡意程序改變了APK包中的文件,那么在進(jìn)行APK安裝校驗(yàn)時(shí),改變后的摘要信息與MANIFEST.MF的檢驗(yàn)信息不同,應(yīng)用程序便不能安裝成功。 (2)生成CERT.SF文件 在生成MANIFEST.MF文件之后,用SHA1-RSA算法對(duì)其進(jìn)行私鑰簽名(使用SHA1-RSA算法,用私鑰對(duì)MANIFEST.MF摘要文件簽名,并對(duì)其中每個(gè)文件摘要簽名),便生成CERT.SF。具體代碼如下:
RSA是目前最有影響力的公鑰加密算法,是一種非對(duì)稱加密算法、能夠同時(shí)用于加密和數(shù)字簽名。由于RSA是非對(duì)稱加密算法,因此用私鑰對(duì)生成MANIFEST.MF的數(shù)字簽名加密后,在APK安裝時(shí)只能使用公鑰才能解密它。 (3)生成CERT.RSA文件 生成CERT.RSA文件與生成CERT.SF文件不同之處在于,生成CERT.RSA文件使用了公鑰文件。CERT.RSA文件中保存了公鑰以及所用的采用加密算法等信息。具體代碼如下:
通過以上對(duì)Android應(yīng)用程序簽名的代碼分析,可以看出Android系統(tǒng)通過對(duì)第三方APK包進(jìn)行簽名,達(dá)到保護(hù)系統(tǒng)安全的目的。應(yīng)用程序簽名主要用于對(duì)開發(fā)者身份進(jìn)行識(shí)別,達(dá)到防范惡意攻擊的目的,但不能有效地限制應(yīng)用程序被惡意修改,只能夠檢測(cè)應(yīng)用程序是否被修改過,如果應(yīng)用程序被修改應(yīng)該再采取相應(yīng)的應(yīng)對(duì)措施。 |
|