Android應用安全防護實踐一自身是否被修改校驗(三)

這個炒雞簡單

demo擼上

	//獲取你重新自身的安裝包位置 一般在/data/app/包名/xxx.apk
    public static String getApkPath(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_META_DATA);
            ApplicationInfo applicationInfo = packageInfo.applicationInfo;
            return applicationInfo.publicSourceDir; // 獲取當前apk包的絕對路徑
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }

	//獲取hash值 整個apk的 注意 這裏代碼不太嚴謹 demo隨便敲的 跑通就行了
    public static String getHash(Context context) {
        MessageDigest msgDigest;
        String apkPath = getApkPath(context);

        FileInputStream fis = null;
        try {
            msgDigest = MessageDigest.getInstance("SHA-1");
            byte[] bytes = new byte[1024];
            int byteCount;
            fis = new FileInputStream(new File(apkPath));
            while ((byteCount = fis.read(bytes)) > 0) {
                msgDigest.update(bytes, 0, byteCount);
            }
            BigInteger bi = new BigInteger(1, msgDigest.digest());
            return bi.toString(16).toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "";
    }

代碼就這些了 每次發佈軟件 簽名後 獲取apk的hash保存到服務器 然後
app通過getHash方法獲取hash和服務器保存的比對 如果不正確就自動退出什麼的 愛咋地咋地

這個校驗可以放到ndk裏面寫 免得被反編譯刪除校驗就沒用了
注意 獲取hash之後不要動apk文件了 不要做任何修改(一鍵打渠道包工具什麼的) 否則會導致apk文件hash改變

如果需要渠道包 可以後臺存多個hash 對應不同的渠道包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章