2010-08-13 1 views
7

Ich versuche, einen Testteil meiner Kakaoanwendung zu erstellen. Ich habe die Lizenzierung alle eingerichtet (inkl. Schlüssel) etc.Wie kann ich Daten sicher mit Ziel C speichern? (Mac/Cocoa Dev)

Aber ich habe mich gefragt wie ich zB das erste Mal speichern konnte, wenn der User das Programm an einem sicheren Ort abspielte, wo der User es nicht einfach finden konnte und/oder bearbeiten Sie es.

Ich hatte eine Geige mit NSUserDefaults standardUserDefaults, aber der Benutzer kann diese Daten in Library> Preferences leicht finden und bearbeiten.

+0

Das Speichern innerhalb des Anwendungspakets ist möglicherweise * etwas * schwieriger für den Benutzer zu umgehen. Es hängt davon ab, wie gut der Schutz sein soll. – David

+0

Es muss ziemlich gut sein, weil ich nicht möchte, dass der Benutzer die Anwendung überhaupt nach Ablauf der Testversion verwenden kann – Daniel

+0

Ich habe gerade NSUserDefaults gesucht encodeObject: forKey :, werden sie vielleicht ausreichen? – Daniel

Antwort

21

Ich würde dagegen argumentieren, es supersicher zu machen. Wir hatten einmal eine Serveraktivierung, aber wir haben uns komplett davon entfernt. Hier sind einige der Gründe:

  • Selbst die „sichere“ Speicherverfahren gebrochen werden kann
  • Selbst für ein Nischenprodukt ein Riss entwickelt werden könnten, keinen Weg, um, egal wie sicher Ihre Methode
  • Es gibt wenige, sehr teure, sehr sichere Methoden.Alle anderen haben
  • geknackt geht es gegen faire und ehrliche Benutzer, so dass es schwieriger für sie Dinge zu beheben Probleme verursachen
  • Wenn ein Benutzer ist Ihre Software zu knacken oder umgeht Ihre Sicherheit, er wird wahrscheinlich auch nie haben kaufte es
  • 80% der Nutzer nicht einmal wissen, was eine Einstellungsdatei ist
  • 95% aller Nutzer denken nicht an die Möglichkeit, es zu löschen, um den Versuch
  • eine einfache Art und Weise zu erweitern Testzeiten zurücksetzen massiv erleichtert Ihre Unterstützung für Benutzer, die Sie w Ameise einen zweiten Versuch aus irgendeinem Grund
  • Trusting Nutzer geben ein gutes Verkaufsargument
  • Power-User gegen Software
  • mit zu viel Schutz drehen neigen

Ich bin mir ziemlich sicher, dass es einige gibt, aber extrem wenige, Ausnahmen von diesen Gedanken. Ich würde sagen: Verschwenden Sie nicht Ihre Zeit auf Registrierungssicherheit, aber geben Sie

+1

Ich stimme zu, verschwende nicht zu viele Ressourcen, um deine App super sicher zu machen. Hacker werden einen Weg finden, um es zu umgehen. –

+1

http://www.aquaticmac.com/ ist ein guter Tropfen in Lösung für die Sicherheit. http://aquaticmac.com/cocoa.php hat auch eine schöne Erweiterung auf NSData, um die Verschlüsselung durchzuführen. Wenn Sie% 99 der Benutzer abdecken möchten, würde ich den Ansatz der versteckten Datei mit einem offensichtlichen Namen empfehlen, zB ". " – Intentss

2

Versuchen Sie, eine Datei zu speichern, deren Name mit einem Punkt in einem Ordner beginnt, und dann das ausgeblendete Flag der Datei zu setzen.

ein guter Platz, um die versteckte Datei zu legen, wäre eine obskure benannte Datei in der Basis des Benutzerordners (~ /), es gibt viele obskure versteckte Dateien, daher ist es schwer zu wissen, welche man kann und kann ' t löschen. Beispiel Pfad: ~/.xdarwinprofile oder etwas ebenso offiziell klingen.

hier ist ein Code, der die Datei verstecken sollte funktionieren:

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

Ich änderte den Code aus der Antwort auf diese Frage, Sie weitere hilfreiche Informationen dort finden können: How to make a file invisible in Finder using objective-c

Ich habe habe diesen Code nicht getestet, aber es sollte funktionieren. In der Tat ist es möglich, dass der Code nicht notwendig ist und nur die Datei mit einem Punkt vor dem Dateinamen speichern funktioniert.

Wenn Sie Administratorrechte haben, können Sie einen sudo chmod für die Datei ausführen und ihn so einstellen, dass er nur liest, wenn Sie möchten. Sie sollten Ihre App jedoch nicht nach dem Passwort fragen lassen.

3

Wenn Sie müssen, ist eine einfache und übliche Möglichkeit, einen Schlüssel zu verwenden, der in der Anwendung eingebettet ist, die eine Datei auf der Festplatte verschlüsselt, die das enthält sensible Daten. Die Herausforderung besteht darin, den Schlüssel zu sichern.

Schauen Sie in die Digest-Bibliothek Common Crypto.

Dies schützt vor fast allen gelegentlichen Benutzern. Hacker können zwar mit genügend Motivation einen Umgehungsweg finden.

4

