1

我正在使用 SQLCipher v3.5.7 并观察到来自 SQLiteDatabase 的意外行为,密码不正确。

  1. 我用“key1”加密了数据库。
  2. 关闭数据库连接。
  3. 然后我尝试用“key2”打开我的数据库,SQLiteDatabase 没有抛出异常。相反,它将旧密码 (key1) 更新为新密码 (key2)。我通过在 SQLiteBrowser 中打开 .db 文件来验证这一点。

有人可以帮我为什么它会这样吗?

private static SQLiteCipherDatabaseHelper createDBConnection(Context context, String databasePath, final String key) throws SQLiteDatabaseException {
    if (dbInstance == null) {
        dbInstance = new SQLiteCipherDatabaseHelper(context, databasePath);

        String path = context.getDatabasePath(databasePath).getPath();
        File dbPathFile = new File(path);
        if (!dbPathFile.exists()) {
               dbPathFile.getParentFile().mkdirs();
        }

        setDatabaseWithDBEncryption(key);
    }
    return dbInstance;
}

private static void setDatabaseWithDBEncryption(String encryptionKey) throws SQLiteDatabaseException {
    loadSQLCipherLibs();
    try {
        sqliteDatabase = SQLiteDatabase.openOrCreateDatabase(new File(context.getDatabasePath(databasePath).getPath()), encryptionKey, null);
    } catch (Exception e) {
        SyncLogger.getSharedInstance().logFatal("SQLiteCipherDatabaseHelper", "Failed to open or create database. Please provide a valid encryption key");
        throw new SQLiteDatabaseException(SyncErrorCodes.EC_DB_SQLCIPHER_FAILED_TO_OPEN_OR_CREATE_DATABASE, SyncErrorDomains.ED_OFFLINE_OBJECTS, SyncErrorMessages.EM_DB_SQLCIPHER_FAILED_TO_OPEN_OR_CREATE_DATABASE, e);
    }
}
4

2 回答 2

0

您实际上是在键入后用表和数据填充数据库吗?似乎很可能由于某种原因,您每次运行测试时都在重新创建数据库。您是否通过将其从设备中取出并检查文件来验证实际数据库是否已加密?也许您每次运行测试时都在重新创建一个新数据库,在这种情况下,将只使用新密钥。

值得注意的是,SQLCipher for Android 测试项目中涵盖了此行为。

https://github.com/sqlcipher/sqlcipher-android-tests/blob/master/src/main/java/net/zetetic/tests/InvalidPasswordTest.java

如果您怀疑存在问题,您可以尝试在您的设备上运行测试套件,或者创建一个新的测试用例来使用您自己的代码验证行为。

于 2017-11-27T14:56:59.263 回答
0

你升级你的数据库版本了吗?

 private static final int DATABASE_VERSION = 2;//from 1 to 2
 private static class OpenHelper extends SQLiteOpenHelper {
    OpenHelper(Context context) // constructor
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
 {
     //Changes in db mentioned here
 }
}
于 2017-11-23T06:20:05.547 回答