国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android APK安全性校驗

2019-11-09 18:06:15
字體:
來源:轉載
供稿:網友

APK安全性校驗


獲取簽名證書keystore的SHA1值和完整性校驗獲取的classes.dex的SHA-1哈希值字符串

建議后臺保存初始值與前端獲取sha1值做判斷是否可以進行下一步操作

1. 簽名證書文件校驗碼

獲取簽名證書的SHA1值

public static String getSign(Context ctx) { try { PackageInfo packageInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signs = packageInfo.signatures; Signature sign = signs[0]; MessageDigest md1 = MessageDigest.getInstance("md5"); md1.update(sign.toByteArray()); byte[] digest = md1.digest(); String res = toHexString(digest); MessageDigest md2 = MessageDigest.getInstance("SHA1"); md2.update(sign.toByteArray()); byte[] digest2 = md2.digest(); String res2 = toHexString(digest2); return res2; } catch (Exception e) { e.PRintStackTrace(); return ""; } }

2. 完整性校驗

對簽名文件中classes.dex哈希值的校驗

Android工程代碼經編譯打包生成apk包后,開發者需要對其簽名才能在安卓市場上發布供用戶下載和安裝。對apk包簽名后,會在原apk包結構基礎上加入META-INF文件目錄。

META-INF文件目錄下含有三個文件:MANIFEST.MF文件、ANDROIDD.SF文件、ANDROIDD.RSA文件,META_INF目錄文件結構如下圖所示:

其中,MANIFEST.MF文件描述了在簽名時,簽名工具對apk包中各個文件摘要計算后的哈希值,并對哈希值做了Base64編碼。MANIFEST.MF文件中描述的classes.dex文件的SHA-1哈希值如下圖所示:

一旦攻擊者對APK中反編譯并篡改代碼,經二次打包簽名后的classes.dex文件的SHA-1必定改變,因此,我們可以將該文件中的classes.dex文件的SHA-1哈希值保存起來作為校驗對比值,應用程序啟動時讀取apk安裝包中的MANIFEST.MF文件,解析出classes.dex的SHA-1哈希值,然后與原SHA-1哈希值進行比較,判斷此APK包代碼文件是否被篡改。 通過檢查簽名文件classes.dex文件的哈希值來判斷代碼文件是否被篡改的java實現代碼如下所示:

通過檢查簽名文件classes.dex文件的哈希值來判斷代碼文件是否被篡改 @param orginalSHA 原始Apk包的SHA-1值

“`

public static void apkVerifyWithSHA(Context context, String baseSHA) { String apkPath = context.getPackageCodePath(); // 獲取Apk包存儲路徑 try { MessageDigest dexDigest = MessageDigest.getInstance("SHA-1"); byte[] bytes = new byte[1024]; int byteCount; FileInputStream fis = new FileInputStream(new File(apkPath)); // 讀取apk文件 while ((byteCount = fis.read(bytes)) != -1) { dexDigest.update(bytes, 0, byteCount); } BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 計算apk文件的哈希值 String sha = bigInteger.toString(16); fis.close(); if (!sha.equals(baseSHA)) { // 將得到的哈希值與原始的哈希值進行比較校驗 Process.killProcess(Process.myPid()); // 驗證失敗則退出程序 } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

“`

. 有問題歡迎學習交流,私信留言,共同學習


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 富民县| 雷山县| 金川县| 宜章县| 庆云县| 安溪县| 江都市| 永城市| 莱阳市| 平原县| 曲水县| 绥芬河市| 胶州市| 郑州市| 无极县| 广西| 德令哈市| 建平县| 彭泽县| 美姑县| 玉屏| 宁乡县| 台山市| 成武县| 滦南县| 长丰县| 甘南县| 青川县| 平定县| 龙岩市| 汝城县| 嘉峪关市| 金平| 阳泉市| 盐源县| 合肥市| 德昌县| 台东县| 托里县| 昌邑市| 乐平市|