“文件已加密或不是数据库”在尝试解密android中的加密数据库时出现错误

时间:2014-02-27 15:25:52

标签: android encryption sqlite sqlcipher

我正在使用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);

任何帮助都将不胜感激!!

1 个答案:

答案 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也是一个很好的起点。