iOS常用加密方式
iOS常用加密方式:Base64加密、MD5加密、AES加密、RSA加密等。无论选择哪种加密算法,最终都是为了保证代码安全,捍卫自己的产品原创性。
Base64加密
Base64
编码的思想是:采用64
个基本的ASCII码
字符对数据进行重新编码。它将需要编码的数据拆分成字节数组,以3
个字节为一组,按顺序排列24
位数据,再把这24
位数据分成4
组,即每组6
位;再在每组的的最高位前补两个0
凑足一个字节,这样就把一个3
字节为一组的数据重新编码成了4
个字节;当所要编码的数据的字节数不是3
的整倍数,也就是说在分组时最后一组不够3
个字节,这时在最后一组填充1
到2
个0
字节,并在最后编码完成后在结尾添加1
到2
个=
号。例如:将对ABC
进行Base64
编码首先取ABC
对应的ASCII码
值,A : 65
、B : 66
、C : 67
,再取二进制值A : 01000001
、B : 01000010
、C : 01000011
,然后把这三个字节的二进制码接起来010000010100001001000011
,再以6
位为单位分成4
个数据块并在最高位填充两个0
后形成4
个字节的编码后的值00010000
、00010100
、00001001
、00000011
;再把这4
个字节数据转化成10进制数
得16
、20
、19
、3
;最后根据Base64
给出的64
个基本字符表,查出对应的ASCII码
字符Q
、U
、J
、D
,这里的值实际就是数据在字符表中的索引。解码过程就是把4
个字节再还原成3
个字节再根据不同的数据形式把字节数组重新整理成数据。注:Base64字符表,包括大写A-Z
小写a-z
数字0-9
和+
以及/
。
Base64加密原则:6bit(原8bit)一个字节,不足的位数用0补齐,两个0用一个=表示。
Base64加密特点:
- 数据加密之后,数据量会变大,变大1/3左右。
- 可进行反向解密。
- 编码后有个非常显著的特点,末尾有个=号。
在iOS中Base64加解密使用方法介绍(本例使用系统API,仅支持iOS7及以后的系统版本)
/****************************Base64.m类实现文件内容****************************/
+ (NSString *)base64EncodedStringWithData:(NSData *)data
{
//判断是否传入需要加密数据参数
if ((data == nil) || (data == NULL)) {
return nil;
} else if (![data isKindOfClass:[NSData class]]) {
return nil;
}
//判断设备系统是否满足条件
if ([[[UIDevice currentDevice] systemVersion] doubleValue] <= 6.9) {
return nil;
}
//使用系统的API进行Base64加密操作
NSDataBase64EncodingOptions options;
options = NSDataBase64EncodingEndLineWithLineFeed;
return [data base64EncodedStringWithOptions:options];
}
+ (NSData *)base64DecodeDataWithString:(NSString *)string
{
//判断是否传入需要加密数据参数
if ((string == nil) || (string == NULL)) {
return nil;
} else if (![string isKindOfClass:[NSString class]]) {
return nil;
}
//判断设备系统是否满足条件
if ([[[UIDevice currentDevice] systemVersion] doubleValue] <= 6.9) {
return nil;
}
//使用系统的API进行Base64解密操作
NSDataBase64DecodingOptions options;
options = NSDataBase64DecodingIgnoreUnknownCharacters;
return [[NSData alloc] initWithBase64EncodedString:string options:options];
}
/*****************************************************************************/
//使用Base64文件进行Base64加密和解密
/*********************************使用Base64类*********************************/
//使用Base64执行加密操作
NSString *string = @"abcdefghijklmnopqrstuvwxyz";
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSString *encodeString = [Base64 base64EncodedStringWithData:data];
NSLog(@"encodeString : %@", encodeString);
//使用Base64执行解密操作
NSString *decodeString = nil;
NSData *decodeData = [Base64 base64DecodeDataWithString:encodeString];
decodeString = [[NSString alloc] initWithData:decodeData
encoding:NSUTF8StringEncoding];
NSLog(@"decodeString : %@", decodeString);
/******************************************************************************/
MD5加密(MD5是一种摘要,而非加密,只是经常与加密配合使用)
MD5
的全称是Message-DigestAlgorithm 5
,Message-Digest
泛指字节串(Message
)的Hash
变换,就是把一个任意长度的字节串
变换成一定长的大整数。请注意我使用了字节串
而不是字符串
这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。MD5
将任意长度的字节串
变换成一个128bit
的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5
的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。MD5
的典型应用是对一段Message
(字节串)产生fingerprint
(指纹),以防止被"篡改"。举个例子,你将一段话写在一个叫readme.txt
文件中,并对这个readme.txt
产生一个MD5
的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5
时就会发现。如果再有一个第三方的认证机构,用MD5
还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。MD5
还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5
值(或类似的其它算法)的方式保存的,用户Login
的时候,系统是把用户输入的密码计算成MD5
值,然后再去和系统中保存的MD5
值进行比较,而系统并"不知道"用户的密码是什么。MD5加密大体都应用在:验证数据或文件一致性、数字签名、安全访问认证等等。大概可比喻为:人的指纹来理解。
注:MD5
加密是不可逆的,也就是说,MD5
加密后是不能解密的,所谓的解密只是用大数据的”试用”,来测出结果的。
MD5特点:
- 压缩性 : 任意长度的数据,算出的MD5值长度都是固定的。
- 容易计算 : 从原数据计算出MD5值很容易。
- 抗修改性 : 对原数据进行任何改动,哪怕只修改一个字节,所得到的MD5值都有很大区别。
- 弱抗碰撞 : 已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
- 强抗碰撞 : 想找到两个不同数据,使他们具有相同的MD5值,是非常困难的。
在iOS中MD5加密和验签使用方法介绍
/****************************MD5.m类实现文件内容****************************/
//对字符串数据进行MD5的签名
+ (NSString *)md5SignWithString:(NSString *)string
{
const char *object = [string UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(object,(CC_LONG)strlen(object),result);
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i < 16; i ++) {
[hash appendFormat:@"%02X", result[i]];
}
return [hash lowercaseString];
}
//对二进制数据进行MD5的签名
+ (NSData *)md5SignWithData:(NSData *)data
{
Byte byte[CC_MD5_DIGEST_LENGTH]; //定义一个字节数组来接收结果
CC_MD5((const void*)([data bytes]), (CC_LONG)[data length], byte);
return [NSData dataWithBytes:byte length:CC_MD5_DIGEST_LENGTH];
}
/******************************************************************************/
//使用MD5文件进行MD5加密和验签
/*********************************使用MD5类*********************************/
//使用MD5执行加密操作
NSString *string2 = @"abcdefghijklmnopqrstuvwxyz";
NSString *encodeString2 = [MD5 md5SignWithString:string2];
NSLog(@"encodeString2 : %@", encodeString2);
//MD5为不可逆的操作,使用MD5执行验签操作
NSString *verifyString2 = [MD5 md5SignWithString:string2];
NSLog(@"verifyString2 : %@", verifyString2);
if ([verifyString2 isEqualToString:encodeString2]) {
NSLog(@"md5 verify sign success");
} else {
NSLog(@"md5 verify sign failed");
}
/******************************************************************************/
AES加密
高级加密标准Advanced Encryption Standard
简称:AES
,在密码学中又称Rijndael加密法
,是美国联邦政府采用的一种区块加密标准。它是一种对称加密算法,这个标准也替代原先的DES标准,已经被多方分析且广为全世界所使用。AES设计有三个密钥长度:128、192、256位,相对而言,AES的128密钥比DES的56密钥强1021倍。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活,在软件及硬件上都能快速地加解密且只需要很少的存储资源等优点。
AES加密流程直接上图了。