`
anlulu
  • 浏览: 43483 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios使用keychain保存用户名和密码

    博客分类:
  • ios
阅读更多

iOSkeychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。从ios 3.0开始,跨程序分享keychain变得可行。

下面就使用keychain来实现存取用户名和密码。

苹果已经有现成的类封装好了keychain,KeychainItemWrapper.hKeychainItemWrapper.m文件,可以在GenericKeychain实例里找到。

但是这里我只需要存取用户名和密码,就不用苹果提供的类了,自己写个简单的类来实现就好。

代码如下:

CHKeychain.h

 

  1. #import <Foundation/Foundation.h>  
  2. #import <Security/Security.h>  
  3.   
  4.   
  5. @interface CHKeychain : NSObject  
  6.   
  7. + (void)save:(NSString *)service data:(id)data;  
  8. + (id)load:(NSString *)service;  
  9. + (void)delete:(NSString *)service;  
  10.   
  11.   
  12. @end  



 

CHKeychain.m

 

  1. #import "CHKeychain.h"  
  2.   
  3. @implementation CHKeychain  
  4. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {  
  5.     return [NSMutableDictionary dictionaryWithObjectsAndKeys:  
  6.             (id)kSecClassGenericPassword,(id)kSecClass,  
  7.             service, (id)kSecAttrService,  
  8.             service, (id)kSecAttrAccount,  
  9.             (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,  
  10.             nil];  
  11. }  
  12.   
  13. + (void)save:(NSString *)service data:(id)data {  
  14.     //Get search dictionary  
  15.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  16.     //Delete old item before add new item  
  17.     SecItemDelete((CFDictionaryRef)keychainQuery);  
  18.     //Add new object to search dictionary(Attention:the data format)  
  19.     [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];  
  20.     //Add item to keychain with the search dictionary  
  21.     SecItemAdd((CFDictionaryRef)keychainQuery, NULL);  
  22. }  
  23.   
  24. + (id)load:(NSString *)service {  
  25.     id ret = nil;  
  26.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  27.     //Configure the search setting  
  28.     //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue  
  29.     [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];  
  30.     [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];  
  31.     CFDataRef keyData = NULL;  
  32.     if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {  
  33.         @try {  
  34.             ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData];  
  35.         } @catch (NSException *e) {  
  36.             NSLog(@"Unarchive of %@ failed: %@", service, e);  
  37.         } @finally {  
  38. }  
  39.     }  
  40.     if (keyData)   
  41.     CFRelease(keyData);  
  42.     return ret;  
  43. }  
  44.   
  45. + (void)delete:(NSString *)service {  
  46.     NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];  
  47.     SecItemDelete((CFDictionaryRef)keychainQuery);  
  48. }  
  49.   
  50.   
  51. @end  



 

首先需要定义几个字符串用来做key

 

  1. NSString * const KEY_USERNAME_PASSWORD = @"com.company.app.usernamepassword";  
  2. NSString * const KEY_USERNAME = @"com.company.app.username";  
  3. NSString * const KEY_PASSWORD = @"com.company.app.password";  

 

 

把用户名和密码存入keychain

 

  1. NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];  
  2. [usernamepasswordKVPairs setObject:txtfldUsername.text forKey:KEY_USERNAME];  
  3. [usernamepasswordKVPairs setObject:txtfldPassword.text forKey:KEY_PASSWORD];  
  4. [CHKeychain save:KEY_USERNAME_PASSWORD data:usernamepasswordKVPairs];  

 

 

keychain中取出用户名和密码:

 

  1. NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[CHKeychain load:KEY_USERNAME_PASSWORD];  
  2. txtfldUsername.text = [usernamepasswordKVPairs objectForKey:KEY_USERNAME];  
  3. txtfldPassword.text = [usernamepasswordKVPairs objectForKey:KEY_PASSWORD];  

 

 

删除一个keychain item:

 

  1. [CHKeychain delete:KEY_USERNAME_PASSWORD];  

 

这样一个简单的使用keychain存取用户名密码的功能就做好了。

另外附上一篇写得更详细的e文:http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html

分享到:
评论

相关推荐

    keychain存取用户名和密码

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。 苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m...

    保存用户名、密码等敏感数据的方法, Keychain DEMO

    在实际应用中,使用Keychain不仅限于保存用户名和密码,还可以用于存储其他敏感信息,如API密钥、证书、OAuth令牌等。同时,Keychain支持跨应用共享,允许指定的其他应用访问同一Keychain Item,这对于多应用生态...

    ios-keychain.zip

    在`ios-keychain.zip`中,可能包含了一个简单的Swift或Objective-C示例,展示如何使用`Keychain`来存储和检索用户名。通常,使用`Keychain`的步骤如下: 1. 引入`Keychain`相关的库:由于Apple并没有提供直接操作`...

    最新IOS KeyChain的封装

    1. **Keychain Item**: Keychain中的每一项数据被称为Keychain Item,它可以是用户名和密码、证书、密钥或任何其他类型的数据。 2. **Service**: Keychain Item可以归类到特定的服务(Service)下,同一个服务下的...

    iOS KeyChain

    例如,通过SFHFKeychainUtils,你可以轻松地将用户的登录凭证(如用户名和密码)存入KeyChain,然后在需要时检索出来,无需担心数据的安全性。 另一个值得提及的工具是“Keychain ItemWrapper”,这是一个面向对象...

    iOS--keychain库

    在iOS开发中,Keychain库是一个非常重要的工具,它用于安全地存储用户的敏感信息,如密码、证书和访问令牌。Keychain服务通过提供一个统一的接口来管理这些数据,确保了数据的安全性和隐私性,避免了明文存储带来的...

    iOS KeyChain demo(数据AES加密)

    1. `saveData`: 将数据(如用户名和密码)加密后保存到Keychain。 2. `getData`: 从Keychain中检索数据,并解密返回。 3. `deleteData`: 删除Keychain中的特定数据项。 4. `updateData`: 更新Keychain中的数据。 ...

    iOS中利用KeyChain保存用户信息的方法示例

    在iOS开发中,为了安全地存储用户敏感信息如用户名和密码,开发者通常会采用系统提供的Keychain服务。Keychain是一个安全的数据存储容器,它可以保护用户的账号信息不被未经授权的应用访问。本文将详细介绍如何在iOS...

    用 keychain保存信息

    以下是关于如何使用Keychain保存密码、认证等信息的详细说明: 1. **Keychain的原理**: Keychain的核心在于其加密机制。当用户添加一个新的密码或凭证到Keychain时,这些信息会被加密,并且只有在用户通过身份...

    IOS开发使用KeychainItemWrapper 持久存储用户名和密码

    例如,保存用户名和密码: ```objc [keychain setObject:@"little Pig" forKey:(id)kSecAttrAccount]; // 账户名 [keychain setObject:@"123456" forKey:(id)kSecValueData]; // 密码 ``` 这里的`kSecAttrAccount`...

    iOS keychain类库

    在实际应用中,我们通常会在用户登录后,将用户名和密码存入keychain,之后每次启动应用时,通过KeychainItemWrapper检查keychain中是否有已登录的信息,若有则自动登录,无则提示用户输入。这样既提高了用户体验,...

    iOS Keychain快捷存储完美封装工作类

    2天的代码编写和细节打磨,仿照NSUserDefaults接口设计上手0难度,将重要数据一键存储至手机系统,卸载App后仍可找回,可以放心保存用户名和密码.支持数据跨App存储,能实现检测手机上已安装的自己公司的所有App,强烈推荐...

    用plist保存账号密码

    在iOS和macOS开发中,Plist(Property List)是一种常用的数据存储格式,它用于存储结构化的XML或二进制数据。Plist可以用来保存应用程序的配置信息、用户设置或者其他轻量级的数据,例如账号和密码。在本教程中,...

    react-native-keychain-master.zip_React_handd55_keychain_react-na

    1. **设置凭据**:使用`setGenericPassword`或`setInternetCredentials`方法来保存用户名和密码。这些方法接受服务标识和服务域作为参数,以及要存储的用户名和密码。例如: ```javascript Keychain....

    iOS和PHP的登录交互

    此外,为了优化用户体验,iOS客户端可能还会实现缓存机制,比如使用Keychain保存用户的登录状态,以便下次启动应用时自动登录。同时,考虑到网络状况,登录请求应包含重试机制,以应对网络延迟或中断的情况。 总之...

    iOS保存到钥匙串

    在iOS开发中,钥匙串(Keychain)是一个安全的数据存储机制,用于保护应用程序中的敏感信息,如用户密码、账户信息和其他重要数据。标题"iOS保存到钥匙串"指的是如何将设备的唯一标识符(UUID)和用户登录凭据等信息...

Global site tag (gtag.js) - Google Analytics