1

我正在开发一个使用由 sqlcipher 加密的数据库的应用程序。此加密的密码由缓存字存储。

为了备份我的数据库,我使用了以下代码:

// ggf. Datenbank öffnen
openGuard();
mDb.execSQL("ATTACH DATABASE '" + outFileName + "' AS backup KEY 'asdfghjkl';");
mDb.rawExecSQL("SELECT sqlcipher_export('backup');");
mDb.execSQL("DETACH DATABASE backup;");

方法 openGuard() 用于检查数据库是否已打开,如果未打开则执行此操作。

我已经使用空密钥检查了备份,以制作我的数据库的未加密副本。然后我可以在 adb shell 上使用它并使用 sql-statements 来获取想要的数据。

我现在很长一段时间的问题是我无法使用我的备份来恢复我的应用程序的数据库。我试过这段代码:

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(backupFile, "asdfghjkl", null);
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + mCacheWord.getEncryptionKey() + "';");
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");

或者我试过

db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + encodeRawKey(mCacheWord.getEncryptionKey()) + "';");

但在这两种情况下,我都会收到以下错误消息:

10-30 00:56:42.845: I/Database(14407): sqlite returned: error code = 26, msg = statement aborts at 5: [ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';] file is encrypted or is not a database
10-30 00:56:42.845: E/Database(14407): Failure 26 (file is encrypted or is not a database) on 0x63bdedb0 when executing 'ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';'

有没有人可以帮助我解决我的问题?

4

2 回答 2

1

看起来你已经意外地“挂断”了试图通过ATTACH DATABASE语句提供密钥来解密。查看示例 2:将 SQLCipher 数据库解密为API 的明文数据库,有一条注释为-- empty key will disable encryption. 因此,大概您的初始解密代码尝试应该首先执行PRAGMA key =语句(提供密钥),然后执行带有空密钥ATTACH DATABASE的语句(解密),如下所示:

db.execSQL("PRAGMA key = '" + mCacheWord.getEncryptionKey() + "';");
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '';");
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");

另一个关于此的简短示例可以在SQLCipher 用户邮件列表讨论中看到。

于 2013-11-02T19:57:35.627 回答
1

我相信问题可能与您使用 CacheWord 的事实有关,它与 SQLCipher 分开管理加密密钥。您应该验证从 getEncryptionKey() 返回的字符串的格式,并确保它与 SQLCIpher 中原始密钥的正确格式相匹配。

于 2013-11-03T18:29:44.687 回答