我正在开发一个包含敏感数据(加密密钥)的应用程序,这些数据不应该泄露。该应用程序应该能够在任何时候脱机工作,所以我不能在云中存储密钥。
当用户有一个扎根的设备时,他可以提取apk并获得密钥。我想阻止这一切。
一旦检测到根用户访问权限,有没有办法在没有用户确认的情况下立即强制卸载我的应用程序?
(或者是否有其他方法防止钥匙泄漏??)
我看了一下Samsung Knox,它对数据进行加密,并使用一个硬件位检测根访问,一旦设备被篡改,应用程序和数据就无法访问。它工作得非常好,但我正在寻找一种适用于更广泛设备(不仅仅是三星设备)的解决方案。
我认为立即卸载应用程序不是解决方案,你必须找出根目录在哪里,并小心magisk管理器应用程序,可以绕过根检测,你可以尝试使用Rootbeer根检测,根工具,或创建根类
//root example you can call this class.
public static boolean findBinary(String binaryName) {
boolean found = false;
if (!found) {
String[] places = { "/sbin/", "/system/bin/", "/system/xbin/",
"/data/local/xbin/", "/data/local/bin/",
"/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/",
"/system/app/Superuser.apk", "/sbin/su", "/sbin/su/", "/system/bin/su","/system/bin/su/",
"/system/xbin/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", "/su/",
"/data/local/xbin/",
"/system/bin/.ext/",
"/system/bin/failsafe/",
"/system/sd/xbin/",
"/su/xbin/",
"/su/bin/",
"/magisk/.core/bin/",
"/system/usr/we-need-root/",
"/system/xbin/",
"/system/su","/system/bin/.ext/.su","/system/usr/we-need-root/su-backup",
"/system/xbin/mu",
"/system/su/","/system/bin/.ext/.su/","/system/usr/we-need-root/su-backup/",
"/system/xbin/mu/"};
for (String where : places) {
if (new File(where + binaryName).exists()) {
found = true;
break;
}
}
}
return found;
}
private static boolean isRooted() {
return findBinary("su");
}
将此用于卸载应用程序(已测试)
Intent intent=new Intent(Intent.ACTION_DELETE);
String packageName = "yourpackagename";
intent.setData(Uri.parse("package:"+packageName));
startActivity(intent);
编辑:你试图实现的那些事情(保存加密密钥的存储空间,...)不是很容易。你应该看看这个,它可能会对你帮助最大。
要卸载你的应用,你可以试试这个(未测试!):
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();
}
}
}
问题内容: 罐的价值有多种变化方式,包括: 按键 复制粘贴 用JavaScript修改 通过浏览器或工具栏自动完成 我希望我的JavaScript函数在每次更改时都能被调用(使用当前输入值)。我希望立即调用它,而不仅仅是输入失去焦点时。 我正在寻找最干净,最可靠的方法来在所有浏览器中做到这一点(最好使用jQuery)。 问题答案: 不幸的是,我认为赢得了大奖: 这是最干净的解决方案,只需一行代码。
全部 我有一个JPanel(比如JTabbedPane容器),它包含一个设计面板和一个预览面板。 预览面板包含一个JME3画布。 我试图实现的是,每当用户移动到应用程序中的另一个面板时,我就可以捕获容器Jpanel的卸载并关闭JME3应用程序, 我找到了以下线程, 谢谢米希尔
我们的应用程序有DB14版本,并使用android sqllite帮助器。现在我们正在使用房间数据库,并将所有数据库的东西迁移到房间。我们已经定义了从1_2,2_3的所有迁移。到13_14,并给出所有这些int构建 这是正确的做法吗。如果我用DB14版本安装了非房间版本的应用程序,并且我试图用相同的DB14版本更新它到房间版本的应用程序,我会得到错误: IllegalStateException:
使用 Creative Cloud 桌面应用程序卸载 Creative Cloud 应用程序。 卸载 Creative Cloud 应用程序 如果您不再需要某个应用程序,则必须使用 Adobe Creative Cloud 桌面应用程序卸载该应用程序。 注意:不要将应用程序文件和文件夹拖到“废纸篓”或“回收站”中,因为这样做无法将其正确卸载。 单击位于任务栏 (Windows) 或 Apple 菜
Adobe Creative Cloud 桌面应用程序对于 Creative Cloud 功能(如安装 Creative Cloud 应用程序、同步、字体同步、资料库等)至关重要。Adobe 强烈建议不要卸载此应用程序。 但是在某些情况下,如 Creative Cloud 桌面应用程序已损坏或安装某些 Creative Cloud 应用程序时出现问题,您可以卸载 Creative Cloud 桌面
问题内容: 我有一个加载DLL来执行处理的特定部分的应用程序 Process.dll 使用反射 在运行时动态加载 ,并且未在应用程序中引用。 处理完成后,需要在服务器上重新编译DLL,然后稍后再次加载。 为此,我需要释放它,否则会收到以下消息:“无法将文件“ Process.dll”复制到“ Process.dll”。该进程无法访问文件“ Process.dll”,因为被另一个进程使用。” 因此,