iOS安全之路--MD5

一评也、MD5簡介

MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法)缀程。其作用是對(duì)一段信息(該信息可以很大)生成信息摘要(很小),該摘要對(duì)該信息具有唯一性,可以作為數(shù)字簽名。用于驗(yàn)證文件的有效性(是否有丟失或損壞的數(shù)據(jù)屹堰,云盤對(duì)文件的校驗(yàn)也是使用MD5) 和對(duì)用戶密碼的加密等。


云盤文件校驗(yàn)

需要說明的是唯一性和不可逆性都不是絕對(duì)的街氢,從理論上分析是一種多對(duì)一的關(guān)系扯键,但兩個(gè)不同的信息產(chǎn)生相同摘要的概率很小。不可逆是指從輸出反推輸入所需的運(yùn)算量和計(jì)算時(shí)間太大珊肃,使用窮搜字典的方法又需要太多的存儲(chǔ)空間荣刑。所以MD5也并非完全安全的,現(xiàn)在可以搜索到許多MD5的破解軟件伦乔。

二厉亏、算法描述

描述出處

算法輸入是一個(gè)字節(jié)串,每個(gè)字節(jié)是8個(gè)bit.
算法的執(zhí)行分為以下幾個(gè)步驟:

1.補(bǔ)位:

MD5算法先對(duì)輸入的數(shù)據(jù)進(jìn)行補(bǔ)位烈和,使得數(shù)據(jù)的長度(以byte為單位)對(duì)64求余的結(jié)果是56爱只。
即數(shù)據(jù)擴(kuò)展至LEN=K*64+56個(gè)字節(jié),K為整數(shù)招刹。
補(bǔ)位方法:補(bǔ)一個(gè)1恬试,然后補(bǔ)0至滿足上述要求。相當(dāng)于補(bǔ)一個(gè)0x80的字節(jié)疯暑,再補(bǔ)值為0的字節(jié)训柴。這一步里總共補(bǔ)充的字節(jié)數(shù)為0~63個(gè)。

2.附加數(shù)據(jù)長度:

用一個(gè)64位的整數(shù)表示數(shù)據(jù)的原始長度(以bit為單位)妇拯,將這個(gè)數(shù)字的8個(gè)字節(jié)按低位的在前幻馁,
高位在后的順序附加在補(bǔ)位后的數(shù)據(jù)后面。這時(shí)越锈,數(shù)據(jù)被填補(bǔ)后的總長度為:LEN = K64+56+8=(K+1)64 Bytes宣赔。
※注意那個(gè)64位整數(shù)是輸入數(shù)據(jù)的原始長度而不是填充字節(jié)后的長度,我就在這里栽了跟頭.

3.初始化MD5參數(shù):

有四個(gè)32位整數(shù)變量 (A,B,C,D) 用來計(jì)算信息摘要,每一個(gè)變量被初始化成以下以十六進(jìn)制數(shù)表示的數(shù)值瞪浸,低位的字節(jié)在前面儒将。
word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10
※注意低位的字節(jié)在前面指的是Little Endian平臺(tái)上內(nèi)存中字節(jié)的排列方式,而在程序中書寫時(shí)对蒲,要寫成:
A=0x67452301
B=0xefcdab89
C=0x98badcfe
D=0x10325476

4.定義四個(gè)MD5基本的按位操作函數(shù):

X钩蚊,Y贡翘,Z為32位整數(shù)。
F(X,Y,Z) = (X and Y) or (not(X) and Z)
G(X,Y,Z) = (X and Z) or (Y and not(Z))
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X or not(Z))

再定義四個(gè)分別用于四輪變換的函數(shù)砰逻。設(shè)Mj表示消息的第j個(gè)子分組(從0到15)鸣驱,<<<s表示循環(huán)左移s位,則四種操作為:
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)

5.對(duì)輸入數(shù)據(jù)作變換蝠咆。

處理數(shù)據(jù)踊东,N是總的字節(jié)數(shù),以64個(gè)字節(jié)為一組刚操,每組作一次循環(huán)闸翅,每次循環(huán)進(jìn)行四輪操作。要變換的64個(gè)字節(jié)用16個(gè)32位的整數(shù)數(shù)組M[0 ...15]表示菊霜。而數(shù)組T[1 ... 64]表示一組常數(shù)坚冀, T[i]為4294967296*abs(sin(i))的32位整數(shù)部分,i的單位是弧度,i的取值從1到64鉴逞。具體過程如下:

/* 設(shè)置主循環(huán)變量 */
For i = 0 to N/16-1 do

/*每循環(huán)一次记某,把數(shù)據(jù)原文存放在16個(gè)元素的數(shù)組X中. /
For j = 0 to 15 do
Set X[j] to M[i
16+j].
end /結(jié)束對(duì)J的循環(huán)

/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D

/* 第1輪/
/
以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). /
/
Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

/* 第2輪* /
/
以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). /
/
Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]

/* 第3輪/
/
以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). /
/
Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

/* 第4輪/
/
以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). /
/
Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

/* 然后進(jìn)行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD

Next i /* 結(jié)束對(duì)I的循環(huán)*/

6.輸出結(jié)果。

A构捡,B液南,C,D連續(xù)存放勾徽,共16個(gè)字節(jié)贺拣,128位。按十六進(jìn)制依次輸出這個(gè)16個(gè)字節(jié)捂蕴。

