rainbow-android-app

应用安全

  1. 应用防劫持

    防止使用云助理过程中,不可信的第三方应用自启动让用户误以为仍在操作云助理。

    • 在Activity onStop()时获取系统当前前台进程,判断是否可信,若不可信则Toast提醒用户:

      ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
      List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();
      for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessInfos) {
        if (appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            for (String trustedPackage : trustedPackages) {
                if (trustedPackage.equalsIgnoreCase(appProcessInfo.processName)) {
                    trusted = true;
                    break;
                }
            }
            break;
        }
      }
      
      if (!trusted) { DialogUtil.toast(activity.getResources().getString(R.string.on_pause_tip));
      } else {
        trusted = false;
      }
      
    • 在应用使用过程中有时需要打开如相机、文件选择器等时,也不希望toast打扰用户,但这些应用报名因机而已,因此不去进行检查。

      注:其中可信进程经过研究暂定以下几个:

      • 系统进程:android,com.android.systemui,system,com.android.phone
      • 微信:com.tencent.mm
  2. 异地登陆提醒

    在账号已登陆的情况下,若同一账号在另一台设备登录时,通知前一台设备“账号在另一台设备登录”,以提醒用户注意。

  3. APK签名校验

    为防止APK被重签名,在应用启动时进行了签名校验步骤。

    • 获取当前签名信息

      private static Signature[] getSign(Context context) {
        PackageManager pm = context.getPackageManager();
        List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
        for (PackageInfo packageinfo : apps) {
            String packageName = packageinfo.packageName;
      
            if (packageName.equals(context.getPackageName())) {
                return packageinfo.signatures;
            }
        }
        return null;
      }
      
    • 获取签名MD5值

      private static String getMD5(Signature sig) {
        byte[] hexBytes = sig.toByteArray();
        byte[] md5digest = DigestUtils.md5Digest(hexBytes);
      
        StringBuilder sb = new StringBuilder();
        for (byte aMd5digest : md5digest) {
            sb.append((Integer.toHexString((aMd5digest & 0xFF) | 0x100)).substring(1, 3));
        }
        return sb.toString();
      }
      
    • 与合法值比较

      若不同则Toast提示用户,并退出应用。