net.sqlcipher, то сразу чувствую дух приключений. Это же люди заморочились, решили сделать зашифрованную базу данных и чтобы все было безопасно и хорошо. В такие моменты всегда интересно, что же они придумали с хранением ключей шифрования. Обычно там ничего интересного или всякая "комнатная криптография" типа константы с именем автора закодированной в base64, но на этот раз я нашел кое что забавное.Самый простой способ начать раскручивать алгоритм — поискать метод
net.sqlcipher.database.getReadableDatabase. В который и передается пароль на открытие БД. Если вам повезло и туда передается не статическая строка "mysecretpassword", то начинайте искать артефакты 😉 В моем случае, дорога приключений привела меня в класс с совершенно ничего не говорящим названием DatabasePasswordManager, который содержал такой код:static SecretKey generatePassword() {
return new SecretKeySpec(UUID.randomUUID().toString().replaceAll("-", "").getBytes(StandardCharsets.UTF_8), "AES");
}
Ну хоть не имя автора и то ладно. А дальше сгенерированный ключ попадал в файл:
static void writeDatabasePassword(Context context, SecretKey secretKey, File file) {
....
byte[] wrap = keyWrapperFactory.createInstance(context, "db").wrap(secretKey);
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(wrap);
fileOutputStream.close();
return;
}Который сохранялся в песочнице приложения. Шах и мат =)
Как стоило бы решать такую задачу? Я вижу три способа:
1. Не решать ее вообще. Зачем вам шифровать всю базу данных? Что там такого содержится? Если там куча конфиденциально инфы, то лучше бы это вынести на сервер.
2. Шифровать только конкретные данные. Тут хорошо помогает генерация ключей в keystore и обычные операции шифрования конкретных значений, которые потом можно сохранять в БД.
3. Размазать алгоритм генерации пароля по всему приложению с заходом в нативные либы, использовать куски подписи приложения и всякое такое прочее. Потом осознать, что пароль все равно получат с помощью хука на методе
getReadableDatabase и написать защиту от фриды, xposed и... ну в общем вы поняли 😉