MD5:加密算法有很多种,在iOS开发当中,MD5是我们常用的摘要算法
- PS:哈希算法,哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。 哈希值是一段数据唯一且极其紧凑的数值表示形式。数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 典型的哈希算法有:MD2、MD4、MD5 和 SHA-1等。
MD5:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5算法具有以下特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的(16进制,32位)
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
MD5加密的使用方式:首先,引入<CommonCrypto/CommonCrypto.h>
1)针对于字符串对象:
//准备字符串
NSString * foo = @"I love my iOS teacher";
//1.获取C字符串(MD5加密基于C语言实现,Foundation框架字符串需要转化)
const char * fooData = [foo UTF8String];//__strong const char *UTF8String,C语言无法持有字符串,必须用__strong修饰来拷贝内容
//2.创建字符串数组接收MD5值
//一个字节是8位,两个字节是16位,两个字符可以表示一个16位进制的数,MD5结果为32位,实际上由16位16进制数组成。
unsigned char resut[CC_MD5_DIGEST_LENGTH];
//3.计算MD5值(结果存储在result数组中)
CC_MD5(fooData, (CC_LONG)strlen(fooData), resut);
//4.获取摘要值
NSMutableString *bar = [[NSMutableString alloc]initWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[bar appendFormat:@"%02X",resut[i]];
}
NSLog(@"%@",bar);
2)针对于非字符串的其他类型:将其它对象转化为NSData对象(可以将对象事先写入文件),然后获取NSData对象的MD5值
//1.NSData对象获取: 获取文件路径,根据文件路径获取NSData对象
NSString *path = [[NSBundle mainBundle] pathForResource:@"一双人" ofType:@“mp3"];
NSData *data = [NSData dataWithContentsOfFile:path];
//2.创建MD5变量
CC_MD5_CTX md5;
//3.初始化MD5变量
CC_MD5_Init(&md5);
//4.准备MD5加密
CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);
//5.结束MD5加密
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
//6.获取结果
NSMutableString *resultString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++) {
[resultString appendFormat:@"%02X",result[i]];
}
NSLog(@"%@",resultString);
总的来说,哈希算法是一种摘要算法,主要作用是用来获取数据的摘要。严格意义上来说不属于加密算法(因为没有解密过程)。获取字符串的MD5值比较简单,其它对象可以先转化成NSData对象再进行操作。可以根据路径直接获取文件数据,也可以将对象写入文件件后获取为NSData对象。iOS同样支持SHA1、base64、AES、钥匙串等方式加密数据。