ios - 如何使用 Keychain 保存密码,如 GenericKeychain 示例代码

标签 ios encryption passwords keychain

我想在App中保存用户的id和密码。

我保存id和密码时,推荐的加密方式是什么。

我正在从 Jailbreak 或 Hacker 中找到更安全的方法。

GenericKeychain 示例代码怎么样?

http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797

我对如何像 GenericKeychain 示例代码一样安全地使用 Keychain 没有信心。

请告诉我一些建议。谢谢^^*

最佳答案

您可以使用安全框架

#import <Security/Security.h>

为服务器保存用户名和密码:

-(void) saveUsername:(NSString*)user withPassword:(NSString*)pass forServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, nil];

    // Remove any old values from the keychain
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict);

    // Create dictionary of parameters to add
    NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding];
    dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, passwordData, kSecValueData, user, kSecAttrAccount, nil];

    // Try to save to keychain
    err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL);

}

删除:

-(void) removeAllCredentialsForServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil];

    // Remove any old values from the keychain
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict);

}

阅读:

-(void) getCredentialsForServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil];

    // Look up server in the keychain
    NSDictionary* found = nil;
    CFDictionaryRef foundCF;
    OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF);

    // Check if found
    found = (__bridge NSDictionary*)(foundCF);
    if (!found) 
        return;

    // Found
    NSString* user = (NSString*) [found objectForKey:(__bridge id)(kSecAttrAccount)];
    NSString* pass = [[NSString alloc] initWithData:[found objectForKey:(__bridge id)(kSecValueData)] encoding:NSUTF8StringEncoding];

}

关于ios - 如何使用 Keychain 保存密码,如 GenericKeychain 示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535639/

相关文章:

mysql - Nodejs、Express 和 mysql

ios - 如何在附加到 iOS 的 lldb 中手动生成核心转储(或等效文件)

ios - Alamofire 传递具有公共(public)键和多个值的参数?

Java 等效于 C# AES 加密

android - 如何使用公共(public)加密来管理 Android 应用程序的许可?

c - 不以 root 身份运行时如何在 linux 中检查登录凭据?

linux - 应用程序如何在一段时间内记住身份验证?

ios - 如何使用包含多个导航 Controller 的 View 层次结构弹出到 Root View Controller

ios - 在 CellForRowAtIndexPath 中访问 UITextField

c - 我的 Blowfish 算法是 "standard"吗?