1. 程式人生 > >關於在安卓apk中增加官方簽名校驗的說明

關於在安卓apk中增加官方簽名校驗的說明


眾所周知,安卓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依賴

 
具體的就是這樣,有問題請留言。