шифрование sqlite для Android

#android #sqlite #encryption

#Android #sqlite #шифрование

Вопрос:

я очень усердно ищу возможность зашифровать мою базу данных sqlite на устройствах Android, но мне не удалось найти удовлетворительного решения.

Мне нужно что-то вроде библиотеки для ссылки, чтобы иметь шифрование / дешифрование моей базы данных «на лету» при использовании обычных функций sqlite.

Я не хочу шифровать данные перед сохранением.

Я не хочу шифровать весь файл базы данных целиком, чтобы расшифровать его перед использованием.

Я знаю о следующих проектах:

Но я не могу найти ни одного рабочего примера для этого материала.

Кстати, я абсолютно готов приобрести коммерческую сборку, но мне нужно протестировать ist, прежде чем тратить несколько сотен долларов.

Кто-нибудь решил эту проблему самостоятельно?

Комментарии:

1. Нет никакой веской причины шифровать базу данных. Если кто-то захочет получить к нему доступ, он всегда может перепроектировать ваше приложение, чтобы получить ключ.

2. нет, нет, если я заставлю пользователя ввести пароль при запуске приложения

3. Не можете найти никаких примеров для SQLCipher? Видишь zetetic.net/sqlcipher/sqlcipher-for-android

Ответ №1:

Попробуйте порт SQLCipher для Android вместо обычного SQLCipher.

Комментарии:

1. Использование SQLCypher делает мое приложение на 8-10 МБ более объемным, после включения icudt46.zip файл для решения проблемы совместимости. Есть какой-нибудь другой легкий способ шифрования базы данных?

2. @Saty: Насколько мне известно, ничего подобного.

3. Как именно мне загрузить двоичный файл, страница Zetetic ведет на страницу загрузки без фактической загрузки.

4. @Michael: Добавьте compile 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar' к себе dependencies в build.gradle файл вашего модуля.

5. @CommonsWare О, хм. Неужели больше невозможно загрузить zip-файл и удалить файлы где-нибудь в моем проекте в Android Studio?

Ответ №2:

litereplica поддерживает шифрование с использованием шифра ChaCha, что быстрее, чем AES на портативных устройствах.

Для Android существуют привязки.

Для создания и открытия зашифрованной базы данных мы используем URI, подобный этому:

 "file:/path/to/file.db?cipher=...amp;key=..."
  

Ответ №3:

Если кто-то все еще ищет:

Переопределить SQLiteOpenHelper функцию, как показано ниже:

 void onConfigure(SQLiteDatabase db){
    db.execSQL("PRAGMA key = 'secretkey'");
}
  

Ответ №4:

 private String encrypt(String password) {
   try {
        SecretKeySpec keySpec = generateKey(password);
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE,keySpec);
        byte[] encVal = c.doFinal(password.getBytes());
        String encryptedValue = Base64.encodeToString(encVal,Base64.DEFAULT);
        return encryptedValue;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

private SecretKeySpec generateKey(String password) throws Exception {
    final MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] bytes = password.getBytes(StandardCharsets.UTF_8);
    digest.update(bytes,0,bytes.length);
    byte[] key = digest.digest();
    SecretKeySpec secretKeySpec = new SecretKeySpec(key,"AES");
    return secretKeySpec;
}
  

Я просто использовал encrypt функцию для шифрования пароля. Здесь я использовал пароль пользователя в качестве ключа. Поэтому мне не нужно хранить ключ внутри приложения. Когда пользователь хочет войти в систему, просто зашифруйте пароль и попытайтесь сопоставить его с зашифрованным паролем в базе данных и разрешить им войти в систему.