MD5:加密算法有很多種,在iOS開發(fā)當(dāng)中,MD5是我們常用的摘要算法
- PS:哈希算法,哈希算法將任意長度的二進(jìn)制值映射為較短的固定長度的二進(jìn)制值,這個(gè)小的二進(jìn)制值稱為哈希值。 哈希值是一段數(shù)據(jù)唯一且極其緊湊的數(shù)值表示形式。數(shù)據(jù)的哈希值可以檢驗(yàn)數(shù)據(jù)的完整性。一般用于快速查找和加密算法。 典型的哈希算法有:MD2、MD4、MD5 和 SHA-1等。
MD5:Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)。
MD5算法具有以下特點(diǎn):
- 壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的(16進(jìn)制,32位)
- 容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易
- 抗修改性:對原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別
- 強(qiáng)抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的
MD5加密的使用方式:首先,引入<CommonCrypto/CommonCrypto.h>
1)針對于字符串對象:
//準(zhǔn)備字符串
NSString * foo = @"I love my iOS teacher";
//1.獲取C字符串(MD5加密基于C語言實(shí)現(xiàn),F(xiàn)oundation框架字符串需要轉(zhuǎn)化)
const char * fooData = [foo UTF8String];//__strong const char *UTF8String,C語言無法持有字符串,必須用__strong修飾來拷貝內(nèi)容
//2.創(chuàng)建字符串?dāng)?shù)組接收MD5值
//一個(gè)字節(jié)是8位,兩個(gè)字節(jié)是16位,兩個(gè)字符可以表示一個(gè)16位進(jìn)制的數(shù),MD5結(jié)果為32位,實(shí)際上由16位16進(jìn)制數(shù)組成。
unsigned char resut[CC_MD5_DIGEST_LENGTH];
//3.計(jì)算MD5值(結(jié)果存儲(chǔ)在result數(shù)組中)
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)針對于非字符串的其他類型:將其它對象轉(zhuǎn)化為NSData對象(可以將對象事先寫入文件),然后獲取NSData對象的MD5值
//1.NSData對象獲取: 獲取文件路徑,根據(jù)文件路徑獲取NSData對象
NSString *path = [[NSBundle mainBundle] pathForResource:@"一雙人" ofType:@“mp3"];
NSData *data = [NSData dataWithContentsOfFile:path];
//2.創(chuàng)建MD5變量
CC_MD5_CTX md5;
//3.初始化MD5變量
CC_MD5_Init(&md5);
//4.準(zhǔn)備MD5加密
CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);
//5.結(jié)束MD5加密
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
//6.獲取結(jié)果
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);
總的來說,哈希算法是一種摘要算法,主要作用是用來獲取數(shù)據(jù)的摘要。嚴(yán)格意義上來說不屬于加密算法(因?yàn)闆]有解密過程)。獲取字符串的MD5值比較簡單,其它對象可以先轉(zhuǎn)化成NSData對象再進(jìn)行操作??梢愿鶕?jù)路徑直接獲取文件數(shù)據(jù),也可以將對象寫入文件件后獲取為NSData對象。iOS同樣支持SHA1、base64、AES、鑰匙串等方式加密數(shù)據(jù)。