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
//
// 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
//
// 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
- Keychain存储容器
- iOS UUID +Keychain 存储
- iOS keychain存储数据
- 用 keychain 永久存储
- iOS 使用KeyChain存储数据
- 获取UUID及keychain存储
- iOS开发:keychain存储UUID
- 使用keychain存储重要信息
- iOS 数据存储之keychain
- KeyChain
- keychain
- keychain
- KeyChain
- keychain
- Keychain
- Keychain
- keychain
- KeyChain
- Kotlin使用retrofit实现recyclerview
- 机器学习概念原理及常用算法
- STM32L152 DAC简单使用方法
- NSString为何要用copy?而不是strong?
- 飞鸽传书源码
- Keychain存储容器
- 跨服务器传参数(一个、多个)
- STL源码剖析 之 vector
- hdu 3949
- 每周论文清单:高质量文本生成,多模态情感分析,还有一大波GAN | PaperDaily #26
- Protege使用教程(基础篇)
- 警惕!比特币分叉币IFO炒作圈钱再起,新老韭菜请作壁上观!
- vue 父子组件之间的数据传递
- 转载至-菊部制造Nexus 5X刷Android8.0系统