我尝试使用pysqlsimplecipher加密SQLite3数据库。当我尝试加密它时,它会出错:
raise RuntimeError('needs reserved space at the end of each page.')
RuntimeError: needs reserved space at the end of each page.
我不知道该怎么做。我使用DB浏览器进行sqlite。是否有任何我应该执行的SQL语句,我应该在DB浏览器或任何python函数中从其SQLite模块更改任何设置以在每个页面的末尾保留空间?多少空间就足够了?
或任何解决方法?它是较大程序的一部分,所以这里的约束是我应该使用python来加密。但是,我可以使用任何方法来保留空间,因为它只需要完成一次。
我的平台是Windows 8.1,python版本是3.6 x32。如果那很重要。
我询问pythonic方式或SQL语句来执行此操作。 我已经找到了一个answer using c++,但是在c ++中已经找到了For each construct。我对c ++一无所知 我已经读过您编译sqlite以便与c ++一起使用。我不知道。如果有人发布整个代码片段来使用c ++来完成它,我将不胜感激。
答案 0 :(得分:0)
您链接的documentation说:
需要在数据库文件每页末尾的保留空间。
否则,使用sqlcipher进行加密。
使用sqlcipher进行加密
打开普通数据库
./sqlcipher plain.db
加密到enc.db
ATTACH DATABASE 'enc.db' as encrypted key 'testkey'; SELECT sqlcipher_export('encrypted'); DETACH DATABASE encrypted;
答案 1 :(得分:0)
经过几天的研究和尝试了大量的方法。我成功地做到了这一点。方法sqlite3_test_control(SQLITE_TESTCTRL_RESERVE,sqlite3 * db,int N)不再起作用。因此,我使用HEX编辑器更改用于指示在sqlite数据库中每页末尾要保留多少空间的特定字节。 Go Go:
1-创建一个空数据库:不要创建任何表或任何其他表。创建并保存sqlite数据库文件。
2-使用十六进制编辑器更改偏移量20处的字节。它将为00这意味着不保留任何字节。例如,如果要保留36个字节。将偏移量为20的字节值更改为“24”(转换为HEX时为36)。
3 - 检查偏移105和106处的字节。它们的值表示内容区域的起始位置。如果保留空间为0,则值为页面大小。 例如,在这种情况下,它的0400是十进制的1024。现在减去先前设置为保留的字节; 36. 1024-36 = 988。在HEX 03DC。 将值设置为105和106偏移到03DC。保存它现在你很高兴。 检查image我是否为编辑器的相关字节和设置加下划线。
我需要使用pysqlsimplecipher来加密和解密数据库,这需要在每个页面的末尾保留一些字节。 希望它可以帮到某人。