iOS开发————数据本地化方式之SSKeychain--基础上进行CBC加解密
2017-03-11 19:56
281 查看
if (![SupportUserDefaults
retrieveUUID])
{
if ([SupportKeyChain
isExistUUID])
{
[SupportKeyChain
getKeyChainUUID];
}
else
{
//生成一个uuid的方法
CFUUIDRef uuid =
CFUUIDCreate(NULL);
NSString *strUuid = (__bridge
NSString*)CFUUIDCreateString(NULL, uuid);
//将该uuid保存到keychain
[SupportKeyChain
setKeyChainUUID:strUuid];
CFRelease(uuid);
}
}
+ (NSString*)retrieveUUID {
NSString *strUuid = (NSString*)[SupportUserDefaults
getObjectForKey:kCreateUUIDKey];
return strUuid;
}
+ (NSObject *)getObjectForKey:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaults
standardUserDefaults];<
15194
/p>
NSData *encryptedData = [defaults
objectForKey:key];
NSData *decryptedData = [NSData
getData:encryptedData
setKey:key];
NSObject *object;
if (decryptedData ==
nil) {
object = nil;
}else {
object = [NSKeyedUnarchiver
unarchiveObjectWithData:decryptedData];
}
return object;
}
+ (NSData*)getData:(NSData *)encryptedData setKey:(NSString *)key
{
NSData *decryptedData = [encryptedData
AES256DecryptWithKey:key];
return decryptedData;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[self
bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
#import <Foundation/Foundation.h>
@interface SupportKeyChain :
NSObject
+ (BOOL)isExistUUID;
+ (void)setKeyChainUUID:(NSString*)strUUID;
+ (NSString*)getKeyChainUUID;
@end
#import "SupportKeyChain.h"
#import <Security/Security.h>
#import "SupportUserDefaults.h"
@implementation SupportKeyChain
+ (BOOL)isExistUUID
{
BOOL isExistUUID =
NO;
NSString* appID = [[[NSBundle
mainBundle] infoDictionary]
objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *query = [NSMutableDictionary
dictionary];
[query setObject:(__bridge
id)kSecClassGenericPassword
forKey:(__bridge
id)kSecClass];
[query setObject:appID
forKey:(__bridge
id)kSecAttrAccount];
[query setObject:(__bridge
id)kSecMatchLimitOne
forKey:(__bridge
id)kSecMatchLimit];
[query setObject:(id)kCFBooleanTrue
forKey:(__bridge
id)kSecReturnAttributes];
CFTypeRef attributesRef =
NULL;
OSStatus result =
SecItemCopyMatching((__bridge
CFDictionaryRef)query, &attributesRef);
if (result ==
noErr)
{
isExistUUID = YES;
}
else
{
isExistUUID = NO;
}
return isExistUUID;
}
+ (void)setKeyChainUUID:(NSString*)strUUID
{
NSString* appID = [[[NSBundle
mainBundle] infoDictionary]
objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *item = [NSMutableDictionary
dictionary];
[item setObject:(__bridge
id)kSecClassGenericPassword
forKey:(__bridge
id)kSecClass];
[item setObject:appID
forKey:(__bridge
id)kSecAttrAccount];
[item setObject:[strUUID
dataUsingEncoding:NSUTF8StringEncoding]
forKey:(__bridge
id)kSecValueData];
OSStatus err =
SecItemAdd((__bridge
CFDictionaryRef)item,
nil);
if (err ==
noErr)
{
[SupportUserDefaults
saveUUID:strUUID];
}
else
{
[self
deleteKeyChainUUID];
}
}
+ (NSString*)getKeyChainUUID
{
NSString *strUUID =
@"";
NSString* appID = [[[NSBundle
mainBundle] infoDictionary]
objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *item = [NSMutableDictionary
dictionary];
[item setObject:(__bridge
id)kSecClassGenericPassword
forKey:(__bridge
id)kSecClass];
[item setObject:appID
forKey:(__bridge
id)kSecAttrAccount];
[item setObject:(id)kCFBooleanTrue
forKey:(__bridge
id)kSecReturnData];
CFTypeRef pass =
NULL;
OSStatus res =
SecItemCopyMatching((__bridge
CFDictionaryRef)item, &pass);
if(res ==
noErr )
{
NSData *data = (__bridge
NSData *)pass;
strUUID = [[NSString
alloc] initWithBytes:[data
bytes] length:[data
length] encoding:NSUTF8StringEncoding];
[SupportUserDefaults
saveUUID:strUUID];
}
return strUUID;
}
+ (void)deleteKeyChainUUID
{
NSString* appID = [[[NSBundle
mainBundle] infoDictionary]
objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary* query = [NSMutableDictionary
dictionary];
[query setObject:(__bridge
id)kSecClassGenericPassword
forKey:(__bridge
id)kSecClass];
[query setObject:appID
forKey:(__bridge
id)kSecAttrAccount];
[query setObject:(id)kCFBooleanTrue
forKey:(__bridge
id)kSecReturnData];
OSStatus err =
SecItemDelete((__bridge
CFDictionaryRef)query);
if (err ==
noErr)
{
}
else
{
}
}
@end
+ (void)saveUUID:(NSString*)strSetUuid {
[SupportUserDefaults
setObject:strSetUuid
key:kCreateUUIDKey];
}
+ (void)setObject:(NSObject *)object key:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaults
standardUserDefaults];
NSData *objectData = [NSKeyedArchiver
archivedDataWithRootObject:object];
NSData *encryptedData = [NSData
setData:objectData
setKey:key];
[defaults setObject:encryptedData
forKey:key];
[defaults synchronize];
}
+ (NSData*)setData:(NSData *)data setKey:(NSString *)key
{
NSData *encryptedData = [data
AES256EncryptWithKey:key];
return encryptedData;
}
- (NSData *)AES256EncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesEncrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[self
bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesEncrypted];
}
free(buffer);
return
nil;
}
相关文章推荐
- iOS开发————数据本地化方式之SSKeychain
- iOS开发————数据本地化方式之SSKeychain
- iOS开发学习专题-基础知识(四) NSNumber容器 NSData数据 NSData转换的详细使用方式
- ios开发——日常之三种方式使得iOS应用能够在后台进行数据更新和下载
- iOS网络开发基础--向服务器发送数据的方式
- iOS开发————数据本地化方式之NSUserDefaults
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 在android开发中进行数据存储与访问的多种方式介绍
- iOS开发基础——C/C++数据类型介绍
- 怎样实现IOS开发中的数据存储方式
- Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-基于接口驱动的数据层
- [ios开发基础之 Core Data [1] ]Core Data数据持久性存储基础教程
- Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 【零基础学习iOS开发】【02-C语言】07-基本数据类型
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式; 推荐
- IOS种四种持有化数据方式——(2)对模型对象进行归档
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- [ios开发基础之 Core Data[2]]如何使用Core Data – 预加载和引入数据