2016-09-19 9 views
3

私は漏れてはならない機密データ(暗号化キー)を含むアプリを開発中です。私はクラウドにキーを格納することはできませんので、アプリケーションはいつでもオフラインで作業することができるはずです。Androidルートが検出されましたか?すぐにアプリをアンインストールする

ユーザがrootedデバイスを持っている場合、apkを抽出してキーを取得できます。私はこれを防止したい。

root権限が検出されたら、すぐにユーザーの確認なしにアプリをアンインストールする方法はありますか?

(それとも??漏れてキーを防止するための別のアプローチがあります)

私は、データを暗号化し、rootアクセスを検出するために、ハードウェアのビットを使用していますサムスンノックスを見て、撮影した、とのアプリを作るています一度デバイスが改ざんされるとデータにアクセスできなくなります。それはうまく動作しますが、私は広範なデバイス(サムスンデバイスだけでなく)で動作するソリューションを探しています。

+0

「ユーザーが根付いデバイスを持っているとき、彼はAPKを抽出し、キーを取得することができます」:様々な方法がありますが、ここであなたが始めるのに役立つものです。 "ユーザーの確認なしにすぐにアプリをアンインストールする方法はありますか?" - いいえ。 – CommonsWare

+0

@CommonsWareルート以外のデバイスがapkをどのように抽出するのですか? –

+0

APKファイルはAndroidで世界中で読み取り可能です。アプリはAPKファイルをデバイスから取り出すことができます。また、私は近年これを行う必要はありませんでしたが、APLファイルをデバイスから取り出すためには、少なくとも「adb pull」を使用することは可能でした。 – CommonsWare

答えて

0

編集:保存しようとしているもの(暗号化キー用の記憶領域を保存するなど)はあまり簡単ではありません。あなたはread thisでなければなりません。あなたのアプリをアンインストールする

、あなたは(テストしていません!)、これを試みることができること:それは検出をrootになると

Uri packageURI = Uri.parse("package:"+MyMainActivity.class.getPackage().getName()); 
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 
startActivity(uninstallIntent); 

、単に「最良」の解決策はありません。これはルートを必要としない -

/** @author Kevin Kowalewski */ 
public class RootUtil { 
    public static boolean isDeviceRooted() { 
     return checkRootMethod1() || checkRootMethod2() || checkRootMethod3(); 
    } 

    private static boolean checkRootMethod1() { 
     String buildTags = android.os.Build.TAGS; 
     return buildTags != null && buildTags.contains("test-keys"); 
    } 

    private static boolean checkRootMethod2() { 
     String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su", 
       "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"}; 
     for (String path : paths) { 
      if (new File(path).exists()) return true; 
     } 
     return false; 
    } 

    private static boolean checkRootMethod3() { 
     Process process = null; 
     try { 
      process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" }); 
      BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      if (in.readLine() != null) return true; 
      return false; 
     } catch (Throwable t) { 
      return false; 
     } finally { 
      if (process != null) process.destroy(); 
     } 
    } 
} 
+0

アンインストール・パートはダイアログを開いて、ユーザーに確認を求めます。質問に記載されているように、私はユーザーの確認なしに、私のアプリを強制的にアンインストールしたい。 –

+0

サードパーティのアプリケーションでは不可能です:( あなたはroot権限を持っていません; D lol – jdstaerk

+0

「ルート権限を持っていない」とはどういう意味ですか? –

関連する問題