iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。从ios 3.0开始,跨程序分享keychain变得可行。
下面就使用keychain来实现存取用户名和密码。
苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m文件,可以在GenericKeychain实例里找到。
但是这里我只需要存取用户名和密码,就不用苹果提供的类了,自己写个简单的类来实现就好。
代码如下:
CHKeychain.h
- #import <Foundation/Foundation.h>
- #import <Security/Security.h>
- @interface CHKeychain : NSObject
- + (void)save:(NSString *)service data:(id)data;
- + (id)load:(NSString *)service;
- + (void)delete:(NSString *)service;
- @end
CHKeychain.m
- #import "CHKeychain.h"
- @implementation CHKeychain
- + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
- return [NSMutableDictionary dictionaryWithObjectsAndKeys:
- (id)kSecClassGenericPassword,(id)kSecClass,
- service, (id)kSecAttrService,
- service, (id)kSecAttrAccount,
- (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
- nil];
- }
- + (void)save:(NSString *)service data:(id)data {
- //Get search dictionary
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
- //Delete old item before add new item
- SecItemDelete((CFDictionaryRef)keychainQuery);
- //Add new object to search dictionary(Attention:the data format)
- [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
- //Add item to keychain with the search dictionary
- SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
- }
- + (id)load:(NSString *)service {
- id ret = nil;
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
- //Configure the search setting
- //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
- [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
- [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
- CFDataRef keyData = NULL;
- if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
- @try {
- ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData];
- } @catch (NSException *e) {
- NSLog(@"Unarchive of %@ failed: %@", service, e);
- } @finally {
- }
- }
- if (keyData)
- CFRelease(keyData);
- return ret;
- }
- + (void)delete:(NSString *)service {
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
- SecItemDelete((CFDictionaryRef)keychainQuery);
- }
- @end
首先需要定义几个字符串用来做key:
- NSString * const KEY_USERNAME_PASSWORD = @"com.company.app.usernamepassword";
- NSString * const KEY_USERNAME = @"com.company.app.username";
- NSString * const KEY_PASSWORD = @"com.company.app.password";
把用户名和密码存入keychain:
- NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
- [usernamepasswordKVPairs setObject:txtfldUsername.text forKey:KEY_USERNAME];
- [usernamepasswordKVPairs setObject:txtfldPassword.text forKey:KEY_PASSWORD];
- [CHKeychain save:KEY_USERNAME_PASSWORD data:usernamepasswordKVPairs];
从keychain中取出用户名和密码:
- NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[CHKeychain load:KEY_USERNAME_PASSWORD];
- txtfldUsername.text = [usernamepasswordKVPairs objectForKey:KEY_USERNAME];
- txtfldPassword.text = [usernamepasswordKVPairs objectForKey:KEY_PASSWORD];
删除一个keychain item:
- [CHKeychain delete:KEY_USERNAME_PASSWORD];
这样一个简单的使用keychain存取用户名密码的功能就做好了。
另外附上一篇写得更详细的e文:http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html
相关推荐
iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。 苹果已经有现成的类封装好了keychain,KeychainItemWrapper.h和KeychainItemWrapper.m...
在实际应用中,使用Keychain不仅限于保存用户名和密码,还可以用于存储其他敏感信息,如API密钥、证书、OAuth令牌等。同时,Keychain支持跨应用共享,允许指定的其他应用访问同一Keychain Item,这对于多应用生态...
在`ios-keychain.zip`中,可能包含了一个简单的Swift或Objective-C示例,展示如何使用`Keychain`来存储和检索用户名。通常,使用`Keychain`的步骤如下: 1. 引入`Keychain`相关的库:由于Apple并没有提供直接操作`...
1. **Keychain Item**: Keychain中的每一项数据被称为Keychain Item,它可以是用户名和密码、证书、密钥或任何其他类型的数据。 2. **Service**: Keychain Item可以归类到特定的服务(Service)下,同一个服务下的...
例如,通过SFHFKeychainUtils,你可以轻松地将用户的登录凭证(如用户名和密码)存入KeyChain,然后在需要时检索出来,无需担心数据的安全性。 另一个值得提及的工具是“Keychain ItemWrapper”,这是一个面向对象...
在iOS开发中,Keychain库是一个非常重要的工具,它用于安全地存储用户的敏感信息,如密码、证书和访问令牌。Keychain服务通过提供一个统一的接口来管理这些数据,确保了数据的安全性和隐私性,避免了明文存储带来的...
1. `saveData`: 将数据(如用户名和密码)加密后保存到Keychain。 2. `getData`: 从Keychain中检索数据,并解密返回。 3. `deleteData`: 删除Keychain中的特定数据项。 4. `updateData`: 更新Keychain中的数据。 ...
在iOS开发中,为了安全地存储用户敏感信息如用户名和密码,开发者通常会采用系统提供的Keychain服务。Keychain是一个安全的数据存储容器,它可以保护用户的账号信息不被未经授权的应用访问。本文将详细介绍如何在iOS...
以下是关于如何使用Keychain保存密码、认证等信息的详细说明: 1. **Keychain的原理**: Keychain的核心在于其加密机制。当用户添加一个新的密码或凭证到Keychain时,这些信息会被加密,并且只有在用户通过身份...
例如,保存用户名和密码: ```objc [keychain setObject:@"little Pig" forKey:(id)kSecAttrAccount]; // 账户名 [keychain setObject:@"123456" forKey:(id)kSecValueData]; // 密码 ``` 这里的`kSecAttrAccount`...
在实际应用中,我们通常会在用户登录后,将用户名和密码存入keychain,之后每次启动应用时,通过KeychainItemWrapper检查keychain中是否有已登录的信息,若有则自动登录,无则提示用户输入。这样既提高了用户体验,...
2天的代码编写和细节打磨,仿照NSUserDefaults接口设计上手0难度,将重要数据一键存储至手机系统,卸载App后仍可找回,可以放心保存用户名和密码.支持数据跨App存储,能实现检测手机上已安装的自己公司的所有App,强烈推荐...
在iOS和macOS开发中,Plist(Property List)是一种常用的数据存储格式,它用于存储结构化的XML或二进制数据。Plist可以用来保存应用程序的配置信息、用户设置或者其他轻量级的数据,例如账号和密码。在本教程中,...
1. **设置凭据**:使用`setGenericPassword`或`setInternetCredentials`方法来保存用户名和密码。这些方法接受服务标识和服务域作为参数,以及要存储的用户名和密码。例如: ```javascript Keychain....
此外,为了优化用户体验,iOS客户端可能还会实现缓存机制,比如使用Keychain保存用户的登录状态,以便下次启动应用时自动登录。同时,考虑到网络状况,登录请求应包含重试机制,以应对网络延迟或中断的情况。 总之...
在iOS开发中,钥匙串(Keychain)是一个安全的数据存储机制,用于保护应用程序中的敏感信息,如用户密码、账户信息和其他重要数据。标题"iOS保存到钥匙串"指的是如何将设备的唯一标识符(UUID)和用户登录凭据等信息...