Как безопасно хранить данные с целью C? (Mac / Cocoa Dev) - PullRequest
7 голосов
/ 13 августа 2010

Я пытаюсь создать пробную часть моего приложения какао.У меня настроено лицензирование (включая ключи) и т. Д.

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

У меня была скрипка с NSUserDefaults standardUserDefaults, но пользователь может легко найти и отредактировать эти данные в Library> Preferences.

Ответы [ 6 ]

21 голосов
/ 26 августа 2010

Я бы поспорил против того, чтобы сделать это супер-безопасным.Когда-то у нас была активация сервера, но мы от нее полностью отказались.Вот некоторые из причин:

  • Даже самый «безопасный» способ хранения может быть нарушен
  • Даже для нишевого продукта может возникнуть трещина, как ни крутинасколько безопасен ваш метод
  • Существует несколько очень дорогих и очень безопасных методов.Все остальные были взломаны
  • Это идет вразрез с честными и честными пользователями, затрудняя для них исправление проблем, вызывающих проблемы
  • Если пользователь взломает ваше программное обеспечение или обойдетваша безопасность, он, вероятно, также никогда не купил бы его
  • 80% пользователей даже не знают, что такое файл настроек
  • 95% всех пользователей не думают овозможность удалить его, чтобы продлить пробную версию
  • Простой способ сброса пробных периодов массово облегчает вашу поддержку пользователей, которым вы хотите дать вторую пробную версию по любой причине
  • Доверие пользователей - это хороший способ продажи
  • Опытные пользователи, как правило, обращаются к программам со слишком большой защитой

Я почти уверен, что есть некоторые, но крайне малые исключения изэти мысли.Я бы сказал: не тратьте свое время на безопасность регистрации, но дайте

4 голосов
/ 31 августа 2010

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

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

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

2) Используйте сетевой вызов и выполните проверку на сервере. Это потребовало бы, чтобы приложение всегда имело доступ к вашему сервису для запуска. Это не очень хорошая идея в целом. Что делать, если ваши серверы не работают? Что делать, если они в автономном режиме? Что если между вами и вами возникнет проблема с сетью? Все эти сценарии будут происходить. Когда они это сделают, вы, скорее всего, потеряете клиентов, если вашему приложению не требуется подключение к вашим серверам (например, Twitter или Facebook).

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

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

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

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

3 голосов
/ 01 сентября 2010

У Аллана Одгаарда довольно приличная запись о том, как использовать OpenSSL для генерации / хранения лицензионных ключей для программного обеспечения Какао. Может быть стоит прочитать.

3 голосов
/ 30 августа 2010

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

Просмотрите библиотеку Common Crypto .

Это защитит практически от всех случайных пользователей. Хотя хакеры могут с достаточной мотивацией найти способ обойти.

2 голосов
/ 26 августа 2010

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

хорошее место для размещения скрытого файла - это файл с непонятным именем в папке пользователя (~ /), там много скрытых файлов, поэтому трудно понять, какие из них вы можете и не можете удалять. пример пути: ~ / .xdarwinprofile или что-то такое же официальное звучание.

Вот код, который должен работать, чтобы скрыть файл:

#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/attr.h>
#include <sys/errno.h>
#include <unistd.h>
#include <sys/vnode.h>

typedef struct attrlist attrlist_t;

struct FInfoAttrBuf {
    u_int32_t length;
    fsobj_type_t objType;

    union {
        char rawBytes[32];

        struct {
            FileInfo info;
            ExtendedFileInfo extInfo;
        } file;

        struct {
            FolderInfo info;
            ExtendedFolderInfo extInfo;
        } folder;
    } finderInfo;
};
typedef struct FInfoAttrBuf FInfoAttrBuf;


- (int)SetFileInvisibility:(NSString *)filePath state:(BOOL)isInvisible) {
    attrlist_t attrList;
    FInfoAttrBuf attrBuf;

    char *path = [filePath cStringUsingEncoding: NSUTF8StringEncoding];

    memset(&attrList, 0, sizeof(attrList));
    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
    attrList.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;

    int err = getattrlist(path, &attrList, &attrBuf, sizeof(attrBuf), 0);
    if (err != 0)
        return errno;

    // attrBuf.objType = (VREG | VDIR), inconsequential for invisibility

    UInt16 flags = CFSwapInt16BigToHost(attrBuf.finderInfo.file.info.finderFlags);

    if (isInvisible)
        flags |= kIsInvisible;
    else
        flags &= (~kIsInvisible);

    attrBuf.finderInfo.file.info.finderFlags = CFSwapInt16HostToBig(flags);

    attrList.commonattr = ATTR_CMN_FNDRINFO;
    err = setattrlist(path, &attrList, attrBuf.finderInfo.rawBytes, sizeof(attrBuf.finderInfo.rawBytes), 0);

    return err;
}

Я изменил этот код из ответа на этот вопрос, вы можете найти более полезную информацию там: Как сделать файл невидимым в Finder, используя target-c

Я не проверял этот код, но он должен работать. На самом деле, возможно, код не нужен, и будет работать только сохранение файла с точкой перед именем файла.

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

0 голосов
/ 27 октября 2015

Это решение сработало для меня очень хорошо. Попробуйте это: https://github.com/nielsmouthaan/SecureNSUserDefaults. Он будет хранить зашифрованные bool / string / float / integer в вашем файле UserDefaults. Надеюсь, это то, что вы хотите. Убедитесь, что вы загрузили и добавили CocoaSecurity (см. Страницу GITHub SecureNSUserDefaults для загрузки) в ваш проект. CocoaSecurity является обязательным элементом SecureNSUSerDefaults, поэтому вам не нужно импортировать его ни в один из ваших файлов. Вы также должны загрузить Base64 , который является обязательным элементом CocoaSecurity. Вам также необходимо добавить Base64 в ваш проект, но не нужно импортировать его ни в один из ваших файлов.

* 1008 USAGE *

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

#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h>

Затем установите ключ шифрования, , вероятно, в вашем awakeFromNib методе :

[[NSUserDefaults standardUserDefaults] setSecret:@"your_secret_goes_here"];

Я рекомендую генерировать случайную строку цифр и букв. Затем вы должны сохранить информацию в вашем файле UserDefaults.

[[NSUserDefaults standardUserDefaults]
    setSecretObject:@"your_secret_object"
    forKey:@"the_key_your_object_will be_stored_under"];

Чтобы получить строку, используйте этот метод:

NSString *retrievedData = [[NSUserDefaults standardUserDefaults]     
    secretStringForKey:@"the_key_your_object_will be_stored_under"];

Надеюсь, это поможет!

...