iOS keyChain

一、Keychain 基础

1.iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,密钥等.苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等.

2.Keychain的信息是存在于每个应用的沙盒之外,卸载应用并不会把存在Keychain里的信息删除.

3.它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保存的所有数据都是加密过的.

4.Secltem有五类:通用密码,互联网密码,证书,密钥和身份.

5.用原生的Security.framework 就可以实现钥匙串的访问,读写,但是只能在真机上进行.

6.每一个keyChain的组成如图,整体是一个字典结构.


1.kSecClass key 定义属于那一种类型的keyChain

  CFTypeRef kSecClassGenericPassword            //一般密码

  CFTypeRef kSecClassInternetPassword           //网络密码

  CFTypeRef kSecClassCertificate                //证书

  CFTypeRef kSecClassKey                        //密钥

  CFTypeRef kSecClassIdentity       //身份

2.不同类型的kSecClass key包含不同的属性,这些attributes定义了这个item的具体信息

3.每个item可以包含一个密码项来存储对应的密码

二、Keychain 操作

引入Security包,引入文件 #import <Security/Security.h>

Security.framework提供了四个主要的方法来操作KeyChain:

// 查询
OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);

// 添加
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result);

// 更新
KeyChain中的ItemOSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);

// 删除
KeyChain中的ItemOSStatus SecItemDelete(CFDictionaryRef query)

三、Keychain使用

在对Keychain item进行操作时,一般的步骤如下:

  1、创建一个NSMutableDictionary对象,用于存储或用来设置query条件

  2、设置kSecClass,指明我需要获取什么类型数据

  3、设置对应的kSecAttr属性,用来指明我需要对哪个Keychain item进行操作。

  4、调用IOS中的增删改查函数,传入字典查询条件,并获得对应的结果。

+ (NSMutableDictionary *)query:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (__bridge_transfer id)kSecClassGenericPassword, (__bridge_transfer id)kSecClass,
            service, (__bridge_transfer id)kSecAttrService, service, (__bridge_transfer id)kSecAttrAccount,
            (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock, (__bridge_transfer id)kSecAttrAccessible,
            nil];
}
+ (void)save:(NSString *)service data:(id)data {
    NSMutableDictionary *keyChainQuery = [self query:service];
    SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
    [keyChainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
    SecItemAdd((__bridge_retained CFDictionaryRef)keyChainQuery, NULL);
}
- (void)update {
    NSDictionary* query = [NSDictionary dictionaryWithObjectsAndKeys:kSecClassGenericPassword,kSecClass,
                               password,kSecAttrAccount,
                               kCFBooleanTrue,kSecReturnAttributes,nil];

        CFTypeRef result = nil;
        (SecItemCopyMatching((CFDictionaryRef)query, &result) == noErr)
        {
            NSMutableDictionary* update = [NSMutableDictionary dictionaryWithDictionary:(NSDictionary*)result];
            [update setObject:[query objectForKey:kSecClass] forKey:kSecClass];
            [update setObject:[passwordField.text dataUsingEncoding:NSUTF8StringEncoding] forKey:kSecValueData];
            [update removeObjectForKey:kSecClass];

            NSMutableDictionary* updateItem = [NSMutableDictionary dictionaryWithDictionary:result];
            [updateItem setObject:[query objectForKey:()kSecClass] forKey:()kSecClass];
            OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)update);
        }
}
+ (void)delete:(NSString *)service {
    NSMutableDictionary *keyChainQuery = [self query:service];
    SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
}
				
时间: 2024-10-15 03:15:48

iOS keyChain的相关文章

如何使用iOS Keychain存储用户重要信息

iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于NSUserDefaults.文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用.从ios 3.0开始,跨程序分享keychain变得可行. 如何需要在应用里使用使用keyChain,我们需要导入Security.framework ,keych

iOS Keychain 跨应用

Keychain 可以用来持久保存一些信息.通常每个应用都有自己的 Keychain Access.但有时你会需要多个应用共用一些信息.这时需要创建 Keychain Access Group. Keychain Access Group 需要在 entitlements 文件里创建.值默认是 AppIdentifierPrefix+项目 id.前者是 AppId 的前缀,对于每个开发者,这个是唯一的.我们把项目 id 改为一个新起的组名.最后它的样子应该是这样:$(AppIdentifierP

[iOS Keychain本地长期键值存储]

目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain.h #import <Foundation/Foundation.h> @interface CHKeychain : NSObject + (void)save:(NSString *)service data:(id)data; + (id)load:(NSString *)service;

iOS keychain存储

简单的翻译下,keychain可以存储密码.证书等等,至于有什么好处,呵呵哒,自己百度去吧,总结一点就是更安全,而且取的更方便吧,看app场景吧. 本次代码,分为两段,一段为保存代码 1 - (BOOL)saveData:(NSString *)str 2 { 3 OSStatus status = noErr; 4 NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 5 [query setObject:(id)kS

IOS KeyChain理解及代码事例

对KeyChain的理解,可参照http://my.oschina.net/w11h22j33/blog/206713 文中利用KeyChain保存用户名和密码,用户名放在属性中,密码放在密码项中:其中对KeyChain项的增删改查,我个人觉得是有问题的,为了方面自己代码上的使用,也帮助阅读该文的其他读者更好的理解,我修正了代码如下: //存储/增加 -(IBAction)saveClicked:(id)sender{ if(_nameTF.text.length > 0 && _p

iOS keychain报错 25293

经过查找发现25293对应的错误是如下,即用户名和密码不正确. errSecAuthFailed                         = -25293,    /* The user name or passphrase you entered is not correct. */ 后来才发现原来是因为测试机没有设置touchId所致,设置好touchId之后完美生成密钥对.

[转] ios中KeyChain用途

转自  http://www.2cto.com/kf/201311/255684.html 一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add. update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本 程序存储的任何数据都对其他程序不可见.而要想在将存储的内容放在公共区,需要先

ios中KeyChain用途

一.在应用间利用KeyChain共享数据 我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add.update.get.delete这四个操作.对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区.私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见.而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法

iOS逆向工程之KeyChain与Snoop-it

今天博客的主题是Keychain, 在本篇博客中会通过一个登陆的Demo将用户名密码存入到KeyChain中,并且查看一下KeyChain中存的是什么东西,把这些内容给导出来.当然本篇博客的重点不是如何使用Keychain来存储你的用户名和密码了.不过今天的博客中会用到这些知识.Apple的开发着文档上有Keychain的完整使用实例(请参见iOS Keychain Services Tasks).今天博客中用户名和密码的存储和更新就是使用的官方文档给的示例.也就是说,直接拷贝的开发文档上的代码