Android库项目中的数据封装

3
我希望创建一个SDK项目,需要将数据封装并存储在应用程序无法访问的地方。该库通过HTTPS接收数据。
首先,我进行了研究,发现共享首选项不是选项,因为Android中的库没有自己的上下文,并且只能使用应用程序上下文,并且共享首选项中的数据将对父应用程序可见。
有哪些最佳选项来存储这样的敏感数据以将其隐藏在使用lib的应用程序中?我计划使用商业工具的代码混淆方法,使检索此数据变得尽可能困难。那么,也许我应该使用Android Keystore System或简单的加密就足够了?
编辑:好吧,似乎安全存储数据的唯一方法是加密的其中一种变体。但还有另一个问题:它是否会防止父应用程序访问RAM并从中读取数据?假设设备未经root化。

1
我曾经使用NDK本地编写一些代码,因此业务逻辑的一部分被“安全”地存储在二进制库中。 - betorcs
是的,这是一个有效的选项,我已经采用这种方法来存储网络API密钥。 - bvk256
1个回答

0

你可以使用SQLite作为数据存储。这比依赖外部库更好(因为在你的情况下,你正在编写该库)。让我们保持轻量级。

每个数据库实例都有自己的名称,并且应用程序通过名称访问它。作为可能的解决方案,你可以对DB实例的名称进行编码,并在运行时进行解码。这将隐藏开发人员的访问点。

实现SQLiteOpenHelper类:

    public class FeedReaderDbHelper extends SQLiteOpenHelper {
        public static final int DATABASE_VERSION = 1;
        public static String DATABASE_NAME = Utils.decode("Ylhsd1lYTnpkMjl5WkE9PQ==");
            public FeedReaderDbHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
        ...

Utils.decode("Ylhsd1lYTnpkMjl5WkE9PQ==") 是你运行以获取正确的数据库名称的方法。在混淆后,你的代码将会变成这样:

com.myrpoject.mypackage.g.h.a(com.myrpoject.mypackage.g.h.a("Ylhsd1lYTnpkMjl5WkE9PQ=="))

当然,Ylhsd1lYTnpkMjl5WkE9PQ==只是示例,您也可以使用其他的。
有关第二步的详细信息,请 查看此答案

这可能与在共享首选项中使用加密数据相同,因为是父应用程序的上下文用于创建此SQLite数据库。 - bvk256
你的库将使用父上下文但是你的密钥。开发者将无法访问你的数据库创建。是的,你也可以使用SharedPrefs完成同样的功能。这里的主要重点是隐藏名称,而不是存储数据的方式。 - Val

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接