SQLite 3.7.13的加密解密(七)—— 遗留问题
来源:互联网 发布:sql server外键约束 编辑:程序博客网 时间:2024/05/17 02:52
现象与原因
采用上面的方法对数据库进行加密,存在页面尺寸错乱的问题。在SQLite的DB文件中,第16、17两个字节的值表示数据库中每个页的大小,SQLite规定页大小必须是512的倍数,如果加密算法恰好导致这两个字节的值为512的倍数,且与数据库的实际页面大小不一样,就会导致不能进行数据库操作。
其原因是在sqlite3_open()函数中,会读取DB文件头,从16、17字节得到页大小,但是sqlite3_open()函数中没有调用解密函数,因此得到的就是错误的值。一般来说,采用的加密算法不会导致16、17这两个字节恰好是512的倍数,在SQLite内部有保护,如果这个数据不是512的倍数,或者超过一定数值,则自动取默认值1024。
但是也不排除加密算法没有选择好,导致这两个字节的值出现问题,譬如我曾经采用个简单的加密算法,就是将每个字节循环左移一位,结果16、17这两个字节的值就是2048,正好是512的倍数,最终导致程序崩溃。
解决方案
这种问题,实际上是因为sqlite代码中没有充分考虑这种pagesize在加密后读取的问题,解决方法有两个:
方案一:(彻底解决方案)修改sqlite源码,使opendatase读取的pagesize无效,在设置好数据库密钥以后,第一次读取数据时重新计算pagesize;
方案二:(针对加密的修补方案)修改sqlite3_key的加密实现,在设置密钥时,解密读取数据库的头信息,读取解密后的pagesize,再把这个正确的pagesize设置回去;
本文出自 “rainman” 博客,请务必保留此出处http://lancelot.blog.51cto.com/393579/940818
- SQLite 3.7.13的加密解密(七)—— 遗留问题
- SQLite 3.7.13的加密解密(七)—— 遗留问题
- SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
- SQLite 3.7.13的加密解密(四)—— 挂接加密解密函数
- SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
- SQLite 3.7.13的加密解密(四)—— 挂接加密解密函数
- SQLite 3.7.13的加密解密(一)—— 前言
- SQLite 3.7.13的加密解密(二)—— 开放宏定义
- SQLite 3.7.13的加密解密(五)—— 修正编译错误和警告
- SQLite 3.7.13的加密解密(六)—— 使用方法
- SQLite 3.7.13的加密解密(一)—— 前言
- SQLite 3.7.13的加密解密(二)—— 开放宏定义
- SQLite 3.7.13的加密解密(五)—— 修正编译错误和警告
- SQLite 3.7.13的加密解密(六)—— 使用方法
- SQLite 3.7.13的加密解密
- SQLite 的加密解密(开放宏定义)
- java加密与解密的艺术(七)——因电子邮件传输诞生的Base算法家族
- 加密,解密Sqlite数据库
- Android 小项目之--SQLite 使用法门 (附源码)
- Entity Framework First Code 的一些网址
- Tomcat 6.0.36 配置 webservice war 文件
- Unicode宽字符转化
- STM32(Cortex-M3)中的优先级理解
- SQLite 3.7.13的加密解密(七)—— 遗留问题
- gdb调试过程中出现行号错位
- Android开发笔记--隐藏按钮
- Linux LVM管理
- perl 匹配中文
- sugarcrm
- Android平台上开发网络应用的一些常用接口。
- linux下system函数
- NoSQL的总结