Comment puis-je stocker des données en toute sécurité avec l'objectif C? (Dev Mac / Cocoa)

StackOverflow https://stackoverflow.com/questions/3475295

  •  28-09-2019
  •  | 
  •  

Question

Je suis en train de créer une partie de première instance de ma demande de cacao. J'ai la licence tous mis en place (y compris les clés) etc.

Mais je me demandais comment je pouvais stocker le premier par exemple lorsque l'utilisateur a couru le programme dans un endroit sûr, où l'utilisateur ne peut pas trouver facilement et / ou le modifier.

J'avais un violon avec NSUserDefaults standardUserDefaults, mais l'utilisateur peut facilement trouver et modifier ces données dans Bibliothèque> Préférences.

Était-ce utile?

La solution

Je dirais contre ce qui en fait super sécurisé. Nous avons déjà eu une activation du serveur, mais complètement allés loin de là. Voici quelques-unes des raisons:

  • Même la méthode la plus de stockage « sécurisé » peut être cassé
  • Même pour un produit de niche une fissure peut être développée, aucun moyen de contourner, peu importe comment sécuriser votre méthode
  • Il y a peu, très coûteux, des méthodes très sûres. Tous les autres ont été fissurés
  • Il va à l'encontre équitable et les utilisateurs honnêtes, ce qui rend plus difficile pour eux à des choses fixes causant des problèmes
  • Si un utilisateur ne fissurer votre logiciel ou votre sécurité contourne, il va probablement aussi jamais acheté
  • 80% des utilisateurs ne savent même pas ce qu'est un fichier de préférences est
  • 95% de tous les utilisateurs ne pensent pas la possibilité de le supprimer afin d'étendre l'essai
  • Une façon simple de réinitialiser les périodes d'essai massivement facilite votre soutien pour les utilisateurs que vous souhaitez donner un second procès pour une raison quelconque
  • Confiants utilisateurs est un bon point de vente
  • Les utilisateurs ont tendance à tourner d'alimentation contre les logiciels avec trop de protection

Je suis sûr qu'il y en a, mais très peu, les exceptions de ces pensées. Je dirais: ne perdez pas votre temps sur la sécurité d'enregistrement, mais donner

Autres conseils

Vous ne pouvez pas utiliser un fichier sur le système de fichiers. Tous ceux qui seraient à la recherche de violon / crack il sera assez intelligent pour savoir comment suivre l'accès aux fichiers par le biais de base, les caractéristiques standards OSX. Donc, un fichier étant ajouté est sorti. Non seulement cela, mais il est mauvais comportement pour créer des fichiers que vous ne supprimez pas lorsque l'application est désinstallée. Les gens ne devraient pas avoir les ressources consommées après la suppression de votre application d'essai.

Comme indiqué ci-dessus, bricoler dans votre paquet est une mauvaise idée. Cette feuille vous avec trois options fondamentales.

1) Ne vous inquiétez pas trop. Utiliser un système d'expiration de base qui utilise les emplacements et les méthodes standard. Vous pouvez toujours utiliser le chiffrement dans les données que vous stockez, mais sachez que cela aussi sera brisé. Accepter que la violation du droit d'auteur se produit à moins que votre application est tout à fait impopulaire.

2) Utilisez un appel réseau et faire la validation sur le serveur. Cela nécessite l'application toujours en mesure d'atteindre votre service à exécuter. Ce n'est pas une bonne idée en général. Que faire si vos serveurs sont en panne? Et s'ils sont hors ligne? Que faire si un problème de réseau entre vous et eux qui se passe? Tous ces scénarios vont se produire. Quand ils vous seront probablement perdre des clients à moins que votre application nécessite une connexion à vos serveurs déjà pour fonctionner (comme par exemple Twitter ou Facebook ne).

3) un « mauvais citoyen » par bidouiller avec le faisceau d'application ou en laissant les fichiers orphelins autour. Si vous faites ce dernier, au moins assurer qu'ils sont clairement nommés afin qu'ils se rapportent à votre demande évidemment.

