軟件測試 | 應(yīng)用程序簽名機制實現(xiàn)的源代碼分析
Android采用簽名機制來保護應(yīng)用程序的安全,以便于開發(fā)者進行身份鑒別,防止替換應(yīng)用程序包和篡改內(nèi)容。同時有助于在應(yīng)用程序之間建立一種信任,可以由同一個私鑰簽名的若干個應(yīng)用程序共享代碼和數(shù)據(jù)。
Android系統(tǒng)簽名主要有ROM簽名和應(yīng)用程序APk簽名兩種形式。ROM簽名是針對已經(jīng)生成的Android系統(tǒng)ROM包進行簽名。應(yīng)用程序APK簽名是針對開發(fā)者開發(fā)的應(yīng)用程序安裝包APK進行簽名。前者是對整個Android系統(tǒng)包簽名,后者只對Android系統(tǒng)中一個應(yīng)用程序APK簽名。這里僅對APK簽名的執(zhí)行過程進行代碼層面的分析,流程如圖所示。

Android應(yīng)用程序APK是jar包,簽名采用的工具是signapk.jar包,對應(yīng)用程序安裝包簽名的執(zhí)行命令如下:
此命令實現(xiàn)了對應(yīng)用程序安裝包input.apk簽名的功能。在signapk.jar命令中,第一個參數(shù)為公鑰publickey,第二個參數(shù)為私鑰privatekey,第三個參數(shù)為輸入的報名,第四個參數(shù)簽名后生成的輸入包名。在此命令中,signapk.jar使用公鑰publickey和私鑰privatekey對input.apk安裝包進行簽名,生成output.apk包。signapk源碼位于build/tools/signapk/SignApk.java中。
完成簽名后APK包中多了一個META-INF文件夾,其中有名為MANIFEST.MF、CERT.SF和CERT.RSA的三個文件。MANIFEST.MF文件中包含很多APK包信息,如manifest文件版本、簽名版本、應(yīng)用程序相關(guān)屬性、簽名相關(guān)屬性等。CERT.SF是明文的簽名證書,通過采用私鑰進行簽名得到。CERT.RST是密文的簽名證書,通過公鑰生成的。MANIFEST.MF、CERT.SF和CERT.RSA三個文件所使用的公鑰和私鑰的生成可以通過development/tools/make_key來獲得。下面分被介紹MANIFEST.MF、CERT.SR和CERT.RSA三個文件生成方法。
(1)生成MANIFEST.MF文件
生成MANIFEST.MF是對APK包中所有未簽名文件逐個用算法SHA1進行數(shù)字簽名,再對數(shù)字簽名信息采用Base64進行編碼,最后將編完碼的簽名寫MANIFEST.MFWEN文件中。添加數(shù)字簽名到manifest文件通過調(diào)用addDigestsToManifest方法實現(xiàn),具體代碼如下:
需要說明,生成MANIFEST.MF使用SHA1算法進行數(shù)字簽名,SHA1是一種Hash算法,兩個不同的信息經(jīng)Hash運算后不回產(chǎn)生同樣的信息摘要,由于SHA1是單向的,所以不可能從消息摘要中復(fù)原原文。如果惡意程序改變了APK包中的文件,那么在進行APK安裝校驗時,改變后的摘要信息與MANIFEST.MF的檢驗信息不同,應(yīng)用程序便不能安裝成功。
(2)生成CETR.SF文件
在生成MANIFEST.MF文件之后,用SHA1-RSA算法對其進行私鑰簽名,便生成CERT.SF。具體代碼如下:
RSA是目前最有影響力的公鑰加密算法,是一種非對稱加密算法、能夠同時用于加密和數(shù)字簽字。由于RAS是對非對稱加密算法,因此用私鑰對生成MANIFEST.MF的數(shù)字簽名加密后,在APK安裝時只能使用公鑰才能解密它。
(3)生成CERT.RSA文件
生成CERT.RSA文件與生成CERT.SF文件不同之處在于,生成CERT.RSA文件使用了公鑰文件。CERT.RSA文件中保存了公鑰以及所用的采用加密算法等信息。具體代碼如下:
通過以上對Android應(yīng)用程序簽名的代碼分析,可以看出Android系統(tǒng)通過對第三方APK包進行簽名,達到保護系統(tǒng)安全的目的。應(yīng)用程序簽名只要用于對開發(fā)者身份進行識別,達到防范惡意攻擊的目的,但不能有效地限制應(yīng)用程序被惡意修改,只能夠檢測應(yīng)用程序是否被修改過,如果應(yīng)用程序被修改應(yīng)該再采取相應(yīng)的應(yīng)對措施。
搜索微信公眾號:TestingStudio霍格沃茲的干貨都很硬核