iOS的簽名與證書機(jī)制(二):單向散列函數(shù)

完整文章列表:
iOS的簽名與證書機(jī)制(一):加密解密
iOS的簽名與證書機(jī)制(二):單向散列函數(shù)
iOS的簽名與證書機(jī)制(三):數(shù)字簽名與證書
iOS的簽名與證書機(jī)制(四):iOS的簽名

單向散列函數(shù)(One-way hash function),也稱之為消息摘要函數(shù)(Message Digest Function),哈希函數(shù),它可以根據(jù)消息的內(nèi)容計算出一個散列值,這個散列值,我們可以看做是這個消息的數(shù)字指紋,而且不管消息的內(nèi)容多少,小到幾個字節(jié),大到你珍藏多年的學(xué)習(xí)資料,都會被壓縮為一段固定長度的散列值,這是一個有損壓縮的過程.
之所以要學(xué)習(xí)單向散列函數(shù),是為了下一章的數(shù)字簽名打下基礎(chǔ);

翠花繼續(xù)上圖:


SHA1散列函數(shù).png

我們來看看單向散列函數(shù)的特點:

  • 任意長度的信息,計算出固定的散列值;
  • 單向性,即不可逆性,從散列值不能計算出原有的消息,不過對于MD5以及SHA-1算法,目前證明可以被破解,這里要介紹一下王小云教授,帶領(lǐng)中國團(tuán)隊破解了這兩種算法;
  • 如果明文不一樣,那么散列后的結(jié)果一定不一樣;
  • 如果明文一樣,散列后的結(jié)果一定一樣;

常見的單向散列函數(shù)有以下幾種:

  • MD4,MD5:Message Digest 4(5),產(chǎn)生的是128bit的散列值,目前已經(jīng)不安全,可以被暴力破解;
    在我們的Mac終端,可以直接使用md5命令;
    在項目中我們經(jīng)常使用的是對用戶密碼等隱私信息進(jìn)行MD5加密,然后發(fā)送到服務(wù)器,下面就是我們常用的MD5加密代碼
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (MD5)
#pragma mark - 32位 小寫 
- (NSString *)MD5ForLower32Bate{
    //要進(jìn)行UTF8的轉(zhuǎn)碼
    const char* input = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02x", result[i]];
    } return digest; }
  • SHA-1:Secure Hash Algorithm 1,安全散列算法1,產(chǎn)生160bit的散列值,目前已不安全,下面我也會附上iOS項目中使用該算法加密的代碼;
  • SHA-2:包括了SHA-256,SHA-384,SHA-512,對應(yīng)的計算出的散列值長度為256bit,384bit,512bit;
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>
@implementation NSString (Hash)
- (NSString *)sha1String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)sha256String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA256_DIGEST_LENGTH];
}

- (NSString *)sha512String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA512_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(unsigned char *)bytes length:(NSInteger)length
{
    NSMutableString *mutableString = @"".mutableCopy;
    for (NSInteger i = 0; i < length; i++)
        [mutableString appendFormat:@"%02x", bytes[i]];
    return [NSString stringWithString:mutableString];
}

  • SHA-3:包括了SHA3-256,SHA3-384,SHA3-512,對應(yīng)的計算出的散列值長度為256bit,384bit,512bit,這也是現(xiàn)在全新的標(biāo)準(zhǔn);

那么單向散列函數(shù)可以應(yīng)用在哪些方面呢?

  1. 隱私信息加密傳輸;
    當(dāng)用戶在客戶端填寫完賬號密碼向服務(wù)器驗證的時候,密碼絕對不能明文傳輸,或者說我們在服務(wù)器中保存的只是用戶密碼的哈希值,每次用兩個哈希值進(jìn)行比較;


    口令加密.png
  2. 文件識別,防止數(shù)據(jù)被篡改;
    很多unix軟件下載的時候,在文件的下載地址下方會有一個散列值,同時還會提供一套計算文件散列值的小工具,當(dāng)你下載完畢的時候,計算出下載文件的散列值與官方的進(jìn)行對比,如果一致則說明軟件是安全的,沒有被篡改過;
    比如這個軟件:https://www.realvnc.com/en/connect/download/vnc/;
    這也正是下一章的數(shù)字簽名會用到的特性;
  3. 保存文件與圖片的唯一性,防止重復(fù)下載;
    很多App需要從服務(wù)器下載圖片或者文件,存儲在本地的時候,可以用下載地址的md5散列值來作為文件名.下載之前,可以通過下載地址的md5散列值來檢查本地是否已經(jīng)有了該文件,避免重復(fù)下載;

看到這里,需要小伙伴記住的是:消息摘要,作為信息的簽名和指紋,可以把大量信息壓縮為一個固定長度的散列值,可以驗證消息是否被篡改;

在下一章的數(shù)字簽名中,小伙伴就可以看到它的具體應(yīng)用;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末组哩,一起剝皮案震驚了整個濱河市蜈缤,隨后出現(xiàn)的幾起案子宠页,更是在濱河造成了極大的恐慌蝴韭,老刑警劉巖抛猖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茎匠,死亡現(xiàn)場離奇詭異,居然都是意外死亡搁廓,警方通過查閱死者的電腦和手機(jī)引颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境蜕,“玉大人蝙场,你說我怎么就攤上這事×荒辏” “怎么了售滤?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長台诗。 經(jīng)常有香客問我完箩,道長,這世上最難降的妖魔是什么拉庶? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任嗜憔,我火速辦了婚禮秃励,結(jié)果婚禮上氏仗,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好皆尔,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布呐舔。 她就那樣靜靜地躺著,像睡著了一般慷蠕。 火紅的嫁衣襯著肌膚如雪珊拼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天流炕,我揣著相機(jī)與錄音澎现,去河邊找鬼。 笑死每辟,一個胖子當(dāng)著我的面吹牛剑辫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渠欺,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妹蔽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挠将?” 一聲冷哼從身側(cè)響起胳岂,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舔稀,沒想到半個月后乳丰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡内贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年成艘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺归。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淆两,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拂酣,到底是詐尸還是另有隱情秋冰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布婶熬,位于F島的核電站剑勾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赵颅。R本人自食惡果不足惜虽另,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饺谬。 院中可真熱鬧捂刺,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仪缸,卻和暖如春贵涵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恰画。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工宾茂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拴还。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓刻炒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自沧。 傳聞我的和親對象是個殘疾皇子坟奥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355