Sie können keine Datei im Dateisystem verwenden. Jeder, der es ausprobieren oder knacken möchte, wird schlau genug sein, um den Dateizugriff über grundlegende Standard-OSX-Funktionen zu verfolgen. Also eine Datei hinzugefügt wird, ist out. Nicht nur das, aber es ist ein schlechtes Verhalten, Dateien zu erstellen, die Sie nicht entfernen, wenn die App deinstalliert wird. Personen sollten nach dem Löschen Ihrer Test-App keine Ressourcen verbrauchen.

Wie bereits erwähnt, ist es auch eine schlechte Idee, in Ihrem Paket herumzualbern. Dies gibt Ihnen drei grundlegende Optionen.

1) Mach dir keine Sorgen zu viel. Verwenden Sie ein einfaches Ablaufsystem, das die Standardspeicherorte und -methoden verwendet. Sie können weiterhin Verschlüsselung in den Daten verwenden, die Sie speichern, aber wissen Sie, dass auch das kaputt gehen wird. Akzeptieren Sie, dass eine Urheberrechtsverletzung eintritt, sofern Ihre App nicht völlig unpopulär ist.

2) Verwenden Sie einen Netzwerkanruf und führen Sie die Überprüfung auf dem Server durch. Dies würde erfordern, dass die App immer in der Lage ist, Ihren Dienst zu erreichen, um ausgeführt zu werden. Dies ist im Allgemeinen keine gute Idee. Was ist, wenn Ihre Server ausgefallen sind? Was ist, wenn sie offline sind? Was passiert, wenn ein Netzwerkproblem zwischen Ihnen und Ihnen auftritt? Alle diese Szenarien werden passieren. Wenn dies der Fall ist, werden Sie wahrscheinlich Kunden verlieren, es sei denn, Ihre App benötigt bereits eine Verbindung zu Ihren Servern (wie beispielsweise Twitter oder Facebook).

3) Seien Sie ein "böser Bürger", indem Sie sich mit dem Anwendungspaket herumärgern oder verwaiste Dateien zurücklassen. Wenn Sie dies tun, stellen Sie zumindest sicher, dass sie eindeutig benannt sind, so dass sie sich offensichtlich auf Ihre Bewerbung beziehen.

Letztendlich ist es wichtig, dass Sie keine Sicherheit auf dem Computer eines Benutzers haben. Es gehört ihnen. Das bedeutet, dass sie physischen Zugang haben, der jeden Versuch, sie daran zu hindern, zu graben, ziemlich zunichte macht. Sie können es auch so sehen: Je technisch orientierter Ihr Markt ist, desto unwahrscheinlicher werden Sie schlauer als wir alle und Ihre "Sicherheit" wird geknackt werden.Wenn Sie für ein nicht-technisches Publikum entwerfen, dann können Sie sich vorstellen, dass es im Allgemeinen nicht darum geht, es zu knacken oder nach einem zu suchen.

Sie können Ihre Ressourcen dafür verwenden, die App besser zu machen, oder Ihnen ein besseres Gefühl geben, wenn Sie sie nach der Testphase nicht mehr verwenden. Einer davon kann Ihren Umsatz steigern und einer wird nicht.

[edit] Auch sollte ich darauf hinweisen, dass eine der häufigsten (wenn nicht das üblichste) Mittel, diese Dinge zu knacken, die Binärdatei zu ändern ist. Wenn Sie also Code-Signing durch Bündel-Mucking brechen, würden Sie sich tatsächlich für diese Methode öffnen, weil Sie einen der besseren Schutzmechanismen, die Sie haben, gebrochen hätten. Bei den meisten Rissen werden Binärdateien so geändert, dass die Routine, die die Prüfungen durchführt, immer eine erfolgreiche Authentifizierung zurückgibt.

3

Allan Odgaard hat eine ziemlich gute writeup wie OpenSSL verwendet wird, um Lizenzschlüssel für Cocoa Software zu generieren/zu speichern. Könnte es wert sein gelesen zu werden.

0

Diese Lösung hat für mich sehr gut funktioniert. Versuchen Sie Folgendes: https://github.com/nielsmouthaan/SecureNSUserDefaults. Es wird verschlüsselt bool/string/float/integer in Ihrer UserDefaults-Datei gespeichert. Hoffentlich ist das was du willst. Stellen Sie sicher, dass Sie CocoaSecurity (siehe die GitHub-Seite von SecureNSUserDefaults für den Download-Link) zu Ihrem Projekt herunterladen und hinzufügen. CocoaSecurity ist ein erforderliches Element von SecureNSUSerDefaults, sodass Sie es nicht in eine Ihrer Dateien importieren müssen. Sie müssen auch Base64 herunterladen, was ein erforderliches Element von CocoaSecurity ist. Sie müssen Ihrem Projekt auch Base64 hinzufügen, müssen es jedoch nicht in eine Ihrer Dateien importieren.

USAGE

Importieren Sie die Header-Datei überall wollen Sie die Verschlüsselungsmethode verwenden.

#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h> 

Dann setzte einen Verschlüsselungsschlüssel, wahrscheinlich in Ihrer awakeFromNib Methode:

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

empfehle ich eine zufällige Folge von Zahlen und Buchstaben zu erzeugen. Dann müssen Sie die Informationen in Ihrer UserDefaults-Datei speichern.

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

die Zeichenfolge abzurufen, verwenden Sie diese Methode:

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

Ich hoffe, das hilft!

Verwandte Themen