SQLCipher Andoird не выдает исключение с неверным паролем

Я использую SQLCipher v3.5.7 и обнаружил неожиданное поведение SQLiteDatabase с неверным паролем.

  1. Я зашифровал базу данных с помощью "key1".
  2. Закрыто соединение с базой данных.
  3. Затем я попытался открыть свою базу данных с помощью "key2", база данных SQLite не выдает исключение. Вместо этого он обновляет старый пароль (ключ1) на новый пароль (ключ2). Я подтвердил это, открыв файл.db в SQLiteBrowser.

Может ли кто-нибудь помочь мне, почему он так себя ведет? Заранее спасибо.

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);
    }
}

2 ответа

Вы обновили свою версию БД?

 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
 }
}

Вы действительно заполняете базу данных таблицами и данными после ее ввода? Скорее всего, по какой-то причине вы воссоздаете базу данных каждый раз, когда запускаете тест. Вы проверили, что фактическая база данных зашифрована, вытащив ее из устройства и изучив файл? Возможно, вы заново создаете новую базу данных при каждом запуске теста, и в этом случае новый ключ будет просто использоваться.

Стоит отметить, что это поведение описано в проекте SQLCipher for Android Test.

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

Если вы подозреваете проблему, вы можете попробовать запустить набор тестов на своем устройстве или создать новый тестовый пример, чтобы проверить поведение с помощью собственного кода.

Другие вопросы по тегам