保护本地 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)