我听说像 qq 这种聊天软件是把用户的本地聊天数据保存在了 sqlite 中,那 sqlite 中的数据是如何加密的?
是在 qq 中加密好,写入密文到 sqlite,然后需要读取的时候,就冲 sqlite 读取,在 qq 中解密是吗?
比如我按照关键字搜索聊天记录的时候,那就要把所有的聊天记录都 load 到 qq 的内存中,在搜索?感觉这样效率不高
我听说像 qq 这种聊天软件是把用户的本地聊天数据保存在了 sqlite 中,那 sqlite 中的数据是如何加密的?
是在 qq 中加密好,写入密文到 sqlite,然后需要读取的时候,就冲 sqlite 读取,在 qq 中解密是吗?
比如我按照关键字搜索聊天记录的时候,那就要把所有的聊天记录都 load 到 qq 的内存中,在搜索?感觉这样效率不高
推荐免费开源工具: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
因为你需要在本地进行内容搜索,所以整体加密比分条加密更适合这样的场景应用。
大致是 应用软件 保存一个私有的文件加密方式,把常规的sqlite数据文件加密为特殊内容格式予以保存,在使用前解密(到内存或者临时位置)进行使用。
当然,这也也有问题,比如突然断电之类容易掉数据,不过本地普通应用,可能没有那么敏感,你可以结合其他方式进行冗余处理,来保证本地的数据是可用的。
4 回答4.5k 阅读✓ 已解决
5 回答3.3k 阅读✓ 已解决
1 回答3.3k 阅读✓ 已解决
4 回答4.1k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
可以把sqlite db文件加密,db里面的数据不加密。
读的时候把db文件加载到内存里面,再解密,然后读写数据。在db数据变更的时候加密写回磁盘。
问题就是怎么保护数据库加密的密钥和加密方法。
可以登录的时候从服务器获取解密密钥,登录成功后用密钥解密db文件。
要破解的话,可能可以把内存dump下来,分析内存,可能可以找到密钥。
找到密钥还不行,加密的方法可以是私有不公开的,有密钥还要反编译/破解加密方法,才能完全解密db文件。