Войти
iPhoneФорумПрограммирование

Шифрование данных приложения (нужно ли вообще)

Страницы: 1 2 3 Следующая »
#0
17:35, 20 окт 2011

Данные приложения это: прогресс игры, внутренние покупки, рекорды которые будут поститься в GameCentre. Если сохранять эти данные в NSUserDefaults, то теоретически пользователь, который сможет залезть в файлы приложения, сможет задать себе огромный счет, или открыть платные объекты и т.п. И без интернета правильность этого не проверишь...
С другой стороны, iPhone сильно закрыт и, вероятно, доступ к файлам можно не предусматривать...

Посмотрев различные ресурсы не нашел освещения этой темы. Хотелось бы узнать можно ли все сливать в NSUserDefaults или шифровать все-таки надо. И если надо, то где почитать примеры записи шифрованных файлов (типо зашифровать свой plist и записать в файл) либо просто как работать с архивами ресурсов вообще.

#1
17:41, 20 окт 2011

kZUraX
> С другой стороны, iPhone сильно закрыт и, вероятно, доступ к файлам можно не
> предусматривать...
На голом айФоне нельзя, а на джейл брейкнутом - запросто. У нас была такая проблема - очки геймцентра, которые кешировались на диске в отсутствие интернета выкручивали на максимум. С этого момента у нас все шифруется :)

#2
17:44, 20 окт 2011

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

#3
17:48, 20 окт 2011

kZUraX
> сможет задать себе огромный счет
ага, я так делал на джеилбрейкнутом телефоне )

#4
17:50, 20 окт 2011

Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли кто-то будет. А в текстовом плисте октрыть хранить - это fail.

#5
17:51, 20 окт 2011

Sergio
+1

#6
17:58, 20 окт 2011

TioRio
Я так понимаю, +1 это к накрутке очков? :)

#7
18:15, 20 окт 2011

неа к "Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли кто-то будет. А в текстовом плисте октрыть хранить - это fail."

#8
18:40, 20 окт 2011

Sergio
> Думаю, достаточно будет записать в бинарный файл. Расковыривать его вряд ли
> кто-то будет. А в текстовом плисте октрыть хранить - это fail.
Эх... расковыриваются бинарники за милую душу. Помню в юную юность (ну как сказать юность... лет в 16) решил загамать в одну игруху, файл save.dat или что-то типа этого весил совсем мало и ничего не стоило понаблюдать за его изменением в отдельные моменты времени. Замена всего на FF открыла все.

#9
22:01, 20 окт 2011

kZUraX
Будут свободные 20 минут - почитай
http://imaladec.com/story/zip
авось пригодится.

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

#10
22:50, 20 окт 2011

CasDev
> делаю через NSUserDefaults.
У меня эта хрень после чтения постоянно отнимала в памяти как раз размер данных (а их было много). Я так и не понял, как от этого избавиться и сделал по православному (еще и кросс-платформенно) - fopen()\fread()\fwrite(), чего и вам желаю ;)

#11
9:18, 21 окт 2011

Sergio
> Думаю, достаточно будет записать в бинарный файл
+1

для сейвов достаточно делать 2 вещи:
1) Привязывать сейвы к девайсу (UDID/Mac-Address)
2) Шифрование с ключем length >= 5

ну и валидация всех покупок при наличии инета - само-собой разумеется

#12
12:29, 21 окт 2011

0r@ngE
> UDID
Кстати, его отменили, начиная с iOS 5

#13
15:18, 21 окт 2011

>У меня эта хрень после чтения постоянно отнимала в памяти как раз размер данных (а их было много).
Когда то на developers.apple.com читал, что следует воздержаться от хранения большого объема данных в defaults system, т.к. оно не совсем предназначено для этих целей.

> Думаю, достаточно будет записать в бинарный файл
Делал запись в бинарник давно - ещё на заре своей карьеры написания apps под iPhone.
Вместо
>fopen()\fread()\fwrite()
использовался NSData со своими dataWithContentsOfFile\writeToFile, который в свою очередь инициализировался из структуры (возможно не самый лучший способ, но, повторюсь, это было на заре моей практики).
В принципе работало.
Отказался из-за того, что если в новой версии приложения изменялся формат сохраняемых данных (ну мало ли чего начальству захочется добавить), то необходимо было совершить определённые нелепые телодвижения по проверке соответствия формата сохранённых данных и формата новых данных и что-то сделать в случае их несоответствия.

После NSData попробовал хранить данные в NSMutableDictionary с их dictionaryWithContentsOfFile\writeToFile. Останавливаться на этом способе не буду, т.к. это в принципе то же самое что и хранить данные в NSUserDefaults, только, опять таки, с лишними телодвижениями.

После этого перешёл на NSUserDefaults - храню там не очень критичные данные.
Особо заморачиваться с шифрованием не стал - использую нечто похожее на расширение Secure-NSUserDefaults, которое позволяет проверить валидность сохранённых данных.

Ну и если необходимо хранить важные данные (например признак покупки чего-то-там с помощью in app purchase), то сохраняю их в keychain девайса (примеры классов для работы с кейчейном можно нарыть в инете).
Обыкновенный BOOL YES там хранится в виде binary 192 byte, желающие могут попробовать заменить всё на FF и сообщить о результатах :)
Достоинство этого способа в том, что даже если пользователь что-то там купил и не синхронизируя приложение с iTunes удалил приложение, то после повторной загрузки приложения тот же признак купленного товара присутствует на девайсе (а то я устал отвечать в сапорте дебилам которые требуют деньги назад из-за того, что он/ребёнок/кум/брат/сват случайно удалил приложение, а теперь у него опять заблокированы возможности за которые он заплатил деньги).

Ну а если всё же хочется пошифровать, то вот что нарыл у себя в закладках Saved state encryption. Возможно найдёте пример и получше - просто у меня не было такой необходимости :)

CasDev
Cпасибо за
>http://imaladec.com/story/zip
Занёс в закладочки :)

Sergio
а что там с UDID-ами в пятой версии? можно ссылку какую-нибудь?

#14
15:28, 21 окт 2011

Mikrokot
> а что там с UDID-ами в пятой версии?

Deprecated in iOS 5.0

uniqueIdentifier
An alphanumeric string unique to each device based on various hardware details. (read-only) (Deprecated in iOS 5.0. Instead, create a unique identifier specific to your app.)

@property (nonatomic, readonly, retain) NSString *uniqueIdentifier
Special Considerations
Do not use the uniqueIdentifier property. To create a unique identifier specific to your app, you can call the CFUUIDCreate function to create a UUID, and write it to the defaults database using the NSUserDefaults class.

Страницы: 1 2 3 Следующая »
iPhoneФорумПрограммирование

Тема в архиве.