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;

}




0 0