Keychain存储容器

来源:互联网 发布:php eval 解密 编辑:程序博客网 时间:2024/06/14 16:06

1.iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。苹果自己用keychain来保存Wi-Fi网络密码,VPN凭证等等。它是一个在所有app之外的sqlite数据库。如果我们手动把自己的私密信息加密,然后通过写文件保存在本地,再从本地取出不仅麻烦,而且私密信息也会随着App的删除而丢失。iOS的Keychain能完美的解决这些问题。并且从iOS 3.0开始,Keychain还支持跨程序分享。这样就极大的方便了用户。省去了很多要记忆密码的烦恼。

源码链接:https://gitee.com/xuanTestApp/test.git

2.************************TCKeychain.h

//

//  TCKeychain.h

//

//

//  Created by  XuanWeihong on 16/6/7.

//  Copyright © 2016年 test All rights reserved.

//


#import <Foundation/Foundation.h>

#import <Security/Security.h>



@interface TCKeychain : NSObject


/**

 *  保存数据(只能是常见的七中类型)

 *

 *  @param anObject 数据(只能是常见的七中类型)

 *  @param key  主键

 */

+ (void)setObject:(id)anObject forKey:(NSString*)key;//保存

+ (id)getObjectForKey:(NSString *)key;//获取

+ (void)removeObjectForKey:(NSString *)key;//删除 


@end


3.************************TCKeychain.m

//

//  TCKeychain.m

//

//

//  Created by  XuanWeihong on 16/8/7.

//  Copyright © 2016年 test All rights reserved.

//


#import "TCKeychain.h"


@implementation TCKeychain

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {

    return [NSMutableDictionarydictionaryWithObjectsAndKeys:

            (__bridgeid)kSecClassGenericPassword,(__bridgeid)kSecClass,

            service, (__bridge id)kSecAttrService,

            service, (__bridge id)kSecAttrAccount,

            (__bridgeid)kSecAttrAccessibleAfterFirstUnlock,(__bridgeid)kSecAttrAccessible,

            nil];

}


/**

 *  保存数据

 *

 *  @param anObject 数据

 *  @param key  主键

 */

+ (void)setObject:(id)anObject forKey:(NSString*)key

{

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:key];

    

    SecItemDelete((__bridgeCFDictionaryRef)keychainQuery);

    

    [keychainQuery setObject:[NSKeyedArchiverarchivedDataWithRootObject:anObject] forKey:(__bridgeid)kSecValueData];

    

    SecItemAdd((__bridgeCFDictionaryRef)keychainQuery, NULL);

}


/**

 *  获取数据

 *

 *  @param key

 *

 *  @return 返回数据

 */

+ (id)getObjectForKey:(NSString *)key {

    id ret = nil;

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:key];

    [keychainQuery setObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnData];

    [keychainQuery setObject:(__bridgeid)kSecMatchLimitOneforKey:(__bridgeid)kSecMatchLimit];

    CFDataRef keyData = NULL;

    if (SecItemCopyMatching((__bridgeCFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) ==noErr) {

        @try {

            ret = [NSKeyedUnarchiverunarchiveObjectWithData:(__bridgeNSData *)keyData];

        } @catch (NSException *e) {

            NSLog(@"Unarchive of %@ failed: %@", key, e);

        } @finally {

        }

    }

    if (keyData)

        CFRelease(keyData);

    return ret;

}


/**

 *  删除相关数据

 *

 *  @param key

 */

+ (void)removeObjectForKey:(NSString *)key {

    NSMutableDictionary *keychainQuery = [selfgetKeychainQuery:key];

    SecItemDelete((__bridgeCFDictionaryRef)keychainQuery);

}

@end



4.************************使用

//

//  ViewController.m

//  TestKeychain

//

//  Created by weihong xuan on 2017/12/14.

//  Copyright © 2017年 weihong xuan. All rights reserved.

//


#import "ViewController.h"

#import "TCKeychain.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    

    NSString * testStr = @"要保存的字符";

    [TCKeychain setObject:testStr forKey:@"passwordKey"];//保存

    

    NSString * getStr = [TCKeychaingetObjectForKey:@"passwordKey"];//读取

    NSLog(@"获取保存的字符:%@",getStr);

    /*

     保存后删除手机上的app,屏蔽保存代码,直接读取文件照样还在;

     */

}

- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end




原创粉丝点击