iOS开发————数据本地化方式之SSKeychain--基础上进行CBC加解密
来源:互联网 发布:在线看熊片的软件 编辑:程序博客网 时间:2024/05/01 14:30
if (![SupportUserDefaultsretrieveUUID])
{
if ([SupportKeyChainisExistUUID])
{
[SupportKeyChaingetKeyChainUUID];
}
else
{
//生成一个uuid的方法
CFUUIDRef uuid =CFUUIDCreate(NULL);
NSString *strUuid = (__bridgeNSString*)CFUUIDCreateString(NULL, uuid);
//将该uuid保存到keychain
[SupportKeyChainsetKeyChainUUID:strUuid];
CFRelease(uuid);
}
}
+ (NSString*)retrieveUUID {
NSString *strUuid = (NSString*)[SupportUserDefaultsgetObjectForKey:kCreateUUIDKey];
return strUuid;
}
+ (NSObject *)getObjectForKey:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
NSData *encryptedData = [defaultsobjectForKey:key];
NSData *decryptedData = [NSDatagetData:encryptedData setKey:key];
NSObject *object;
if (decryptedData ==nil) {
object = nil;
}else {
object = [NSKeyedUnarchiverunarchiveObjectWithData:decryptedData];
}
return object;
}
+ (NSData*)getData:(NSData *)encryptedData setKey:(NSString *)key
{
NSData *decryptedData = [encryptedDataAES256DecryptWithKey:key];
return decryptedData;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,sizeof(keyPtr));
[key getCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [selflength];
size_t bufferSize = dataLength +kCCBlockSizeAES128;
void *buffer =malloc(bufferSize);
size_t numBytesDecrypted =0;
CCCryptorStatus cryptStatus =CCCrypt(kCCDecrypt,kCCAlgorithmAES128,
kCCOptionPKCS7Padding |kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[selfbytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==kCCSuccess) {
return [NSDatadataWithBytesNoCopy:bufferlength:numBytesDecrypted];
}
free(buffer);
returnnil;
}
#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 = [[[NSBundlemainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *query = [NSMutableDictionarydictionary];
[query setObject:(__bridgeid)kSecClassGenericPasswordforKey:(__bridgeid)kSecClass];
[query setObject:appIDforKey:(__bridgeid)kSecAttrAccount];
[query setObject:(__bridgeid)kSecMatchLimitOneforKey:(__bridgeid)kSecMatchLimit];
[query setObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnAttributes];
CFTypeRef attributesRef =NULL;
OSStatus result =SecItemCopyMatching((__bridgeCFDictionaryRef)query, &attributesRef);
if (result ==noErr)
{
isExistUUID = YES;
}
else
{
isExistUUID = NO;
}
return isExistUUID;
}
+ (void)setKeyChainUUID:(NSString*)strUUID
{
NSString* appID = [[[NSBundlemainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *item = [NSMutableDictionarydictionary];
[item setObject:(__bridgeid)kSecClassGenericPasswordforKey:(__bridgeid)kSecClass];
[item setObject:appIDforKey:(__bridgeid)kSecAttrAccount];
[item setObject:[strUUIDdataUsingEncoding:NSUTF8StringEncoding]forKey:(__bridgeid)kSecValueData];
OSStatus err =SecItemAdd((__bridgeCFDictionaryRef)item, nil);
if (err ==noErr)
{
[SupportUserDefaultssaveUUID:strUUID];
}
else
{
[selfdeleteKeyChainUUID];
}
}
+ (NSString*)getKeyChainUUID
{
NSString *strUUID =@"";
NSString* appID = [[[NSBundlemainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary *item = [NSMutableDictionarydictionary];
[item setObject:(__bridgeid)kSecClassGenericPasswordforKey:(__bridgeid)kSecClass];
[item setObject:appIDforKey:(__bridgeid)kSecAttrAccount];
[item setObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnData];
CFTypeRef pass =NULL;
OSStatus res =SecItemCopyMatching((__bridgeCFDictionaryRef)item, &pass);
if(res ==noErr )
{
NSData *data = (__bridgeNSData *)pass;
strUUID = [[NSStringalloc] initWithBytes:[databytes] length:[datalength] encoding:NSUTF8StringEncoding];
[SupportUserDefaultssaveUUID:strUUID];
}
return strUUID;
}
+ (void)deleteKeyChainUUID
{
NSString* appID = [[[NSBundlemainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
NSMutableDictionary* query = [NSMutableDictionarydictionary];
[query setObject:(__bridgeid)kSecClassGenericPasswordforKey:(__bridgeid)kSecClass];
[query setObject:appIDforKey:(__bridgeid)kSecAttrAccount];
[query setObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnData];
OSStatus err =SecItemDelete((__bridgeCFDictionaryRef)query);
if (err ==noErr)
{
}
else
{
}
}
@end
+ (void)saveUUID:(NSString*)strSetUuid {
[SupportUserDefaultssetObject:strSetUuidkey:kCreateUUIDKey];
}
+ (void)setObject:(NSObject *)object key:(NSString *)key {
NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
NSData *objectData = [NSKeyedArchiverarchivedDataWithRootObject:object];
NSData *encryptedData = [NSDatasetData:objectData setKey:key];
[defaults setObject:encryptedDataforKey:key];
[defaults synchronize];
}
+ (NSData*)setData:(NSData *)data setKey:(NSString *)key
{
NSData *encryptedData = [dataAES256EncryptWithKey:key];
return encryptedData;
}
- (NSData *)AES256EncryptWithKey:(NSString *)key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,sizeof(keyPtr));
[key getCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [selflength];
size_t bufferSize = dataLength +kCCBlockSizeAES128;
void *buffer =malloc(bufferSize);
size_t numBytesEncrypted =0;
CCCryptorStatus cryptStatus =CCCrypt(kCCEncrypt,kCCAlgorithmAES128,
kCCOptionPKCS7Padding |kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[selfbytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus ==kCCSuccess) {
return [NSDatadataWithBytesNoCopy:bufferlength:numBytesEncrypted];
}
free(buffer);
returnnil;
}
- iOS开发————数据本地化方式之SSKeychain--基础上进行CBC加解密
- iOS开发————数据本地化方式之SSKeychain
- iOS开发————数据本地化方式之SSKeychain
- 利用openssl里的库函数进行AES的加解密—cbc
- iOS开发————数据本地化方式之NSUserDefaults
- iOS开发————数据本地化存储方式之Keychain
- Openssl中AES加解密——CBC模式
- iOS开发—本地化
- iOS基于openssl 的AES-128-cbc-pkcs5 加解密
- ios开发——日常之三种方式使得iOS应用能够在后台进行数据更新和下载
- iOS—应用程序本地化
- CBC和CTR解密模式——C++实现
- 使用delphi+intraweb进行微信开发4—微信消息加解密
- C# 采用base64编码方式对数据进行加解密
- 盲人摸象——iOS简单应用ToDoList之sqlite数据本地化
- 文件加解密—解密版
- AES/CBC/PKCS5Padding加解密
- 使用 TurboPower LockBox 组件对数据进行 RSA 加解密和数字签名——讲义及范例程序下载
- 码
- 最熟悉的陌生属性——position
- 欢迎使用CSDN-markdown编辑器
- SCOI2012喵星球的点名--后缀数组
- windows7中 安装tensorflow
- iOS开发————数据本地化方式之SSKeychain--基础上进行CBC加解密
- 未名湖边的烦恼
- Mysql之事件小结
- 用<algorithm>头文件中的sort函数排序
- 写在主方法类的变量,在main外面声明该变量要加static修饰~
- getContextPath、getServletPath、getRequestURI的区别
- poj博弈
- 英语学习——Reading Power and Unlimited Power
- 用python玩转数据|强大的数据结构和python扩展库