En fin de compte l'élément clé à retenir est que vous avez pas de sécurité sur la machine d'un utilisateur. Il est à eux. Cela signifie qu'ils ont un accès physique qui à peu près de tout annulait tentative de les empêcher de creuser. Vous pouvez aussi regarder cette façon: plus techniquement esprit de votre marché est moins probable que vous allez être plus intelligent que nous tous et votre « sécurité » sera craquée. Si vous concevez pour un public non technique, alors vous pouvez comprendre qu'ils en général ne seront pas prendre la peine de le casser, ou à la recherche d'un.

Vous pouvez passer vos ressources à rendre l'application mieux, ou vous donner un meilleur sentiment des gens ne pas l'utiliser après la période d'essai. L'un de ceux-ci peuvent augmenter vos ventes, et on ne.

[modifier] Aussi je tiens à souligner que l'un des plus commun (sinon le plus commun) des moyens de fissuration de ces choses est de modifier le binaire. Donc, en brisant la signature de code via paquet vous déblayage serait effectivement vous ouvrir à cette méthode parce que vous avez cassé l'une des meilleures protections que vous avez. La plupart des fissures impliquent des binaires étant modifiés de telle sorte que la routine qui effectue les contrôles renvoie toujours une authentification réussie.

Allan Odgaard a une assez bonne writeup sur la façon d'utiliser les clés de licence OpenSSL pour générer / magasin pour les logiciels Cocoa. Peut-être vaut une lecture.

Si vous devez, d'une façon simple et courante consiste à utiliser une clé qui est intégrée dans l'application qui crypte un fichier sur le disque qui contient les données sensibles. Le défi est de savoir comment sécuriser la clé.

Regardez dans le Crypto commun digest bibliothèque.

Cela protégera de presque tous les utilisateurs occasionnels. Bien que les pirates peuvent, avec assez motiviation, de trouver un moyen de contourner.

Essayez stocker un fichier son nom commence par une période dans certains dossier, puis mettre le drapeau caché du fichier.

un bon endroit pour mettre le fichier caché serait un fichier nommé obscurément dans la base des utilisateurs dossier (~ /), il y a beaucoup de fichiers cachés obscurs il donc il est difficile de savoir que l'on est, vous pouvez et ne peut pas supprimer. par exemple chemin: ~ / .xdarwinprofile ou quelque chose sonne tout aussi officiel

.

ici est un code qui devrait fonctionner pour cacher le fichier:

#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;
}

J'ai modifié le code de la réponse à cette question, vous trouverez des informations plus utiles là-bas: Comment faire un fichier invisible dans le Finder en utilisant l'objectif -c

Je n'ai pas testé ce code, mais il devrait fonctionner. En fait, il est possible que le code est inutile et sauver juste le fichier avec un point devant le nom de fichier fonctionne.

Si vous disposez des droits d'administrateur, vous pouvez exécuter un chmod sudo sur le fichier et le mettre à lire que si vous voulez, mais vous ne devriez pas faire votre application demande à l'utilisateur son mot de passe.

Cette solution a fonctionné pour moi très bien. Essayez ceci: https://github.com/nielsmouthaan/SecureNSUserDefaults . Il stockera crypté bool / string / flotteur / entier dans votre fichier UserDefaults. Espérons que c'est ce que vous voulez. Assurez-vous de télécharger et d'ajouter CocoaSecurity (voir la page SecureNSUserDefaults GitHub pour le lien de téléchargement) à votre projet. CocoaSecurity est un élément nécessaire de SecureNSUSerDefaults, de sorte que vous ne devez importer dans l'un de vos fichiers. Vous devez télécharger base64 , qui est un élément nécessaire de CocoaSecurity. Vous devez également ajouter base64 à votre projet, mais ne pas besoin de l'importer dans l'un de vos fichiers.

USAGES

Importer le fichier d'en-tête où vous souhaitez utiliser la méthode de cryptage.

#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h>

Ensuite, définissez une clé de cryptage, probablement dans votre méthode awakeFromNib :

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

Je recommande générer une chaîne aléatoire de chiffres et de lettres. Ensuite, vous devez stocker les informations dans votre fichier UserDefaults.

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

Pour récupérer la chaîne, utilisez cette méthode:

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

J'espère que cela aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top