2014-07-20 177 views

回答

4

NSUserDefaults的不来存储这类信息的正确的地方。最好的方法是隐藏Keychain中的用户分数,这样任何人都无法破解它(也许游戏分数与您的货币化想法相关)。

其他好处是,钥匙串可以通过iCloud无缝同步,“这只是作品”。

存储玩家高分的最好方法是在项目中使用以下代码。 下面的方法将帮助您节省在钥匙串中的一些值:

- (void) setValue: (NSData *) value forAccount: (NSString *) account service: (NSString *) service { 
    NSDictionary *searchDict = @{ 
     (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, 
     (__bridge id) kSecMatchLimit: (__bridge id) kSecMatchLimitOne, 
     (__bridge id) kSecAttrService: service, 
     (__bridge id) kSecAttrAccount: account, 
     (__bridge id) kSecReturnData: @YES, 
    }; 
    CFDataRef keyData = NULL; 
    SecItemCopyMatching ((__bridge CFDictionaryRef) searchDict, (CFTypeRef *) &keyData); 

    if (keyData) { 
     CFRelease (keyData); 
     NSDictionary *removeDict = @{ 
      (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, 
      (__bridge id) kSecAttrService: service, 
      (__bridge id) kSecAttrAccount: account, 
     }; 
     SecItemDelete ((__bridge CFDictionaryRef) removeDict); 
    } 

    if (value) { 
     NSDictionary *writeDict = @{ 
      (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, 
      (__bridge id) kSecAttrService: service, 
      (__bridge id) kSecAttrAccount: account, 
      (__bridge id) kSecValueData: value, 
     }; 
     SecItemAdd ((__bridge CFDictionaryRef) writeDict, NULL); 
    } 
} 
  • 其中value是您的用户评分归档到NSData的

收拾整成NSData的:

NSUInteger score = <some number>; 
NSData *dataValue = [NSData dataWithBytes:&score length:sizeof(score)]; 

打开包装:

NSUInteger score; 
[dataValue getBytes:&score length:sizeof(score)]; 
  • account - 是你的价值的名称,例如@“userScore”,或得分某些用户@“ForzenHeart_Score”
  • service - 是你的应用程序的名称,你可以用你的包ID [[NSBundle mainBundle] bundleIdentifier]

摆脱钥匙扣保存的数据,使用此方法:

- (NSData *) valueForAccount: (NSString *) account service: (NSString *) service { 
    NSDictionary *searchDict = @{ 
     (__bridge id) kSecClass: (__bridge id) kSecClassGenericPassword, 
     (__bridge id) kSecMatchLimit: (__bridge id) kSecMatchLimitOne, 
     (__bridge id) kSecAttrService: service, 
     (__bridge id) kSecAttrAccount: account, 
     (__bridge id) kSecReturnData: @YES, 
    }; 
    CFDataRef keyData = NULL; 
    SecItemCopyMatching ((__bridge CFDictionaryRef) searchDict, (CFTypeRef *) &keyData); 
    return (__bridge_transfer NSData *) keyData; 
} 

而且不要忘了擦拭所有与用户相关的d ata当你必须时,只需通过nil作为value参数为-(void)setValue...上面列出的方法。

0

NSUSerDefaults in 从来没有安全。

要么使用iOS版钥匙扣或将数据上传到服务器(最可靠的方法)

+0

为什么NSUSerDefaults不安全? – FrozenHeart

+0

@FrozenHeart这里的详细解释 - http://www.andyibanez.com/nsuserdefaults-not-for-sensitive-data/ –

+0

我认为问题不是隐藏/确保高分,但它是NSUserDefaults是可靠的或不。 – mohacs

0

没有NSUserDefaults不是safe.You可以使用Keychain

NSUserDefaults的内容以纯文本形式存储。他们可以访问和修改工具,如iExplorer越狱。

如果不是,你可以去NSUserDefaults

0

一般的问题,NSUserDefaults应该只包含可以由用户来改变设置。您的应用的内部数据不应存储在NSUserDefaults中。

使用iOS Keychain来存储真正安全的数据。

或者,您可以使用加密算法(例如AES)加密存储在NSUserDefaults中的数据,或将其保存在字典中并将其写入文件。

1

NSUserDefaults不安全,因为默认值实际上被键入到设备中本地存储在应用程序文件夹中的.plist文件中。这是目录:.../YourApp.app/Library/Preferences/appBundleName.plist。这可以非常容易地通过设备上下的工具进行修改和查看,并且不需要越狱设备进行脱机查看。正如其他人所建议的那样,使用iOS Keychain来增加安全性。此外,这里还有一个开源的库,用于保护iOS中的默认设置:Secure-NSUserDefaults

要直接回答您的问题,对于您不希望用户间接修改的任何敏感数据,这是不够安全。可以轻松地访问和修改NSUserDefaults。不要将加密数据存储在NSUserDefaults中,因为它也可以轻松访问。攻击者不会轻易解密数据,但他们仍然可以轻松访问它。 iOS Keychain也不是很安全,因为内容也可以轻松转储,但不能解密。不过为了您的目的,iOS钥匙串没有问题。

0

请勿使用NSUserDefaults在本地保存任何东西。这是不安全的。您应该存储在其被加密的keychain得分,还有小包装类,使保存用户名/密码keychain非常简单:

Click here to Know more

0

我经常选择coredata这样的情况。关于这一点,有很多方便的&安全框架。现在我使用MagicalRecord框架。这是有用和常用的框架。

您只需将您的模型和decare魔法记录框架创建到您的AppDelegate.m文件。并且您想要正确保存数据的任何地方

相关问题