对于一个小型C++/Qt应用程序,我希望将加密的数据存储在具有SQLCipher扩展的SQLite数据库中。
用于加密数据库的密钥必须由C++/Qt应用程序知道,例如:
...
q.exec("PRAGMA key = 'mysecretkey';");
...
由于二进制文件中的这个字符串使用十六进制编辑器很容易读取,我编写了一个小方法,在运行时从哈希值创建密钥:
...
q.exec("PRAGMA key='" + getKey().toHex() + "';");
...
QByteArray getKey() {
...
}
使用这种方法,密钥不再是二进制文件的一部分,而是在执行查询数据库的方法时仍然存在于RAM中。当该方法完成时,密钥在RAM中也不再可见。
你能帮我想出一个如何避免钥匙在RAM中可见的主意吗?或者,你建议在C++/Qt和SQLite/SQLCipher数据库的基础上采用一种完全不同的方法来解决正确隐藏密钥的问题?
修正:程序应允许用户检查搜索词是否是数据库的一部分。但不允许用户完整地查看数据库。
当您为该应用程序使用单个系统时,您很可能正在本地主机上运行该应用程序。密钥最终将只存在于内存中,而与您使用任何数量的加密算法无关。你也可以使用完全不同的方法,我真的建议你-负面数据库概念的使用。
"负面数据库是一种包含由模拟数据组成的大量数据的数据库。当任何人试图访问此类数据库时,即使他们窃取了整个数据库,实际数据集和负面数据集也会被检索到。例如,你存储的不是会员没有的个人详细信息,而是会员没有的。"
这将确保您的数据安全,即使是在后端。