關於在安卓apk中增加官方簽名校驗的說明
阿新 • • 發佈:2018-11-12
眾所周知,安卓apk的釋出,是需要經過簽名這一道程式的。
另外,要破解一個APK,必然需要重新對APK進行簽名。而這個簽名,一般情況無法再與APK原先的簽名保持一致。(除非APK原作者的私鑰洩漏,那已經是另一個層次的軟體安全問題了。)簽名機制標明瞭APK的發行機構。因此,站在軟體安全的角度,我們就可以通過比對APK的簽名情況,判斷此APK是否由“官方”發行,而不是被破解篡改過重新簽名打包的“盜版軟體”。
APK簽名比對的應用場景
經過以上的論述,想必大家已經明白簽名比對的原理和我的實現方式了。那麼什麼時候什麼情況適合使用簽名對比來保障Android APK的軟體安全呢?
個人認為主要有以下三種場景:
1、 程式自檢測。在程式執行時,自我進行簽名比對。比對樣本可以存放在APK包內,也可存放於雲端。缺點是程式被破解時,自檢測功能同樣可能遭到破壞,使其失效。
2、 可信賴的第三方檢測。由可信賴的第三方程式負責APK的軟體安全問題。對比樣本由第三方收集,放在雲端。這種方式適用於防毒安全軟體或者APP Market之類的軟體下載市場。缺點是需要聯網檢測,在無網路情況下無法實現功能。(不可能把大量的簽名資料放在移動裝置本地)。
3、 系統限定安裝。這就涉及到改Android系統了。限定僅能安裝某些證書的APK。軟體釋出商需要向系統釋出上申請證書。如果發現問題,能追蹤到是哪個軟體釋出商的責任。
以上三種場景,雖然各有缺點,但缺點並不是不能克服的。例如,我們可以考慮程式自檢測的功能用native method的方法實現等等。軟體安全是一個複雜的課題,往往需要多種技術聯合使用,才能更好的保障軟體不被惡意破壞。
校驗的具體實現:
1、獲取apk中的資訊。
X509Certificate certificate = getCertificate();
String pubKey = certificate.getPublicKey().toString();String signNumber = certificate.getSerialNumber().toString(); String subjectDN = certificate.getSubjectDN().toString();
2、使用jni本地庫校驗,防止關鍵資訊洩漏
Native.isSignValid(modulus, signNumber, subjectDN);
3、構建so庫與遠端aar依賴
具體的就是這樣,有問題請留言。