我开发了一个客户端软件,需要使用sqlite3来存储数据。它将在用户计算机上存储一些需要加密的数据。
我在将数据存储到数据库之前使用RSA手动加密数据(当我需要查找时,我直接使用加密数据进行查找)。但当多个cell拥有相同的数据时,它们的加密数据也是相同的,因此当数据库文件泄露时,攻击者可能会分析出数据特征。那么sqlite3可以只加密表结构而不加密数据内容吗?
语言:C++20,平台:Windows/Linux/Android
SQLite 严重依赖于模式,又名
sqlite_master
(表结构,以及其他组件,如索引、视图和触发器)。如果仅对其进行加密,那么毫无疑问会出现问题(例外)。
当使用 SQLCipher 之类的工具时,这不是问题,因为整个文件被作为一个加密/解密。
要做你想做的事情很可能需要从自定义源代码编写 SQLite 的自定义版本。也许参考https://www.sqlite.org/howtocompile.html。
我想另一种方法是确定并加密/解密 sqlite_master 使用的页面,但这仍然可能需要在通过 SQLite API 访问文件之前/之后处理文件。当然,其他/实际数据不会有什么不同(未加密)并且可能会从文件中被破解。
如果您要在列级别进行加密(以及执行此操作的示例在 SQLite 中加密数据,但在 Java 中)。
您也许可以在加密时包含一个会改变的因素,可能不是超级安全,但包含存储在列中的日期/时间。因此,它可以是来自相应行的密码短语+日期/时间来加密/解密。相同的基础数据将会有所不同。也许您可以加密实际数据+日期/时间,同样存储的数据会(应该)有所不同。当然,这样做可能会让数据更容易被黑客攻击,因为很可能有一些数据很容易确定。可能还有其他潜在的解决方案,虚拟表可能是其中之一;请参阅