2

我正在制作一个用户可以在设备上存储数据的应用程序。我正在考虑使用数据库存储。但我一直在某处读到可以操作本地存储在设备上的数据。那么,避免这种对数据的“攻击”的最佳方法是什么?我一直在考虑加密数据库中的每个字段,但是我又必须在设备上存储一个加密密钥(?),我想这又可以找到?那么有人对我的想法有任何其他想法/改进吗?

谢谢你的帮助!

4

2 回答 2

4

我正在寻找一种方法让它成为一个巨大的挑战

接受挑战 :)

您应该做的第一件事是将数据存储在您的应用程序目录中,因为普通设备上的用户/其他应用程序无法读取它。应用程序数据的链接可以从Context例如Context.html#getDir(). 您从中获取的目录Environment是公开的。

这会阻止普通用户获取数据。但是很多人都有root设备并且可以毫无问题地访问数据,所以这仍然很不安全。

为了使它更难,你需要加密。任何没有像 WEP 那样从根本上破坏的强加密都可以。使用加密会强制用户找到密钥(和加密方法),因为加密的数据无法在合理的时间内解密。

这会导致您的应用程序在某处可以使用密钥但用户无法使用的问题。这是您需要发挥创造力的部分,因为没有安全的方法可以做到这一点。

最简单的方法是将密钥以明文形式放在您的应用程序代码中。喜欢private static final String SECRET = "42"。通过简单地拥有加密文件,您将阻止大多数用户进一步挖掘,因为此时您需要一些编程技能来读取数据。

如果用户具有这些技能,他可能会开始查看您的应用程序的代码(使用例如dex2jar + jd-gui)。如果您想知道对您的应用程序进行逆向工程有多难,您也应该这样做。

如果您使用 proguard 来混淆代码,那么理解代码/查找加密方法 + 密码将变得更加困难,因为应用程序内部的类、方法和变量名称将被缩短为A.B.c(d)类似代码。但是无法重命名对 Android API 的方法调用,因为您需要重命名设备上的方法。"42"也不会更改字符串常量。

让它更难的下一步是用你的代码动态生成的东西替换那个常量。例如,下面的基本示例通过将数字除以二来构建密码。使用这种方法的优点是密码不再以明文形式存储,您需要了解/反向工程将数据转换为密码的方法。

private static final byte[] password = {8, 4};
private String getPassword(byte[] data) {
    StringBuilder sb = new StringBuilder();
    for (byte b : data) {
        sb.append(String.valueof(b / 2));
    }
    return sb.toString();
}
// returns "42" if I did not make a mistake

下一个易受攻击的点是可以轻松定位对设备加密 API 的调用(因为它们无法重命名),这使得找出在哪里寻找加密变得容易得多。如果您不想编写自己的加密方法,我强烈建议您不要这样做,因为这里的轻微错误可能会损坏数据或破坏完整的加密。

例如,如果您使用反射(通过提供 a 中提供的方法/类的名称来调用方法),则该问题可能会更加严重String。这String也可以像上面的示例一样使用密码进行混淆。

If you do all that and don't use a method not as simple as this one you can make it really hard. dexguard for example can do that for you but it's not free and has the problem that the same method is used for many apps and a lot more people will try to break that than your custom method.

Finding a good method to hide information in your app that is used to generate a key and a method to hide the key generation & encryption / decryption is best figured out by yourself so the method itself is not public knowledge.

You can use combine a lot of techniques to hide the information like moving parts of that into native code so Java guys like me have a hard time or use a network connection to let your server do some work.

But in the end it's all Security through obscurity and all the extra security measures don't benefit the user but require extra processing time & additional app size.

于 2012-09-01T12:40:16.160 回答
2

那么,避免这种对数据的“攻击”的最佳方法是什么?

请勿将其放在设备上。

我想让数据对应用程序的用户安全。

然后不要把它放在设备上。它是用户的设备和用户的带宽,因此它是用户的数据。

但是如果用户发现他/她会尝试这样做,我正在寻找一种方法来使其成为一个巨大的挑战。

只需在内部存储上使用数据库或其他东西,就会阻止 99% 的 Android 设备用户访问您的数据。你无法阻止剩下的 1%。

于 2012-09-01T12:32:10.493 回答