J'essaie de créer une partie d'essai de mon application de cacao. J'ai la licence toutes configurée (y compris les clés) etc. p>
Mais je me demandais comment je pouvais stocker par exemple le moment où l'utilisateur a dirigé le programme dans un endroit sécurisé, où l'utilisateur ne peut pas le trouver facilement et / ou le modifier. P>
J'avais un violon avec Nsuserdefaults StandardUserDefaults, mais l'utilisateur peut facilement trouver et modifier ces données dans la bibliothèque> Préférences. P>
6 Réponses :
Essayez de stocker un fichier nom de fichier commence par une période dans un dossier, puis définissez le drapeau caché du fichier.
Un bon endroit pour mettre le fichier caché serait un fichier caché de manière obscurel dans la base du dossier Utilisateurs (~ ~ /), il existe de nombreux fichiers cachés obscur, il est donc difficile de savoir lequel vous pouvez et ne peut pas supprimer. Exemple de chemin: ~ / .xdarwinprofile em> ou quelque chose de tout aussi officiel. P> Voici un code qui devrait fonctionner pour masquer le fichier: P> #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;
}
Je discuterais contre le rendre super sécurisé. Nous avions une fois une activation de serveur mais nous l'avons complètement parti. Voici quelques-unes des raisons: p>
Je suis à peu près sûr qu'il y en a quelques-uns, mais très peu, des exceptions de ces pensées. Je dirais: ne perdez pas votre temps sur la sécurité de l'enregistrement, mais donnez p>
Je suis d'accord, ne gaspillez pas trop de ressources rendre votre application super sécurisée. Les pirates feront un moyen de le contourner.
aquaticmac.com est une bonne chute de solution à la sécurité. aquaticmac.com/cocoa.php a également une belle extension sur Nsdata de faire du cryptage. Si vous souhaitez couvrir% 99 des utilisateurs, je recommanderais l'approche de fichier cachée avec un nom évident, c'est-à-dire ".
Si vous devez, un moyen simple et courant est d'utiliser une clé intégrée à l'application qui chiffre un fichier sur le disque contenant les données sensibles. Le défi consiste à faire de la clé sécurisée. P>
regarder dans le Crypto commun bibliothèque de Digest. P>
Cela va protéger de presque tous les utilisateurs occasionnels. Bien que les pirates puissent, avec suffisamment de motivation, trouver un moyen de contourner. P>
Vous ne pouvez pas utiliser de fichier sur le système de fichiers. Toute personne qui chercherait à violer / craquer sera suffisamment intelligente de savoir comment suivre l'accès des fichiers via des fonctionnalités OSX standard de base. Donc, un fichier étant ajouté est sorti. Non seulement cela, mais c'est un mauvais comportement de créer des fichiers que vous ne supprimez pas lorsque l'application est désinstallée. Les gens ne devraient pas avoir à avoir des ressources consommées après avoir supprimé votre application d'essai. P>
Comme indiqué ci-dessus, la gâche sur votre paquet est également une mauvaise idée. Cela vous laisse avec trois options fondamentales. P>
1) Ne vous inquiétez pas de cela trop. Utilisez un système d'expiration de base utilisant les emplacements et les méthodes standard. Vous pouvez toujours utiliser le cryptage dans les données que vous stockez, mais sachez que cela aussi sera brisé. Accepter que la violation du droit d'auteur se produise à moins que votre application soit totalement impopulaire. P>
2) Utilisez un appel réseau et effectuez la validation sur le serveur. Cela nécessiterait que l'application soit toujours en mesure d'atteindre votre service à courir. Ce n'est pas une bonne idée en général. Et si vos serveurs sont en panne? Et si elles sont hors ligne? Et si une question de réseau entre vous et eux se produit? Tous ces scénarios vont se passer. Lorsque vous perdrez probablement des clients, sauf si votre application nécessite une connexion à vos serveurs déjà pour fonctionner (comme si vous voulez dire Twitter ou Facebook). P>
3) Soyez un «mauvais citoyen» en chaleureux avec le forfait d'application ou en laissant des fichiers orphelins autour. Si vous faites ce dernier, assurez-vous qu'ils soient clairement nommés de manière à ce qu'ils concernent votre application évidemment. p>
En fin de compte, la principale chose à retenir est que vous n'avez aucune sécurité sur la machine d'un utilisateur. Il est à eux. Cela signifie qu'ils ont un accès physique qui inflige à peu près toute tentative de les empêcher de creuser. Vous pouvez également le regarder de cette façon: plus votre marché est plus technique, moins vous allez être plus intelligemment que nous et votre "sécurité" sera fissuré. Si vous concevez un public non technique, vous pouvez comprendre que, en général, ils ne se dérouleront pas de la fêler ou de la recherche d'un. P>
Vous pouvez dépenser vos ressources pour rendre l'application meilleure ou vous donner un meilleur sentiment sur les personnes qui ne l'utilisent pas après la période d'essai. Un de ceux-ci peut augmenter vos ventes, et on ne le fera pas. P>
[modifier] De plus, je devrais souligner que l'un des moyens les plus courants (sinon les plus courants) de craquer ces choses est de modifier le binaire. Donc, en brisant la signature de code via un bundle mucking, vous vous ouvririez à cette méthode, car vous auriez cassé l'une des meilleures protections que vous avez. La plupart des fissures impliquent des fichiers binaires modifiés de sorte que la routine qui effectue les chèques renvoie toujours une authentification réussie. P>
Allan Odgaard a une assez décente Extroip < / a> Comment utiliser OpenSSL pour générer / stocker des clés de licence pour le logiciel COCOA. Pourrait valoir une lecture. P>
Cette solution a très bien fonctionné pour moi. Essayez ceci: https://github.com/nielsmouthaan/securensuserdefault . Il stockera crypté bool / chaîne / flotteur / entier dans votre fichier userdefault. Espérons que c'est ce que vous voulez. Assurez-vous de télécharger et d'ajouter de la cocoasecurity (voir la page SECURENSURESUSERDEFAULTS GITUB pour le lien de téléchargement) à votre projet. La cocoasecurity est un élément requis de SecurensUserDefaults. Vous n'avez donc pas besoin de l'importer dans aucun de vos fichiers. Vous devez également télécharger base64 , élément requis de la cocoasecurity. Vous devez également ajouter de base64 à votre projet, mais ne devez pas l'importer dans aucun de vos fichiers.
Utilisation forte> p> Importer le fichier d'en-tête n'importe où que vous souhaitiez utiliser La méthode de cryptage. p> puis, définissez une clé de cryptage, probablement dans votre ewakefromnib code> méthode EM>: p>: P> NSString *retrievedData = [[NSUserDefaults standardUserDefaults]
secretStringForKey:@"the_key_your_object_will be_stored_under"];
Le stocker dans le paquet d'applications pourrait être légèrement i> plus difficile pour l'utilisateur de contourner. Cela dépend de la qualité que vous voulez que la protection soit.
Il doit être assez bon parce que je ne veux pas que l'utilisateur puisse utiliser l'application du tout après l'expiration du procès
Je cherchais juste à Nsuserdefault Encodobject: Forkey :, peut-être qu'ils seront suffisants?
@Daniel: Le problème avec c'est que l'utilisateur puisse simplement supprimer Tous B> les valeurs par défaut.
@David Avez-vous des suggestions?
@Daniel: La seule chose à laquelle je peux penser consiste à changer de fichier, quelque part dans le paquet, d'une manière qui n'est évidemment pas liée aux restrictions «essai». Cela pourrait être aussi simple que de changer quelques octets sans importance dans l'une des ressources binaires, comme le fichier d'icônes. Le problème est que c'est toujours très facile pour une personne compétente de faire une comparaison binaire sur tous les fichiers et de déterminer comment le changer ... et une fois qu'ils l'ont fait, ils peuvent le distribuer comme une "crack" pour la normale les utilisateurs à utiliser.
Pourrait juste faire une version enlevée Down Lite alors :)
Changer à l'intérieur de l'ensemble nécessite que l'utilisateur ait des droits à ce sujet - si comme étant normal que vous installez dans / Applications, l'application est installée en tant que root - vous aurez donc besoin de droits d'administrateur pour modifier les choses dans le paquet qui refuserait de nombreux utilisateurs de l'utiliser - Donc pas une bonne idée pour une démo
Ne changez pas de choses dans votre ensemble d'applications. Il va casser CodeSigning (qui vous empêchera d'utiliser certaines caractéristiques du cadre de sécurité et du porte-clés) et, en général, il s'agit d'un signe de l'utilisateur que quelque chose afflige votre application, comme des logiciels malveillants.