2010-08-13 20 views
7

Tôi đang cố gắng tạo một phần dùng thử của ứng dụng ca cao của mình. Tôi đã cấp phép tất cả (bao gồm cả khóa), v.v.Làm cách nào để lưu trữ dữ liệu an toàn với C mục tiêu? (Mac/Cocoa Dev)

Nhưng tôi đã tự hỏi làm cách nào để lưu trữ, ví dụ như lần đầu tiên người dùng chạy chương trình ở nơi an toàn, nơi người dùng không thể dễ dàng tìm thấy nó và/hoặc chỉnh sửa nó.

Tôi đã có một fiddle với NSUserDefaults standardUserDefaults, nhưng người dùng có thể dễ dàng tìm và chỉnh sửa dữ liệu đó trong Library> Preferences.

+0

Lưu trữ nó trong gói ứng dụng có thể * hơi * khó khăn hơn cho người dùng để phá vỡ. Nó phụ thuộc vào cách bạn muốn bảo vệ tốt như thế nào. – David

+0

Nó phải khá tốt vì tôi không muốn người dùng có thể sử dụng ứng dụng sau khi hết thời gian dùng thử – Daniel

+0

Tôi chỉ đang xem NSUserDefaults encodeObject: forKey :, có thể họ sẽ đủ? – Daniel

Trả lời

21

Tôi muốn tranh luận chống lại việc bảo mật siêu an toàn. Chúng tôi đã từng kích hoạt máy chủ nhưng hoàn toàn biến mất khỏi nó. Dưới đây là một số lý do:

  • Ngay cả những phương pháp lưu trữ "an toàn" nhất có thể được chia
  • Ngay cả đối với một sản phẩm thích hợp một vết nứt có thể được phát triển, không có cách nào xung quanh, bất kể như thế nào đảm bảo phương pháp của bạn
  • Có rất ít, rất tốn kém, phương pháp rất an toàn.Tất cả những người khác đã bị nứt
  • Nó đi ngược lại người sử dụng công bằng và trung thực, làm cho nó khó khăn hơn cho họ để sửa chữa những thứ gây ra vấn đề
  • Nếu người dùng không bẻ khoá phần mềm của bạn hoặc làm hỏng tính bảo mật của bạn, anh ta sẽ có lẽ cũng không bao giờ có đã mua nó
  • 80% số người dùng thậm chí không biết những gì một tập tin sở thích là
  • 95% của tất cả người sử dụng không nghĩ đến khả năng để xóa nó để mở rộng thử nghiệm
  • một cách đơn giản để đặt lại thời gian dùng thử ồ ạt giảm bớt hỗ trợ của bạn cho người dùng bạn kiến để cung cấp cho một thử nghiệm thứ hai vì lý do gì
  • người dùng Tin tưởng là một điểm bán hàng tốt
  • Người dùng thành thạo có xu hướng quay lại tấn công phần mềm với bảo vệ quá nhiều

Tôi khá chắc chắn rằng có một số người, nhưng rất ít, ngoại lệ từ những suy nghĩ này. Tôi muốn nói: đừng lãng phí thời gian của bạn vào bảo mật đăng ký nhưng hãy cung cấp

+1

Tôi đồng ý, đừng lãng phí quá nhiều tài nguyên khiến ứng dụng của bạn cực kỳ an toàn. Tin tặc sẽ tìm cách vượt qua nó. –

+1

http://www.aquaticmac.com/ là một giải pháp tốt về an ninh. http://aquaticmac.com/cocoa.php cũng có phần mở rộng tốt đẹp trên NSData để thực hiện mã hóa. Nếu bạn muốn bao gồm% 99 người dùng, tôi sẽ đề xuất phương pháp tiếp cận tệp ẩn với tên rõ ràng là ". " – Intentss

2

Thử lưu trữ tệp có tên bắt đầu bằng dấu chấm trong một số thư mục và sau đó đặt cờ ẩn của tệp.

một nơi tốt để đặt tệp ẩn sẽ là một tệp được đặt tên không đúng tên trong thư mục người dùng (~ /), có rất nhiều tệp bị che khuất ở đó nên khó biết ai là người bạn có thể và có thể ' t xóa. đường dẫn mẫu: ~/.xdarwinprofile hoặc âm thanh chính thức.

đây là một số mã mà nên làm việc để ẩn các tập tin:

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

tôi sửa đổi mã này từ câu trả lời cho câu hỏi này, bạn có thể tìm thấy thông tin hữu ích hơn đó: How to make a file invisible in Finder using objective-c

Tôi có không kiểm tra mã này nhưng nó sẽ hoạt động. Trong thực tế, có thể mã không cần thiết và chỉ lưu tệp có dấu chấm ở trước tên tệp sẽ hoạt động.

Nếu bạn có đặc quyền của quản trị viên, bạn có thể thực thi sudo chmod trên tệp và đặt nó thành chỉ đọc nếu bạn muốn, nhưng bạn không nên yêu cầu người dùng nhập mật khẩu của họ.

3

Nếu bạn phải, một cách đơn giản và phổ biến là sử dụng khóa được nhúng trong ứng dụng mã hóa tệp trên đĩa chứa dữ liệu nhạy cảm. Thách thức là làm thế nào để làm cho chìa khóa an toàn.

Nhìn vào thư viện thông báo Common Crypto.

Điều này sẽ bảo vệ khỏi hầu hết người dùng thông thường. Mặc dù tin tặc có thể, với đủ động lực, tìm ra cách để vượt qua.

4

