MD5和base64加密
在網(wǎng)絡(luò)發(fā)展趨勢日漸迅猛的今天炭玫,數(shù)據(jù)的安全性也越來越重要貌虾。因此,如何保證用戶數(shù)據(jù)的安全就成為了我們不得不考慮的一個(gè)問題榴鼎。在iOS中最常見的兩種加密方式是base64加密碼和MD5加密晚唇。base64加密屬于可逆性的加密,意思就是既可以加密平项,也可以解密悍及。而MD5加密屬于不可逆性的加密,只能夠給我們提供加密的方式扣讼,卻沒有解密的方式缨叫,一般情況多應(yīng)用與登錄注冊界面。
MD5加密
MD5簡介
MD5是利用哈希算法來加密的销钝。哈希算法是一種摘要算法蒸健,從嚴(yán)格意義上來講它不屬于加密算法(因?yàn)樗鼪]有解密的過程),MD5有以下兩個(gè)最主要的特性渣叛。
- 加密的不可逆性盯捌,只能夠加密,不能夠解密。
- 任意長度的明文經(jīng)過加密后長度都是固定的筷狼,長度為16進(jìn)制32位埂材。
它還有以下幾種特點(diǎn)
- 容易計(jì)算:根據(jù)原數(shù)據(jù)計(jì)算出MD5很容易
- 抗修改性:MD5對原數(shù)據(jù)十分的敏感,哪怕只修改了一個(gè)字節(jié)严拒,得到的MD5的值與之前的MD5數(shù)值都有很大的差別竖独。
- 防偽性能高:已知原數(shù)據(jù)和它的MD5值,想要找到相同MD5值得數(shù)據(jù)是非常困難的种蘸,可以說幾乎是不可能的竞膳。
準(zhǔn)備工作
在我們正式使用MD5之前我們還需要做一些準(zhǔn)備工作坦辟,首先我們需要引入<CommonCrypto/CommonCrypto.h>
這個(gè)頭文件。
示例代碼
在這里我們將MD5加密封裝在一個(gè)類中滨彻,以便于我們?nèi)蘸笫褂闷饋砀拥姆奖恪_@里我們提供了兩個(gè)類方法翰舌,分別對NSString和NSData進(jìn)行加密冬骚,聲明成類方法是為了調(diào)用的時(shí)候方便。
MySecurities.h 文件
#import <Foundation/Foundation.h>
@interface MySecurities : NSObject
+(NSString *)md5String:(NSString *)sourceString;//md5字符串加密
+(NSString *)md5Data:(NSData *)sourceData;//md5data加密
@end
MySecurities.h 文件
@implementation MySecurities
+(NSString *)md5String:(NSString *)sourceString{
if(!sourceString){
return nil;//判斷sourceString如果為空則直接返回nil庇麦。
}
//MD5加密都是通過C級別的函數(shù)來計(jì)算山橄,所以需要將加密的字符串轉(zhuǎn)換為C語言的字符串
const char *cString = sourceString.UTF8String;
//創(chuàng)建一個(gè)C語言的字符數(shù)組舍悯,用來接收加密結(jié)束之后的字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5計(jì)算(也就是加密)
//第一個(gè)參數(shù):需要加密的字符串
//第二個(gè)參數(shù):需要加密的字符串的長度
//第三個(gè)參數(shù):加密完成之后的字符串存儲(chǔ)的地方
CC_MD5(cString, (CC_LONG)strlen(cString), result);
//將加密完成的字符拼接起來使用(16進(jìn)制的)萌衬。
//聲明一個(gè)可變字符串類型,用來拼接轉(zhuǎn)換好的字符
NSMutableString *resultString = [[NSMutableString alloc]init];
//遍歷所有的result數(shù)組朴艰,取出所有的字符來拼接
for (int i = 0;i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02x",result[i]];
//%02x:x 表示以十六進(jìn)制形式輸出混移,02 表示不足兩位,前面補(bǔ)0輸出毁嗦;超出兩位回铛,不影響。當(dāng)x小寫的時(shí)候驶俊,返回的密文中的字母就是小寫的免姿,當(dāng)X大寫的時(shí)候返回的密文中的字母是大寫的。
}
//打印最終需要的字符
NSLog(@"resultString === %@",resultString);
return resultString;
}
@end
MySecurities.h 文件
@implementation MySecurities
+(NSString *)md5Data:(NSData *)sourceData{
if (!sourceData) {
return nil;//判斷sourceString如果為空則直接返回nil想鹰。
}
//需要MD5變量并且初始化
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
//開始加密(第一個(gè)參數(shù):對md5變量去地址药版,要為該變量指向的內(nèi)存空間計(jì)算好數(shù)據(jù)槽片,第二個(gè)參數(shù):需要計(jì)算的源數(shù)據(jù),第三個(gè)參數(shù):源數(shù)據(jù)的長度)
CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
//聲明一個(gè)無符號的字符數(shù)組还栓,用來盛放轉(zhuǎn)換好的數(shù)據(jù)
unsigned char result[CC_MD5_DIGEST_LENGTH];
//將數(shù)據(jù)放入result數(shù)組
CC_MD5_Final(result, &md5);
//將result中的字符拼接為OC語言中的字符串剩盒,以便我們使用。
NSMutableString *resultString = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02X",result[i]];
}
NSLog(@"resultString=========%@",resultString);
return resultString;
@end
base64加密
base64簡介
Base64編碼可用于在HTTP環(huán)境下傳遞較長的標(biāo)識信息纪挎。例如跟匆,在Java Persistence系統(tǒng)Hibernate中贾铝,就采用了Base64來將一個(gè)較長的唯一標(biāo)識符(一般為128-bit的UUID)編碼為一個(gè)字符串埠帕,用作HTTP表單和HTTP GET URL中的參數(shù)。在其他應(yīng)用程序中叁巨,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域)中的形式呐籽。此時(shí)狡蝶,采用Base64編碼不僅比較簡短庶橱,同時(shí)也具有不可讀性,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到贪惹。
示例代碼
和MD5一樣我們采取封裝的辦法將base64封裝進(jìn)了MySecurities這個(gè)類中苏章,我們也提供了兩種加密的方式
MySecurities.h 文件
#import <Foundation/Foundation.h>
@interface MySecurities : NSObject
+(NSString *)base64EncodingWithData:(NSData *)sourceData;//base64加密
+(id)base64EncodingWithString:(NSString *)sourceString;//base64解密
@end
base64加密
MySecurities.m 文件
@implementation MySecurities
+(NSString *)base64EncodingWithData:(NSData *)sourceData{
if (!sourceData) {//如果sourceData則返回nil,不進(jìn)行加密。
return nil;
}
NSString *resultString = [sourceData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
return resultString;
}
@end
base64解密
MySecurities.m 文件
@implementation MySecurities
+(id)base64EncodingWithString:(NSString *)sourceString{
if (!sourceString) {
return nil;//如果sourceString則返回nil枫绅,不進(jìn)行解密泉孩。
}
NSData *resultData = [[NSData alloc]initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters];
return resultData;
}
@end
這是我個(gè)人對著兩種加密方式的一個(gè)理解,如有不同意見并淋,或者更好的寓搬,歡迎指正。