Android APKセキュリティチェック


APKセキュリティチェック
署名証明書keystoreのSHA 1値と整合性検査で取得したclassesを取得する.dexのSHA-1ハッシュ値文字列
  • バックグラウンドに初期値とフロントエンド取得sha 1値を保存する次の操作が可能か否かを判断することを提案する
  • .
    1.署名証明書ファイル検証コード
    署名証明書のSHA 1値の取得
      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という3つのファイルがあります.MFファイル、ANDROIDD.SFファイル、ANDROIDD.RSAファイル、META_INFディレクトリのファイル構造は、以下の図の通りである:ここで、MANIFEST.MFファイルは、署名時に、署名ツールがapkパケット内の各ファイルの要約に対して計算したハッシュ値を記述し、ハッシュ値をBase 64符号化する.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();  
        }  
    }  
    

    “`
    .问题があれば勉强交流、私信伝言、共同学习を歓迎します.