Bạn không thể sử dụng tệp trên hệ thống tệp. Bất cứ ai sẽ tìm kiếm để fiddle/crack nó sẽ được thông minh, đủ để biết làm thế nào để theo dõi truy cập tập tin thông qua các tính năng cơ bản, tiêu chuẩn OSX. Vì vậy, một tập tin được thêm vào là ra ngoài. Không chỉ vậy nhưng hành vi xấu là tạo các tệp bạn không xóa khi ứng dụng được gỡ cài đặt. Mọi người không cần phải có tài nguyên tiêu thụ sau khi xóa ứng dụng dùng thử của bạn.

Như đã lưu ý ở trên, sự lộn xộn trong gói của bạn cũng là một ý tưởng tồi. Điều này khiến bạn có ba lựa chọn cơ bản.

1) Đừng lo lắng quá nhiều. Sử dụng hệ thống hết hạn cơ bản sử dụng các vị trí và phương pháp chuẩn. Bạn vẫn có thể sử dụng mã hóa trong dữ liệu bạn lưu trữ, nhưng biết rằng mã hóa cũng sẽ bị hỏng. Chấp nhận rằng vi phạm bản quyền sẽ xảy ra trừ khi ứng dụng của bạn hoàn toàn không được ưa chuộng.

2) Sử dụng cuộc gọi mạng và thực hiện xác thực trên máy chủ. Điều này sẽ yêu cầu ứng dụng luôn có thể tiếp cận dịch vụ của bạn để chạy. Đây không phải là một ý tưởng hay nói chung. Điều gì xảy ra nếu máy chủ của bạn bị hỏng? Điều gì nếu họ là off-line? Điều gì sẽ xảy ra nếu vấn đề về mạng giữa bạn và chúng xảy ra? Tất cả những kịch bản đó sẽ xảy ra. Khi họ làm bạn có thể sẽ mất khách hàng trừ khi ứng dụng của bạn yêu cầu kết nối với máy chủ của bạn đã hoạt động (như nói Twitter hay Facebook).

3) Là một "công dân xấu" bằng cách nhét xung quanh với gói ứng dụng hoặc để lại các tệp mồ côi xung quanh. Nếu bạn làm điều này sau, ít nhất hãy chắc chắn rằng họ được đặt tên rõ ràng để họ liên quan đến ứng dụng của bạn rõ ràng.

Cuối cùng, điều quan trọng cần nhớ là bạn không có bảo mật trên máy của người dùng. Nó là của họ. Điều đó có nghĩa là họ có quyền truy cập vật lý mà khá nhiều vô hiệu hóa bất kỳ nỗ lực để ngăn chặn chúng đào bới. Bạn cũng có thể nhìn vào nó theo cách này: thị trường của bạn càng kỹ thuật hơn, bạn ít có khả năng thông minh hơn tất cả chúng ta và "bảo mật" của bạn sẽ bị bẻ khóa.Nếu bạn đang thiết kế cho một đối tượng phi kỹ thuật thì bạn có thể hình dung rằng nói chung họ sẽ không làm phiền với việc nứt nó, hoặc tìm kiếm một.

Bạn có thể chi tiêu tài nguyên của mình để cải thiện ứng dụng hoặc tạo cho mình cảm giác tốt hơn về những người không sử dụng nó trong thời gian dùng thử. Một trong số đó có thể tăng doanh số bán hàng của bạn và sẽ không tăng.

[sửa] Ngoài ra tôi nên chỉ ra rằng một trong những cách phổ biến nhất (nếu không phải là phổ biến nhất) có nghĩa là bẻ khóa những thứ này là sửa đổi nhị phân. Vì vậy, bằng cách phá vỡ mã ký thông qua bó mucking bạn thực sự sẽ mở cho mình phương pháp đó bởi vì bạn sẽ có một trong những bảo vệ tốt hơn bạn có. Hầu hết các vết nứt liên quan đến các tệp nhị phân được sửa đổi sao cho thường trình thực hiện kiểm tra luôn trả về xác thực thành công.

3

Allan Odgaard có phong cách khá đẹp writeup về cách sử dụng OpenSSL để tạo/lưu trữ khóa cấp phép cho phần mềm Cocoa. Có thể đáng đọc.

0

Giải pháp này phù hợp với tôi rất tốt. Hãy thử cách này: https://github.com/nielsmouthaan/SecureNSUserDefaults. Nó sẽ lưu trữ bool/string/float/integer được mã hóa trong tệp UserDefaults của bạn. Hy vọng rằng đây là những gì bạn muốn. Đảm bảo bạn tải xuống và thêm CocoaSecurity (Xem trang SecureNSUserDefaults GitHub cho liên kết tải xuống) vào dự án của bạn. CocoaSecurity là một phần tử cần thiết của SecureNSUSerDefaults, vì vậy bạn không cần nhập nó vào bất kỳ tệp nào của bạn. Bạn cũng phải tải xuống Base64, là yếu tố bắt buộc của CocoaSecurity. Bạn cũng cần phải thêm Base64 vào dự án của bạn, nhưng không cần phải nhập nó vào bất kỳ tệp nào của bạn.

SỬ DỤNG

Import file header bất cứ nơi nào bạn muốn sử dụng phương pháp mã hóa.

#import <SecureNSUserDefaults/NSUserDefaults+SecureAdditions.h> 

Sau đó, thiết lập một khóa mã hóa, lẽ trong awakeFromNib phương pháp của bạn:

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

tôi khuyên bạn nên tạo một chuỗi ngẫu nhiên các con số và chữ cái. Sau đó, bạn phải lưu trữ thông tin trong tệp UserDefaults của mình.

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

Để lấy chuỗi, sử dụng phương pháp này:

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

Tôi hy vọng điều này sẽ giúp!

Các vấn đề liên quan