您的位置:首页 > 产品设计 > UI/UE

UI进阶——数据的加解密

2016-03-16 15:48 417 查看

一、MD5加解密

demo如下:
#import "ViewController.h"
#import <CommonCrypto/CommonCrypto.h>
#import "Person.h"
-(void)md5{
NSString *str = @"I love sky and sunshine.";
const char *sourceData = [str UTF8String];
//    unsigned char resut[CC_MD5_DIGEST_LENGTH];
unsigned char result[CC_MD5_DIGEST_LENGTH];
/**
*  加密长度
*
*  @param data#> 数据源 description#>
*  @param len#>  数据源的长度 description#>
*  @param md#>   计算完成后的结果容器 description#>
*
*  @return
*/

CC_MD5(sourceData,(CC_LONG)strlen(sourceData),result);

NSMutableString *md5_str = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[md5_str appendFormat:@"%02X",result[i]];
}
NSLog(@"简单字符串加密完成--%@",md5_str);

}

-(void)md5_array{

NSArray *sourceArray = @[@"a",@"b",@"c"];
NSData *data = [NSJSONSerialization dataWithJSONObject:sourceArray options:NSJSONWritingPrettyPrinted error:nil];
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

const char *sourceData = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
/**
*  加密长度
*
*  @param data#> 数据源 description#>
*  @param len#>  数据源的长度 description#>
*  @param md#>   计算完成后的结果容器 description#>
*
*  @return
*/

CC_MD5(sourceData,(CC_LONG)strlen(sourceData),result);

NSMutableString *md5_str = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[md5_str appendFormat:@"%02X",result[i]];
}
NSLog(@"数组加密完成--%@",md5_str);

}

//复杂对象的加密
-(void)archiverPersonWithMD5{

Person* person = [[Person alloc]init];
person.name = @"我是个人";
NSMutableData* data = [NSMutableData data];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
[archiver encodeObject:person forKey:@"person"];
//归档结束
[archiver finishEncoding];
//加密
NSString* str = [Secrets md5WithData:data];
NSLog(@"方法加密完成--%@",str);
//    NSString* str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

//    const char *sourceChar = [str UTF8String];
const void *source = data.bytes;

unsigned char result[CC_MD5_DIGEST_LENGTH];
//    CC_MD5(sourceChar, (CC_LONG)strlen(sourceChar), result);

CC_MD5(source, (CC_LONG)strlen(source), result);
NSMutableString *md5_str = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[md5_str appendFormat:@"%02X",result[i]];
}
NSLog(@"复杂对象加密完成--%@",md5_str);
//5FEC80182F9215931C415F75299414C8
}


在这里用了复杂对象的归档,在复杂对象加解密的时候,在归档结束后,使用归档结果的data数据加密,并不用转化为字符串,前面的两种方式也是可以用data数据加密。

二、钥匙串加密

demo如下:
在加密前需要导入一个类



#import "KeychainItemWrapper.h"


//钥匙串加密
-(void)keyChain{

//创建一个钥匙串对象
//identifer 对当前所使用的钥匙串添加一个标记。解密的时候,需要根据此标记获得对应的钥匙串。
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc]initWithIdentifier:@"myIdentifer" accessGroup:nil];
//当我们血药存储钥匙串对象时,需要使用系统的键,而不能使用自定义的键。
id stringKey = (__bridge id)kSecAttrAccount;
//存储一下
[wrapper setObject:@"我是warpper" forKey:stringKey];

}
//钥匙串解密
-(void)decipheringKeychain{

//先得到钥匙串对象
KeychainItemWrapper* wrapper = [[KeychainItemWrapper alloc]initWithIdentifier:@"myIdentifer" accessGroup:nil];
//得到键值
id stringKey = (__bridge id)kSecAttrAccount;
NSString* str = [wrapper objectForKey:stringKey];
NSLog(@"%@",str);
}


非对称加密,只适合对小型数据加密。

base64加密方式
demo如下:
//base64加密
- (NSString* )encodeBase64:(NSString*)str{

//对数据进行转化
NSData *sourceData = [str dataUsingEncoding:NSUTF8StringEncoding];
//base64加密时,会出现反斜杠或加号等等,不适合给网址加密,给网址加密时,要用到自己的加密方法
NSString *result = [sourceData  base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(@"base64---%@",result);
return result;
}
//base64解密
- (void)decipherBase64WithString:(NSString*)string{
//解码,第二个参数的意义为设置其解码。
NSData* data = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];

NSString* stringR = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"string==%@",stringR);
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//    [self md5];
//    [self md5_array];
//    [self archiverPersonWithMD5];
//    [self keyChain];
//    [self decipheringKeychain];
NSString* str = @"被加密的数据";

[self decipherBase64WithString:[self encodeBase64:str]];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: