【问题标题】:Unable to attach with sqlcipher encrypted database to another one无法使用 sqlcipher 加密数据库附加到另一个数据库
【发布时间】:2013-11-02 13:42:08
【问题描述】:

我正在开发一个使用由 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';'

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

【问题讨论】:

    标签: database sqlite encryption sqlcipher


    【解决方案1】:

    您似乎在尝试通过 ATTACH DATABASE 语句提供密钥进行解密时意外“挂断”了。查看 API 的 Example 2: Decrypt a SQLCipher database to a Plaintext Database,有一条注释为 -- 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;");
    

    关于此的另一个简短示例可以在此 the SQLCipher Users mailing list 讨论中看到。

    【讨论】:

    • 我最近检查了这个建议,但它没有帮助。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 我认为这是问题所在,但我不知道如何解决。但是我通过将备份附加到应用程序的数据库然后复制每个表的值来帮助我。这意味着更多的代码,但它有效。谢谢!
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多