三譬涡、算法實(shí)現(xiàn)

@implementation CATSecurity

#pragma mark --
#pragma mark -- MD5

/**
 *  get data's md5 string
 *
 *  @param data source data
 *
 *  @return md5 string
 */
+(NSString *)md5StringWithData:(NSData *)data{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data.bytes, (CC_LONG)data.length, result);
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}

/**
 *  get data's md5 data
 *
 *  @param data source data
 *
 *  @return md5 data
 */
+(NSData *)md5DataWithData:(NSData *)data{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data.bytes, (CC_LONG)data.length, result);
    return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
}

/**
 *  get string's md5 string
 *
 *  @param str source string
 *
 *  @return md5 string
 */
+(NSString *)md5StringWithString:(NSString *)str{
    NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
    return [self md5StringWithData:data];
}

@end

四、算法優(yōu)化

加鹽MD5(鹽的復(fù)雜度決定了增加的破解難度)

/**
 *  get string's md5 string
 *
 *  @param str source string
 *  @param salt salt string
 *
 *  @return md5 string
 */
+(NSString *)md5StringWithString:(NSString *)str salt:(NSString *)salt{
    NSString* strTmp = [str stringByAppendingString:salt];
    return [self md5StringWithString:strTmp];
}

二次MD5(容易被找到規(guī)律而破解)

/**
 *  get string's multiple md5 string
 *
 *  @param str source string
 *
 *  @return md5 string
 */
+(NSString *)md5StringMultipleWithString:(NSString *)str{
    NSString* strTmp = [self md5StringWithString:str];
    strTmp = [self md5StringWithString:strTmp];
    return strTmp;
}

MD5后亂序(破解難度較大)

/**
 *  get string's disorder md5 string
 *
 *  @param str source string
 *
 *  @return md5 string
 */
+(NSString *)md5StringDisorderWithString:(NSString *)str{
    NSString *ss = [self md5StringWithString:str];
    NSString *header = [ss substringToIndex:2];
    NSString *footer = [ss substringFromIndex:2];
    ss = [footer stringByAppendingString:header];
    return ss;
}

最后附上工程地址啥辨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涡匀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溉知,更是在濱河造成了極大的恐慌陨瘩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件级乍,死亡現(xiàn)場離奇詭異舌劳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玫荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門甚淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捅厂,你說我怎么就攤上這事贯卦∽嗜幔” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵撵割,是天一觀的道長贿堰。 經(jīng)常有香客問我,道長啡彬,這世上最難降的妖魔是什么羹与? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮庶灿,結(jié)果婚禮上纵搁,老公的妹妹穿的比我還像新娘。我一直安慰自己跳仿,他們只是感情好诡渴,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布捐晶。 她就那樣靜靜地躺著菲语,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惑灵。 梳的紋絲不亂的頭發(fā)上山上,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音英支,去河邊找鬼佩憾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛干花,可吹牛的內(nèi)容都是我干的妄帘。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼池凄,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼抡驼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肿仑,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤致盟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尤慰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏锡,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年伟端,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杯道。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡责蝠,死狀恐怖蕉饼,靈堂內(nèi)的尸體忽然破棺而出虐杯,到底是詐尸還是另有隱情,我是刑警寧澤昧港,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布擎椰,位于F島的核電站,受9級(jí)特大地震影響创肥,放射性物質(zhì)發(fā)生泄漏达舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一叹侄、第九天 我趴在偏房一處隱蔽的房頂上張望巩搏。 院中可真熱鬧,春花似錦趾代、人聲如沸贯底。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禽捆。三九已至,卻和暖如春飘哨,著一層夾襖步出監(jiān)牢的瞬間胚想,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國打工芽隆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊服,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓胚吁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腕扶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孽拷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 【1】7,9蕉毯,-1乓搬,5,( ) A代虾、4进肯;B、2棉磨;C江掩、-1;D、-3 分析:選D环形,7+9=16策泣;9+(-1)=8;(...
    Alex_bingo閱讀 18,988評(píng)論 1 19
  • 版本記錄 前言 在這個(gè)信息爆炸的年代抬吟,特別是一些敏感的行業(yè)萨咕,比如金融業(yè)和銀行卡相關(guān)等等,這都對(duì)app的安全機(jī)制有更...
    刀客傳奇閱讀 3,153評(píng)論 0 11
  • 學(xué)而時(shí)習(xí)之不亦悅乎 有朋自遠(yuǎn)方來不亦樂乎 人不知而不慍,不亦君子乎 自己的學(xué)識(shí)钙畔,治世之識(shí)被當(dāng)時(shí)人所認(rèn)同茫陆,是一件快樂...
    在雨中微笑閱讀 247評(píng)論 0 1
  • 由如何計(jì)算一組簡單的低買高賣數(shù)據(jù)獲得最大收益引出的最大子數(shù)組計(jì)算算法。 1. 概述 按照慣例擎析,注釋掉的代碼可以顯示...
    JaiUnChat閱讀 321評(píng)論 0 0
  • 業(yè)精于勤簿盅,80后的小伙好樣的。 他沒有華麗的背景揍魂,沒有與眾不同的幸運(yùn)桨醋,沒有高、富愉烙、帥的外型讨盒,沒有天時(shí)解取,地利...
    荷里閣閱讀 301評(píng)論 0 0