保护本地 SQLite 数据库(Android 应用程序)

Posted

技术标签:

【中文标题】保护本地 SQLite 数据库(Android 应用程序)【英文标题】:Protecting Local SQLite Database (Android Application) 【发布时间】:2015-05-11 10:15:57 【问题描述】:

我们有一个 android 应用程序,它将其数据存储在本地 SQLite 数据库中;主要是为了性能,但也允许离线工作(因为我们经常在信号低的区域)。

目前,数据以加密格式存储(从我们的网络服务器传递),但这本身会导致性能问题,例如,如果我们要搜索特定“姓氏”的记录,我们需要解密所有数据,而不是使用直接 SQL 查询,以包含 where surname='Smith'

我们不能(就目前而言)以更友好的“开放格式”存储数据,因为可以“root”设备、获取 mysql 数据库的副本、打开它并读取数据。

有没有办法(也许有人可以提供一个例子)来密码保护本地 SQLite 数据库或以某种方式应用加密,以便我们可以(从应用程序的角度)以开放格式提供数据库,但是如果任何潜在的黑客都掌握了设备并将其植根......他们很难读取我们的数据?

我已经搜索了合适的解决方案,但找不到 SQLite 数据库、任何第 3 方软件或任何执行此操作的代码示例的任何选项。

【问题讨论】:

道歉;应该说明 SQLite 我认为匹配加密的姓氏也可以,而不是解密整个数据库 问题是您仍然需要加密密钥。并且此密钥必须在应用程序外存储,按需可用(当用户查询他的数据库时),并且不被缓存,否则它将毫无意义。但是这样的要求将违背您的要求,即应用程序的数据库应该可以离线访问。 您目前如何保护解密密钥? 密钥是根据(以及其他几项)用户详细信息动态形成的,因此数据在每个用户的基础上进行加密。 【参考方案1】:

SqlCipher,这可能适用于您的情况

【讨论】:

我们正在对此进行调查,因为它看起来确实是我们所需要的。非常感谢【参考方案2】:

远程存储:

您的数据很敏感,用户需要随时随地从不同的设备访问。如果您的应用程序很好,那么上述行将成立。

任何设备的安全性 + 远程访问表明您在远程服务器上维护您的 dB。

您的流程可以是:

用户登录 --> Token --> 每次调用中的 Auth Token --> 处理请求并在/从 dB 中获取/放入数据

本地存储:

假设您只想将数据存储在本地而不希望将其存储在服务器上。为此,您可以使用公钥加密

您可以在应用程序中使用公钥来加密数据并进行存储。现在,您要访问数据。从服务器请求私钥并解密。

同样,要访问私钥,您应该使用某种形式的授权(或者任何人都可以访问您的密钥)。

如果没有私钥,即使黑客 root 手机并掌握了 dB,数据也将毫无用处。

【讨论】:

以上是关于保护本地 SQLite 数据库(Android 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

Android项目通过Android Debug Database实时查看本地Sqlite数据库内容

Android jetpack room 将外部数据库导入到本地数据库(附带创建Sqlite3的教程)

Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?

Android数据存储之SQLite数据库

android:Android中用文件初始化sqlite数据库