sqlite 聊天记录如何加密?

我听说像 qq 这种聊天软件是把用户的本地聊天数据保存在了 sqlite 中,那 sqlite 中的数据是如何加密的?

是在 qq 中加密好,写入密文到 sqlite,然后需要读取的时候,就冲 sqlite 读取,在 qq 中解密是吗?

比如我按照关键字搜索聊天记录的时候,那就要把所有的聊天记录都 load 到 qq 的内存中,在搜索?感觉这样效率不高

阅读 2.9k
3 个回答

可以把sqlite db文件加密,db里面的数据不加密。

读的时候把db文件加载到内存里面,再解密,然后读写数据。在db数据变更的时候加密写回磁盘。

问题就是怎么保护数据库加密的密钥和加密方法。

可以登录的时候从服务器获取解密密钥,登录成功后用密钥解密db文件。

要破解的话,可能可以把内存dump下来,分析内存,可能可以找到密钥。

找到密钥还不行,加密的方法可以是私有不公开的,有密钥还要反编译/破解加密方法,才能完全解密db文件。

推荐免费开源工具:sqlcipher

密码设置依据:

  • At least a substantial part of the key material for SQLCipher databases should come directly from the user, and should not be stored on the device itself (i.e. a passphrase).
  • The key material should not be hard coded into an application.

In other words, it would be fine to take a passphrase from a user and mix in some material like a random file or device ID into the key, provided that a significant part of the key material is a secret coming directly from the user when the application runs.

参考其他的实现:(user_uni_id + fixed_filed + cipher_version(remote database filed)) sha256

sqlcipher-database-key-material-and-selection
关于 SQLite 加密

因为你需要在本地进行内容搜索,所以整体加密比分条加密更适合这样的场景应用。

大致是 应用软件 保存一个私有的文件加密方式,把常规的sqlite数据文件加密为特殊内容格式予以保存,在使用前解密(到内存或者临时位置)进行使用。

当然,这也也有问题,比如突然断电之类容易掉数据,不过本地普通应用,可能没有那么敏感,你可以结合其他方式进行冗余处理,来保证本地的数据是可用的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题