2016-08-08 71 views
1

Ich möchte einige grundlegende Informationen speichern und in denen einige vertrauliche Daten sind.Speichern von Informationen über Benutzer in iOS

Die Informationen Ich möchte in der Regel speichern ist:

username 
identityId (unique user identityid for amazon users) 
some other basic user details 
email (but no passwords stored) 

ich gelesen, dass NSUserDefaults ist einfach zu hacken oder zu sehen und einige dieser wie Benutzernamen zu speichern und identityId ist nicht gut genug, um mit. Sollte ich Kerndaten oder etwas anderes verwenden? Muss ich die Kerndaten verschlüsseln? Die Daten sind nicht sehr sensibel, aber ich möchte trotzdem auf die Seite der Vorsicht hinweisen. Es wäre technisch ein Stück Daten für den angemeldeten Benutzer und gelöscht, wenn sich der Benutzer abmeldet.

Jedes einfache Tutorial auf einem Datensatz Kerndatendatei wäre großartig.

+0

Wenn Sie nur über einen Benutzer, wie ein Login-Info sensible Daten speichern, sollten Sie KeyChain verwenden. – Larme

Antwort

0

Verwenden Schlüsselkette, diese Art von Daten zu speichern:

import UIKit 
import Security 

// Identifiers 
let serviceIdentifier = "MySerivice" 
let userAccount = "authenticatedUser" 
let accessGroup = "MySerivice" 

// Arguments for the keychain queries 
let kSecClassValue = kSecClass.takeRetainedValue() as NSString 
let kSecAttrAccountValue = kSecAttrAccount.takeRetainedValue() as NSString 
let kSecValueDataValue = kSecValueData.takeRetainedValue() as NSString 
let kSecClassGenericPasswordValue = kSecClassGenericPassword.takeRetainedValue() as NSString 
let kSecAttrServiceValue = kSecAttrService.takeRetainedValue() as NSString 
let kSecMatchLimitValue = kSecMatchLimit.takeRetainedValue() as NSString 
let kSecReturnDataValue = kSecReturnData.takeRetainedValue() as NSString 
let kSecMatchLimitOneValue = kSecMatchLimitOne.takeRetainedValue() as NSString 

class KeychainService: NSObject { 

    /** 
    * Exposed methods to perform queries. 
    * Note: feel free to play around with the arguments 
    * for these if you want to be able to customise the 
    * service identifier, user accounts, access groups, etc. 
    */ 
    public class func saveToken(token: NSString) { 
    self.save(serviceIdentifier, data: token) 
    } 

    public class func loadToken() -> NSString? { 
    var token = self.load(serviceIdentifier) 

    return token 
    } 

    /** 
    * Internal methods for querying the keychain. 
    */ 
    private class func save(service: NSString, data: NSString) { 
    var dataFromString: NSData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 

    // Instantiate a new default keychain query 
    var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue]) 

    // Delete any existing items 
    SecItemDelete(keychainQuery as CFDictionaryRef) 

    // Add the new keychain item 
    var status: OSStatus = SecItemAdd(keychainQuery as CFDictionaryRef, nil) 
    } 

    private class func load(service: NSString) -> NSString? { 
    // Instantiate a new default keychain query 
    // Tell the query to return a result 
    // Limit our results to one item 
    var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue]) 

    var dataTypeRef :Unmanaged<AnyObject>? 

    // Search for the keychain items 
    let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) 

    let opaque = dataTypeRef?.toOpaque() 

    var contentsOfKeychain: NSString? 

    if let op = opaque? { 
     let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue() 

     // Convert the data retrieved from the keychain into a string 
     contentsOfKeychain = NSString(data: retrievedData, encoding: NSUTF8StringEncoding) 
    } else { 
     println("Nothing was retrieved from the keychain. Status code \(status)") 
    } 

    return contentsOfKeychain 
    } 
} 

Nutzungs

KeychainService.saveToken("token") 
KeychainService.loadToken() 

(von Beispielcode: http://matthewpalmer.net/blog/2014/06/21/example-ios-keychain-swift-save-query/)

oder einen "Schlosser" verwenden, viel sauberer und einfacher:

https://github.com/matthewpalmer/Locksmith

+0

Ich muss dies auf objective-c übertragen, da meine App noch nicht von diesem übertragen wurde. – cdub

0

Sie können in Md5 + Salz berücksichtigen, dann in NSUserDefault speichern.

0

Sie können Ihre Daten in zwei Formen speichern:

  1. Core Data: also wenn der Hacker muss die App (Benutzer) Informationen extrahieren. Er benötigt das Benutzergerät, um die SQL-Datei der Coredatenbasis zu extrahieren. Und dann müssen Sie seine verschlüsselte Form in verständliche Form umwandeln.

  2. Zweitens können wir hier tun. Wir können die API erstellen, um die App (Benutzer) Informationen zu speichern. und jedes Mal, wenn wir die Benutzerdaten extrahieren müssen, können wir den Dienst in Viewdidload starten.

(Nj)