SQLCipher Andoird не выдает исключение с неверным паролем
Я использую SQLCipher v3.5.7 и обнаружил неожиданное поведение SQLiteDatabase с неверным паролем.
- Я зашифровал базу данных с помощью "key1".
- Закрыто соединение с базой данных.
- Затем я попытался открыть свою базу данных с помощью "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.
Если вы подозреваете проблему, вы можете попробовать запустить набор тестов на своем устройстве или создать новый тестовый пример, чтобы проверить поведение с помощью собственного кода.