我正在使用sqlcipher版本3.7.17和sqlite3版本3.7.15.2加密ubuntu终端中的sqlite数据库。当我试图在Android中使用此加密数据库时,我收到错误“文件已加密或不是数据库”。我在android中使用sqlcipher 2.2.0版。
ubuntu终端中使用的加密代码:
./scipcipher plaintext.db
源码>附加数据库'encrypted.db'AS加密KEY'测试密钥';
源码> SELECT sqlcipher_export('encrypted');
源码> DETACH DATABASE已加密;
要解密的Android代码:
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile,testkey“,null);
任何帮助都将不胜感激!!
答案 0 :(得分:2)
如果您使用的是SQLCipher核心3.7.17,那么SQLite版本字符串对应于SQLCipher的v2.2.1
标记,该标记可与SQLCipher for Android 2.2.0一起正常使用。要验证您的初始加密是否正常,请按照sqlcipher_export
流程执行以下操作:
$> ./sqlcipher encrypted.db
sqlite> PRAGMA key = 'testkey';
sqlite> select * from sqlite_master;
如果从sqlite_master
表的查询中显示结果,我们应该排除应用程序集成问题,您是否可以尝试在SQLCipher for Android test suite中运行数据库?请注意,测试套件针对最新的Android库SQLCipher,目前为3.0.2,需要使用不同的密钥派生长度; 4000是SQLCipher 2.x中的默认值。您需要将数据库文件复制到assets
目录中,然后尝试使用以下示例打开它:
SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){
public void preKey(SQLiteDatabase database){}
public void postKey(SQLiteDatabase database){
database.execSQL("PRAGMA kdf_iter = 4000;");
};
ZeteticApplication.getInstance().extractAssetToDatabaseDirectory("encrypted.db");
File databaseFile = ZeteticApplication.getInstance().getDatabasePath("encrypted.db");
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "testkey",
null, hook);
从那里你应该能够查询你的数据库。如果您有特定问题,SQLCipher Mailing List也是一个很好的起点。