Сохранение игрового счета локально на устройстве iOS ... нужна ли безопасность? - PullRequest
8 голосов
/ 01 июля 2011

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

[Редактировать] Я храню результаты локально и периодически загружаю их в списки лидеров Game Center.Даже если устройство взломано, я бы хотел иметь защиту, чтобы пользователь не мог манипулировать счетами.Что такое хороший подход?

Ответы [ 5 ]

6 голосов
/ 01 июля 2011

Я бы на самом деле сделал это:

Сохраните его в NSDictionary и преобразуйте в NSData объект.Теперь самое интересное:

Зашифруйте его в AES с помощью этого класса:
https://web.archive.org/web/20160806074714/http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

Это стандартное военное шифрование, которое вернет зашифрованный объект NSData.Затем просто сохраните его в файл и читайте / пишите при необходимости.У меня был действительно хороший опыт работы с этим классом, и пользователь ничего не может с ним сделать.

Намного лучше, чем просто хранить его на виду, используя NSUserDefaults.

.идти!

3 голосов
/ 22 июля 2012

Я также новичок в программировании для iPhone - только что создал свою первую маленькую игру и в настоящее время добавляю функцию Game Center к следующей версии (называемой Smiley Lines ;). Я полагаю, что многие окажутся в такой же ситуации.как я - просто хочу немного простого хэширования, чтобы взломанные люди не могли легко изменить счет в пользовательских настройках по умолчанию, следовательно, предотвращая путаницу в онлайн-таблице лидеров.

Если это так, я считаю преобразование NSData в решение AES довольно сложным (для новичка iOS и для простой необходимости хеширования целого числа) и немного избыточного.После некоторого поиска, здесь найдено отличное решение: Matthias Plapper разделил класс NSUserDefaults на подклассы, чтобы обеспечить простое хеширование с секретным ключом .Супер прост в использовании - скопируйте, вставьте два исходных файла, и вот пример использования:

// Configuring user defaults. It is recommended that you do this
// immediately after the app did launch.
    [NSUserDefaults setSecret:@"shh, this is secret!"];

// Write secure user defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setSecureBool:YES forKey:@"IsRegistered"];

    // Read secure user defaults
    BOOL valid = NO;
    BOOL registered = [defaults secureBoolForKey:@"IsRegistered" valid:&valid];
    if (!valid) {
        // the property has been modified, handle this situation
    } else {
        // Valid property, do whatever you need to do
    }

Спасибо за тонну Матиаса!

3 голосов
/ 01 июля 2011

Теоретически пользователь не может манипулировать этими сохраненными данными.

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

Лично, если бы я делал игру без онлайн-лидеров, я бы об этом не беспокоился. Пусть они наберут желаемое количество очков, если это не затронет других игроков.

1 голос
/ 01 июля 2011

Вы можете кодировать баллы с помощью собственного значения соли и декодировать при необходимости. Это не позволит пользователю просто изменить номер, который он видит.

0 голосов
/ 01 июля 2011

Я разработал много игр для iOS, и я просто сохраняю локальные оценки:

  • Используя класс NSUserDefaults или
  • Запись их непосредственно в локальный файл конфигурации например, , .txt, .plist и т. Д.).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...