如何在内存(RAM)中隐藏敏感字符串?

时间:2015-04-04 17:28:01

标签: c++ qt sqlite password-encryption sqlcipher

对于小型C ++ / Qt应用程序,我想将数据加密到带有SQLCipher-extension的SQLite数据库中。

用于加密数据库的密钥必须由C ++ / Qt应用程序知道,例如:

...
q.exec("PRAGMA key = 'mysecretkey';");
...

由于二进制文件中的这个字符串可以使用十六进制编辑器轻松读取,我编写了一个小方法,它在运行时从哈希值创建键:

...
q.exec("PRAGMA key='" + getKey().toHex() + "';");
...


QByteArray getKey() {
    ...
}

使用此方法,密钥不再是二进制文件的一部分,但在执行查询数据库的方法时仍存在于RAM中。方法完成后,RAM中也不再显示该键。

您能帮忙了解如何避免密钥在RAM中可见吗?或者您是否建议在C ++ / Qt和SQLite / SQLCipher-database的基础上采用完全不同的方式来解决隐藏密钥的问题?

修订:程序应使用户能够检查搜索词是否属于数据库。但是不允许用户完整地查看数据库。

1 个答案:

答案 0 :(得分:0)

当您为该应用程序使用单个系统时,您很可能在localhost上运行该应用程序。密钥最终只会出现在内存中,无论您使用任何数量的加密算法。 您也可以使用完全不同的方法,我真的建议 - 使用负数据库概念

"负数据库是一种包含大量数据的数据库,包含模拟数据。当有人试图访问这些数据库时,即使他们窃取了整个数据库,也会检索实际数据集和负数据集。例如,不存储个人详细信息,而是存储成员不具备的个人详细信息。"

即使在后端,这也可以确保您的数据安全。