iOS MD5和base64加密

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è)理解,如有不同意見并淋,或者更好的寓搬,歡迎指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末县耽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酬诀,更是在濱河造成了極大的恐慌脏嚷,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞒御,死亡現(xiàn)場離奇詭異父叙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肴裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門趾唱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜻懦,你說我怎么就攤上這事甜癞。” “怎么了宛乃?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵悠咱,是天一觀的道長。 經(jīng)常有香客問我征炼,道長析既,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任谆奥,我火速辦了婚禮眼坏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酸些。我一直安慰自己宰译,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布魄懂。 她就那樣靜靜地躺著沿侈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪市栗。 梳的紋絲不亂的頭發(fā)上肋坚,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼智厌。 笑死诲泌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铣鹏。 我是一名探鬼主播敷扫,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诚卸!你這毒婦竟也來了葵第?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤合溺,失蹤者是張志新(化名)和其女友劉穎卒密,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棠赛,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哮奇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睛约。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼎俘。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辩涝,靈堂內(nèi)的尸體忽然破棺而出贸伐,到底是詐尸還是另有隱情,我是刑警寧澤怔揩,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布捉邢,位于F島的核電站,受9級特大地震影響商膊,放射性物質(zhì)發(fā)生泄漏伏伐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一翘狱、第九天 我趴在偏房一處隱蔽的房頂上張望秘案。 院中可真熱鬧砰苍,春花似錦潦匈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吼旧,卻和暖如春凰锡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工掂为, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裕膀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓勇哗,卻偏偏與公主長得像昼扛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子欲诺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • MD5加密 簡介 它是用哈希算法加密的抄谐。哈希算法是一種摘要算法(是一種能產(chǎn)生特殊輸出格式的算法,這種算法的特點(diǎn)是:...
    YANG1220閱讀 3,954評論 0 9
  • 前言:之前也寫過一篇一樣的文章,但是那時(shí)候的排版有問題,太丑了,又使用 MarkDown的語法重新排了一下版 MD...
    YANG1220閱讀 603評論 0 4
  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進(jìn)行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽閱讀 2,935評論 0 7
  • 常見的加密算法 MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ D...
    小小啄閱讀 3,122評論 0 9
  • 首先羅列一些知識點(diǎn): 1.加密算法通常分為對稱性加密算法和非對稱性加密算法:對于對稱性加密算法,信息接收雙方都需事...
    JonesCxy閱讀 1,388評論 2 4