您的位置:首页 > 移动开发 > IOS开发

iOS之数据加密

2016-05-06 21:57 253 查看
常用术语

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.(密钥分为对称密钥和非对称密钥,也可以根据途径分为加密密钥和解密密钥)

明文:没有进行加密,能够直接代表原文含义的信息

密文:经过加密处理之后,隐藏原文含义的信息

加密:将明文转换成密文的实施过程

解密:将密文转换成明文的实施过程

数据安全

数据安全:是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系,主要是对对称算法与公开密匙密码体系两种(非对称算法),都包含了数据的加密和解密过程

对称算法:对称密码算法有时又叫传统密码算法,是指加密密钥可以从解密密钥中推算出来,反过来也成立

非对称算法:对是指加密密钥可以从解密密钥中推算出来,反过来不能成立

加密算法有很多种,在iOS开发中,常用的有得MD5和base64等等

MD5

MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)

应用场景:登陆界面,签名,时间戳等

MD5算法具有以下几个提点:

压缩性:任意长度的数据,算出的MD5长度都是固定的(16进制,32位)

容易计算:从源数据计算出MD5值很容易

抗修改性:对源数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别

强抗碰撞:已知源数据和其MD5值,想找到一个具有相同MD5值得数据(即伪造数据)是非常困难的

不可逆性的

具体实现过程:

MD5加密字符串

+ (NSString*)md5String:(NSString*)sourceString {
//由于md5加密都是通过c级别的函数来计算,所以需要将加密的字符串转换为c语言字符串
//1.获取c字符串
const char *cStr = sourceString.UTF8String;
//2.创建一个C语言字符串数组,用来接收加密结束之后的字符串(接收MD5值)
//一个字节是8位,两个字节是16位,两个字符可以表示一个16位进制的数,MD5结果为32,实际上由16位16进制数组成
unsigned char result[CC_MD5_DIGEST_LENGTH];

//3.计算MD5值(结果存储在result数组中)
/*
第一个参数:需要加密的字符串
第二个参数:需要加密的字符串的长度
第三个参数:加密完成之后字符串存储的地方
*/
CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
//4.将加密完成的字符拼接起来使用(16进制)
//声明一个可变字符串类型,用来拼接转换好的字符
NSMutableString *resultStr = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"%@",resultStr);
return resultStr;
}


md5对data类型数据加密

+ (NSString*)md5Data:(NSData*)sourceData {
//需要MD5变量并且初始化
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
//开始MD5加密
/*
第一个参数:对MD5变量取地址(要为改变指向的内存空间存储计算好的数据)
第二个参数:需要计算的源数据
第三个参数:源数据的长度
*/
CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
//结束MD5加密(声明一个无符号的字符数组,用来盛放转换好的数据)
unsigned char result[CC_MD5_DIGEST_LENGTH];
//将数据放入result数组
CC_MD5_Final(result, &md5);
//获取结果(将result中的字符拼接为OC语言中的字符串,以使我们使用)
NSMutableString *resultStr = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"%@",resultStr);
return resultStr;
}


base64

使用场景:数据(比如网易新闻,资讯类的信息)

base64加密

+ (NSString*)base64EncoderWithData:(NSData*)sourceData {
if(!sourceData) {//如果需要加密的数据为nil,不进行加密,直接返回
return nil;
}
NSString *resultStr = [sourceData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//    [sourceData base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];返回的是NSData类型
return resultStr;
}


base64解密(对于字符串)

+ (id)base64EncoderWithString:(NSString*)sourceString {
if (!sourceString) {
return nil;
}
//解密
NSData *resultData = [[NSData alloc] initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters];
return resultData;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: