Шифрование файла Базы данных SQLite в iPhone OS

Попробуйте что-то вроде этого:

FileInfo fi = new FileInfo(somefile);                
fi.Attributes = FileAttributes.Hidden;
20
задан Justin Tanner 24 January 2011 в 01:44
поделиться

7 ответов

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

Поместите строку в базу данных, говоря «пожалуйста, не обманывайте».

18
ответ дан 29 November 2019 в 23:27
поделиться

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

Какие данные вы храните, для чего требуется шифрование? Если он содержит пароли, введенные пользователем, то вам действительно не нужно их шифровать; пользователю не нужно будет узнавать собственный пароль. Если это общие данные большого двоичного объекта, к которым пользователь должен получать доступ только через приложение, это может быть так же просто, как сохранение зашифрованного большого двоичного объекта с помощью API безопасности .

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

Вы можете взглянуть на резидентные базы данных в памяти, или временные базы данных, которые вы можете создать с помощью шаблона db или жестко запрограммированной схемы в программе (см. документацию для sqlite3_open ). Данные можно расшифровать, вставить во временную базу данных, а затем удалить расшифрованную базу данных. При закрытии соединения делайте это в обратном направлении.

Правка :

Вы можете создать свою собственную схему шифрования, я уверен, с помощью очень простой системы безопасности, выполняя операцию XOR с данными со значением хранится в приложении, и храните хэш где-нибудь еще, чтобы убедиться, что он не изменится или что-то в этом роде.

5
ответ дан 29 November 2019 в 23:27
поделиться

Не обращая внимания на философские вопросы и вопросы экспорта, я бы посоветовал вам зашифровать данные в таблице напрямую.

Вам необходимо скрыть ключ (ключи) дешифрования в вашем коде. Обычно Возможно, этот для C #:

http://msdn.microsoft.com/en-us/magazine/cc164055.aspx

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

Вы должны помнить, что ваш исполняемый файл может быть исследован в шестнадцатеричном редакторе, где строки открытого текста будут выскакивать из случайного мусора, который является вашим скомпилированным кодом. И что многие языки (например, C #) могут быть скомпилированы обратно, и все, что будет отсутствовать, это комментарии.

Все, что сказано, шифрование ваших данных немного поднимет планку мошенничества. Сколько зависит от того, насколько вы осторожны; но даже в этом случае решительный противник все равно взломает ваше шифрование и обманет. Более того, они, вероятно, напишут инструмент, упрощающий задачу, если ваша игра популярна; оставляя вас с сценарием гонки вооружений на этом этапе.


Что касается значения контрольной суммы, вы можете вычислить контрольную сумму на основе суммы значений в строке, предполагая, что у вас достаточно числовых значений в вашей базе данных для этого. Или для группы логических значений вы можете сохранить их в поле varbinary и использовать побитовый исключающий оператор ^ для их сравнения - вы должны получить нули.

Например,

для числовых столбцов,

] 2 | 3 | 5 | 7 | со столбцом контрольной суммы | 17 |

для логических значений,

0 | 1 | 0 | 1 | со столбцом контрольной суммы | 0101 |

Если вы сделаете это, вы даже можете добавить итоговую строку в конце, которая суммирует ваши контрольные суммы. Хотя это может быть проблематично, если вы постоянно добавляете новые записи. Вы также можете преобразовать строки в их компоненты ANSI / UNICODE и также суммировать их.

Затем, когда вы хотите проверить контрольную сумму, просто сделайте выбор следующим образом:

Select * 
FROM OrigTable 
right outer join 
(select pk, (col1 + col2 + col3) as OnTheFlyChecksum, PreComputedChecksum from OrigTable) OT on OrigTable.pk = OT.pk
where OT.OnTheFlyChecksum = OT.PreComputedChecksum
2
ответ дан 29 November 2019 в 23:27
поделиться

Здесь есть как минимум два более простых подхода (оба дополняющие), которые позволяют избежать шифрования значений или баз данных в памяти:

# 1 - обнаружение взлома ipa

Избегайте технических (и юридических ) проблемы с шифрованием базы данных и / или содержимого и просто определите, является ли приложение пиратским, и отключите аспекты сети / подсчета очков / ранжирования в игре. Для получения дополнительной информации см. Следующее:

http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

# 2 - проверка целостности данных

В качестве альтернативы сохраните HMAC / хэш с солью. важных столбцов в каждой строке при сохранении данных (и в исходной базе данных sqlite). При загрузке каждой строки сверяйте данные с HMAC / хэшем, и если проверка не удалась, действуйте соответствующим образом.

Ни один из подходов не заставит вас заполнять формы экспорта шифрования, требуемые Apple / правительством США.

Отправка баллов

Не забывайте, что вам нужно будет сделать что-то подобное для фактических представлений баллов, чтобы защитить себя от значений, поступающих из чего-то другого, кроме вашего приложения. Вы можете увидеть реализацию этого в инфраструктурах cocos2d-iphone и cocoslive по адресу http://code.google.com/p/cocos2d-iphone/ и http://code.google. com / p / cocoslive /

Ответ на комментарии

Здесь нет решения, которое на 100% предотвратило бы подделку данных. Если это требование, клиент должен быть доступен только для просмотра, а все состояние и логика должны быть рассчитаны на доверенном сервере. В зависимости от приложения, от клиента потребуются дополнительные механизмы защиты от читерства.

Существует ряд книг по разработке многопользовательских игр, в которых обсуждаются эти вопросы.

12
ответ дан 29 November 2019 в 23:27
поделиться

Кажется, проще всего синхронизировать все результаты турниров со всеми Айфоны в турнире. Вы можете делать это во время каждой игры: перед игрой, если базы данных двух телефонов противоречат друг другу, отображается предупреждение.

Если пользователь A фальсифицирует результат своей игры с пользователем B, этот результат будет распространяться до тех пор, пока B в конечном итоге не увидит его с предупреждением о том, что данные A не совпадают с данными его телефона. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

отображается предупреждение.

Если пользователь A фальсифицирует результат своей игры с пользователем B, этот результат будет распространяться до тех пор, пока B в конечном итоге не увидит его с предупреждением о том, что данные A не совпадают с данными его телефона. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

отображается предупреждение.

Если пользователь A фальсифицирует результат своей игры с пользователем B, этот результат будет распространяться до тех пор, пока B в конечном итоге не увидит его с предупреждением о том, что данные A не совпадают с данными его телефона. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

Если пользователь A фальсифицирует результат своей игры с пользователем B, этот результат будет распространяться до тех пор, пока B в конечном итоге не увидит его с предупреждением о том, что данные A не совпадают с данными его телефона. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

Если пользователь A фальсифицирует результат своей игры с пользователем B, этот результат будет распространяться до тех пор, пока B в конечном итоге не увидит его с предупреждением о том, что данные A не совпадают с данными его телефона. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

не совпадает с его телефоном. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

не совпадает с его телефоном. Затем он может пойти и избить объяснить A, что его поведение неправильное, как в реальной жизни, если кто-то обманывает.

Когда вы подсчитываете окончательные результаты турнира, покажите предупреждение, назовите имена и выкините все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

и выкинуть все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

и выкинуть все игры с противоречивыми результатами. Это устраняет стимул к мошенничеству.

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

1
ответ дан 29 November 2019 в 23:27
поделиться

Компилятор должен уметь распознавать, что BigFoo не может быть преобразовано в IEnumerable , но это не так. Он просто видит, что это IEnumerable , и чувствует, что это потенциальный кандидат на перегрузку (даже несмотря на то, что ограничение, которое вы определили, заставляет T быть IFoo и int нельзя преобразовать в IFoo ). Хотя это неудобно, но это не так уж и важно. Просто приведите bigFoo к IFoo , и компилятор будет доволен:

fooContainer.Add((IFoo)bigFoo);

В качестве альтернативы вы можете сделать свою общую перегрузку Add uglier:

public void Add<T, U>(U group)
    where T : IFoo
    where U : IEnumerable<T>
{
}

В любом случае, у вас будет больше ввода, второе решение устранит необходимость для звонков на Добавьте , вы можете рассмотреть возможность использования SQLCipher для своей реализации. Это сборка SQLite, которая обеспечивает прозрачное шифрование всей БД на уровне страниц. На Mobile Orchard есть руководство по использованию в приложениях для iPhone.

11
ответ дан 29 November 2019 в 23:27
поделиться

Однако, если на платформе windows, Вы также можете выбрать SQLiteEncrypt для удовлетворения Ваших потребностей. SQLiteEncrypt расширяет поддержку шифрования sqlite, но Вы можете относиться к нему как к оригинальной библиотеке sqlite3 c.

.
-5
ответ дан 29 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

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