Защита базы данных (шифрование базы, контента и т.п.)?

У меня есть довольно популярное приложение под Андроид с оффлайн-базой историй. База сейчас никак не защищена, истории там лежат в обычном UTF-8.

Истории ложатся в базу с помощью небольшой программы на C#.


Приложение распространяется как бесплатное, присутствует реклама, но только на странице со списком историй, на самой странице чтения рекламы нет.


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

2. К тому же, стал переносить приложение под IOS и боюсь, чтоб никто это не сделал раньше меня, умыкнув мою базу.

В преддверии выхода новой версии хочу защитить базу.


Как советуете это сделать? Т.к. контент ложу в базу я, может шифровать каким-то быстрым алгоритмом, а в приложении дешифровать? Но против особо любопытных это не поможет. Тем не менее, информация о таком способе будет полезна (выбор алгоритма и т.п.).


Какие есть эффективные способы защитить базу?
  • Вопрос задан
  • 8672 просмотра
Пригласить эксперта
Ответы на вопрос 3
@MikhailEdoshin
У sqlite же есть средства шифрования, не в обычной поставке, правда, но есть, и некоторые даже бесплатные, вроде sqlcipher. (Там автор просит денег за бинарники, а код отдает так, но вполне можно и самому собрать, только немного повозиться.)
Ответ написан
Комментировать
deadkrolik
@deadkrolik
Как мне кажется, прям вот защитить не получится совсем, в ваших силах все только сильно усложнить. Мне в голову пришел жесткий вариант усложнения, который, кстати, может вообще отпугнуть пользователей:

В самом приложении базы нет. При установке на каждом клиенте генерится какой-то ID клиента, более менее уникальный (или на сервере генерится, это пофигу). Программа при первом запуске запрашивает у сервера базу и сообщает свой ID. Сервер записывает у себя соответствие: ID-клиента — закрытый_ключ — открытый_ключ. При помощи открытого ключа сервер шифрует базу и отдает клиенту. А далее программа при каждом запуске лезет на сервер и по своему ID получает закрытый ключ, который хранится в памяти пока она запущена и которым можно расшифровать базу.

Но, сами понимаете, для этого нужен интернет при запуске. Или, если андроид позволяет, какое-то shared хранилище в памяти куда можно положить свои данные пока программа выгружена из памяти и забрать их оттуда. Ведь телефоны выключают достаточно редко и такая штука может жить без интернета долго. Ну и все гонять по https, чтобы сложнее было распознать схему.
Ответ написан
Комментировать
asm0dey
@asm0dey
Мне кажется самый тривиальный способ — это тупо сериализовать Java-объекты в файл.
Если нужно больше защиты, то можно делать так:
1) сериализация в файл (бинарный)
2) шифрование файла с помощью, например, AES, в другой файл
3) удаление изначального файла.

При старте приложения оно расшифровывает зашифрованный файл, потом десериализует. В качестве AES ключа можно использовать все что угодно, например MAC-адрес или к чему там есть доступ, лишь бы уникальное для устройства.

Ну и конечно же приложение шифровать прогардом, чтобы было посложнее вытащить эту логику.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы