TGViewer
Android Guards Android Guards @android_guards_today · 3.87K subscribers
Post #109 1.8K
Когда я нахожу в списке пакетов приложения 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 и... ну в общем вы поняли 😉
More from @android_guards_today
  1. Sep 28, 2026Я редко скидываю сюда статьи из чужих блогов, потому что таких "новостных рупоров" и без м…
  2. Aug 25, 2026Сегодня исполнилось 35 лет ядру Linux. Ну "исполнилось и исполнилось, чего бухтеть то?", к…
  3. Jul 29, 2026Написал небольшую заметку про один не слишком очевидный способ выполнения кода до фактичес…
  4. Jun 8, 2026Собрал тут себе игрушку для решения разных интересных задач. Может и вам пригодится 🌚 Дем…
  5. May 30, 2026Идёт шумная деревенская свадьба. Под утро пьяный вдрызг тамада, громко спрашивает: — Кто е…
  6. May 25, 2026В дополнение к предыдущему посту. Если вы получаете инвайт от бота и видите, ошибку, что с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →