2010-08-13 47 views
7

我正在嘗試創建我的可可應用程序的試用版。我有所有設置的許可(包括鍵)等如何用目標C安全地存儲數據? (Mac/Cocoa Dev)

但我想知道如何我可以存儲,例如第一次用戶在安全的地方運行程序,用戶不能輕易找到它, /或編輯它。

我有一個NSUserDefaults standardUserDefaults的小提琴,但用戶可以很容易地在庫>首選項中查找和編輯這些數據。

+0

將其存儲在應用程序捆綁包中可能會稍微難以讓用戶繞過。這取決於你想要保護的有多好。 – David 2010-08-13 08:58:50

+0

它得是相當不錯的,因爲我不希望用戶能夠使用應用程序的試用期結束 – Daniel 2010-08-13 08:59:38

+0

在我畢竟只是看着NSUserDefaults的encodeObject:forKey:,也許他們會是足夠的? – Daniel 2010-08-13 09:00:13

回答

21

我會反對讓它超級安全。我們曾經有一個服務器激活,但完全離開它。下面是一些原因:

  • 即使是最「安全」的存儲方法可以打破
  • 即使是小衆產品的裂縫可能被開發,沒有辦法解決,不管如何保護你的方法
  • 有很少,非常昂貴,非常安全的方法。所有的人都被破解
  • 它違背了公平和誠實的用戶,使得他們更難解決的事情造成的問題
  • 如果用戶確實破解軟件或繞過您的安全,他很可能也永遠不會有買了它的用戶
  • 80%,甚至不知道偏好文件是什麼
  • 所有用戶的
  • 95%的人不認爲的可能性,將其刪除,以延長試用
  • 的一種簡單方法重置試用期大規模減輕您對用戶的支持w螞蟻給無論出於何種原因
  • 信任用戶的二審判決是一個很好的賣點
  • 電力用戶往往會轉而反對軟件太多的保護

我敢肯定有一些,但極少數,這些想法的例外。我會說:不要浪費你的時間在註冊安全,但給

+1

我同意,不要浪費太多資源,使您的應用程序超級安全。黑客會找到一種方法來繞過它。 – 2010-08-30 14:30:07

+1

http://www.aquaticmac.com/是解決安全問題的好選擇。 http://aquaticmac.com/cocoa.php在NSData上也有很好的擴展來做加密。如果你想覆蓋99%的用戶,我會推薦隱藏文件的方法,用一個明顯的名字,例如「。」 – Intentss 2010-09-01 18:54:33

2

嘗試在某個文件夾中存儲名稱以句點開頭的文件,然後設置文件的隱藏標誌。

一個放置隱藏文件的好地方是在用戶文件夾(〜/)的底部有一個不明名稱的文件,那裏有很多隱藏的隱藏文件,所以很難知道你可以找到哪個文件,刪除。示例路徑:〜/ .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; 
} 

我修改從回答這個代碼這個問題,你可能會發現更多有用的信息有: How to make a file invisible in Finder using objective-c

我有沒有測試過這個代碼,但它應該工作。事實上,代碼是不必要的,只需要在文件名前面保存一個點即可。

如果您擁有管理員權限,您可以在文件上執行sudo chmod並將其設置爲只讀,但不應讓應用程序詢問用戶密碼。

3

如果你必須,一個簡單而常用的方法是使用一個密鑰嵌入在應用程序中加密磁盤上的文件,其中包含敏感數據。挑戰在於如何使密鑰安全。

查看Common Crypto摘要庫。

這可以保護幾乎所有的臨時用戶。雖然黑客有足夠的動機可以找出一種避開的方法。

4

您不能在文件系統上使用文件。任何想要搗鼓/破解它的人都會足夠聰明,知道如何通過基本的標準OSX功能來跟蹤文件訪問。所以一個文件被添加了。不僅如此,創建卸載應用程序時不會刪除的文件也是不好的行爲。刪除試用版應用後,用戶不應該有資源消耗。

如上所述,在你的包中搞亂也是一個壞主意。這給你三個基本的選擇。

1)不要擔心太多。使用使用標準地點和方法的基本到期系統。您仍然可以在存儲的數據中使用加密,但也知道這些也會被破壞。接受版權侵犯將發生,除非你的應用程序完全不受歡迎。

2)使用網絡調用並在服務器上進行驗證。這將需要應用程序始終能夠達到您的服務運行。一般來說,這不是一個好主意。如果你的服務器停機?如果他們離線?如果你和他們之間的網絡問題發生了怎麼辦?所有這些情景都將發生。當他們這樣做時,你可能會失去客戶,除非你的應用程序需要連接到已經運行的服務器(比如說Twitter或Facebook)。

3)通過亂用應用程序包或者離開孤立文件成爲「壞公民」。如果你這樣做,至少要確保它們的名字明確,以便它們明顯與你的應用程序相關。

最終要記住的關鍵是你在用戶的機器上沒有安全性。它們是他們的。這意味着他們擁有物理訪問權限,幾乎可以避免任何阻止他們進行挖掘的企圖。你也可以這樣看待它:你的市場越是專注於技術,你就越不可能比我們所有人都更聰明,你的「安全」將會被破解。如果你正在爲非技術性的觀衆進行設計,那麼你可以認爲一般來說他們不會打擾它或尋找一個。

您可以花製作的應用程序更好,或者給自己有關的人更好的感覺不使用它在試用期過後你的資源。其中之一可以增加您的銷售額,而其中一個則不會。

另外我應該指出,破解這些東西最常見的(如果不是最常見的)方法之一是修改二進制文件。因此,通過破壞代碼簽名,您實際上會打開自己的方法,因爲您會破壞您擁有的更好的保護之一。大多數裂縫涉及修改的二進制文件,以便執行檢查的例程始終返回成功的身份驗證。

3

艾倫Odgaard有一個關於如何使用OpenSSL生成可可軟件/存儲許可證密鑰相當不錯writeup。可能值得一讀。

0

這個解決方案對我非常有效。試試這個:https://github.com/nielsmouthaan/SecureNSUserDefaults。它會在你的UserDefaults文件中存儲加密的bool/string/float/integer。希望這是你想要的。確保您下載並添加CocoaSecurity(請參閱SecureNSUserDefaults GitHub頁面的下載鏈接)到您的項目中。 CocoaSecurity是SecureNSUSerDefaults的必需元素,因此您無需將其導入任何文件。您還必須下載Base64,這是CocoaSecurity的必需元素。您還需要將Base64添加到項目中,但不需要將其導入任何文件。

用法

導入頭文件中的任何地方,你要使用的加密方法。

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

我建議產生的數字和字母的隨機字符串:

#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h> 

然後,可能在你awakeFromNib方法設置加密密鑰,。 然後,您必須將信息存儲在您的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"]; 

我希望這有助於!