APK簽名原理以及方法
1、簽名機制
Android系統在安裝APK的時候,首先會檢查APK的簽名,如果發現簽名檔案不存在或校驗簽名失敗,則會拒絕安裝,所以應用程式在釋出之前一定要進行簽名,給APK簽名可以帶來以下好處:
① 應用程序升級:如果想無縫升級一個應用,Android系統要求應用程式的新版本與老版本具有相同的簽名和包名,若包名相同而簽名不同,系統會拒絕安裝新版應用;
② 應用程式模組化:Android系統可以允許同一個證書籤名的多個應用程式在一個進行裡執行,此時就可以把我們的應用程式以模組的方式進行部署而使用者可以獨立的升級其中的一個模組;
③ 程式碼或資料共享:Android提供了基於簽名的許可權機制,一個應用可以為另一個以相同證書籤名的應用程式公開自己的功能與資料,同時其他具有不同簽名的應用程式不可以訪問相應的功能與資料;
④ 應用程式的可認定性:簽名信息中包含有開發者資訊,在一定程度上可以防止應用被偽造;
釋出過Android應用的朋友們應該都知道,Android APK的釋出是需要簽名的。簽名機制在Android應用和框架中有著十分重要的作用。
例如,Android系統禁止更新安裝簽名不一致的APK;如果應用需要使用system許可權,必須保證APK簽名與Framework簽名一致,等等。在《APK Crack》一文中,我們瞭解到,要破解一個APK,必然需要重新對APK進行簽名。而這個簽名,一般情況無法再與APK原先的簽名保持一致。(除非APK原作者的私鑰洩漏,那已經是另一個層次的軟體安全問題了。)
簡單地說,簽名機制標明瞭
遍歷APK檔案中所有檔案,對非資料夾、非簽名檔案逐個生成SHA1的數字簽名信息並進行Base64編碼,然後把生成的簽名寫入MANIFEST.MF檔案
對生成的MANIFEST.MF檔案,使用SHA1-RSA演算法,使用私鑰進行簽名來生成CERT.SF檔案
(RSA是一種非對稱加密演算法,使用私鑰通過RSA演算法對資訊進行加密,在安裝時只能使用公鑰才能解密,解密之後,將它與未加密的資訊進行對比,如果相符,則表明內容沒有被異常修改)
由於生成
那麼我們猜測到CERT.RSA檔案中儲存了公鑰、所採用的加密演算法等資訊
不同私鑰簽名的APK檔案中的公鑰是不相同的,所以可以根據公鑰的對比來判斷私鑰是否一致,個人認為主要有以下三種場景:
1、程式自檢測。在程式執行時,自我進行簽名比對。比對樣本可以存放在APK包內,也可存放於雲端。缺點是程式被破解時,自檢測功能同樣可能遭到破壞,使其失效。
2、可信賴的第三方檢測。由可信賴的第三方程式負責APK的軟體安全問題。對比樣本由第三方收集,放在雲端。這種方式適用於防毒安全軟體或者 APP Market之類的軟體下載市場。缺點是需要聯網檢測,在無網路情況下無法實現功能。(不可能把大量的簽名資料放在移動裝置本地)。
3、系統限定安裝。這就涉及到改Android系統了。限定僅能安裝某些證書的APK。軟體釋出商需要向系統釋出上申請證書。如果發現問題,能追蹤到是哪個軟體釋出商的責任。適用於系統提供商或者終端產品生產商。缺點是過於封閉,不利於系統的開放性。
以上三種場景,雖然各有缺點,但缺點並不是不能克服的。例如,我們可以考慮程式自檢測的功能用native method的方法實現等等。軟體安全是一個複雜的課題,往往需要多種技術聯合使用,才能更好的保障軟體不被惡意破壞。
4、參考資訊