449芥玉,散列、對稱加密和非對稱加密(面試點(diǎn):)

一备图、散列(哈希)

1.簡介

散列函數(shù)灿巧,又稱散列算法哈希函數(shù)揽涮,是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法抠藕。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小蒋困,將數(shù)據(jù)的格式固定下來盾似。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個(gè)叫做散列值(hash values雪标,hash codes零院,hash sums,或hashes)的指紋村刨。散列值通常用一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串來代表告抄。
將數(shù)據(jù)(如一段文字)運(yùn)算變?yōu)榱硪还潭ㄩL度值,是散列算法的基礎(chǔ)原理嵌牺。

2.特點(diǎn)

  • 對相同數(shù)據(jù)運(yùn)算打洼,結(jié)果相同
  • 對不同數(shù)據(jù)運(yùn)算,結(jié)果長度相同
  • 運(yùn)算單向不可逆

3.常用算法

MD5
MD5消息摘要算法(英語:MD5 Message-Digest Algorithm)逆粹,一種被廣泛使用的密碼散列函數(shù)募疮,可以產(chǎn)生出一個(gè)128位(16字節(jié),32個(gè)字符)的散列值(hash value)僻弹,用于確保信息傳輸完整一致阿浓。

SHA家族
安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個(gè)密碼散列函數(shù)家族奢方,是FIPS所認(rèn)證的安全散列算法搔扁。

MD5使用比較頻繁爸舒,但是如果只是簡單使用MD5安全性較低,目前已有網(wǎng)站提供部分MD5破解稿蹲,如https://www.cmd5.com扭勉。為了增加安全性,使用MD5時(shí)一般會在加密數(shù)據(jù)后加上某個(gè)隨機(jī)值(就是所謂的加鹽)苛聘,然后再進(jìn)行MD5運(yùn)算涂炎。

HMAC,全稱為“Hash Message Authentication Code”设哗,中文名“散列消息鑒別碼”唱捣,主要是利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入网梢,生成一個(gè)消息摘要作為輸出震缭。秘鑰就是我們上述所說的‘鹽’,使用HMAC會加大安全性,同時(shí)HMAC對所有散列算法都有效战虏。

4.實(shí)際應(yīng)用

哈希算法用途很多拣宰,比如用戶密碼加密文件校驗(yàn)烦感、數(shù)字簽名和數(shù)據(jù)檢索巡社。

用戶密碼加密

這里提供一個(gè)用戶密碼加密的方案:采用HMAC+MD5的方式進(jìn)行加密,每個(gè)用戶對應(yīng)一個(gè)KEY作為HMAC的秘鑰手趣,HMAC運(yùn)算結(jié)果再加上服務(wù)器返回的時(shí)間戳進(jìn)行MD5,最終得到的值在網(wǎng)絡(luò)上進(jìn)行傳輸晌该。為了進(jìn)一步提高安全性KEY可以每過一段時(shí)間更換一次。

image.png

獲取KEY的時(shí)機(jī):

  • 注冊時(shí)
  • 登陸時(shí)本地沒有KEY
  • 登陸時(shí)本地有KEY绿渣,但是檢測該賬號更換了設(shè)備

服務(wù)器和客戶端加密數(shù)據(jù)對比:

  • 首先服務(wù)器存儲的是HMAC(密碼+KEY) = password,返回客戶端的時(shí)間戳是timeInterval

  • 服務(wù)器會計(jì)算2個(gè)值:MD5(password + timeInterval) = password_s1朝群;MD5(password + (timeInterval - 60s)) = password_s2

  • 客戶端請求的密碼數(shù)據(jù)是MD5( HMAC(密碼 + KEY) + 時(shí)間戳) = password_app

  • 服務(wù)器會對比password_app是否是password_s1和password_s2中的一個(gè)值,如果匹配到則密碼校驗(yàn)成功

文件校驗(yàn)

MD5和SHA1都具有高度的離散性怯晕,哪怕是只修改一個(gè)字節(jié)值都會導(dǎo)致MD5或SHA1值“巨大”變化潜圃,從實(shí)踐角度,不同信息具有相同MD5或SHA1碼 的可能性非常低舟茶,通常認(rèn)為是不可能的谭期。
MD5 Hash算法的"數(shù)字指紋"特性,使它成為目前應(yīng)用最廣泛的一種文件完整性校驗(yàn)和(Checksum)算法吧凉。
注:秒傳就是利用文件校驗(yàn)原理隧出,哈希值相同代表改文件已經(jīng)存在服務(wù)器,造成一種秒傳的假象阀捅。

數(shù)字簽名

由于哈希算法的唯一性胀瞪,可以利用數(shù)據(jù)的哈希值判斷數(shù)據(jù)是否被篡改,以此實(shí)現(xiàn)數(shù)字簽名。通常傳遞給服務(wù)器的哈希值是經(jīng)過RSA加密的凄诞。

數(shù)據(jù)檢索

對搜索關(guān)鍵字進(jìn)行哈希圆雁,通過哈希值匹配文件的關(guān)鍵字哈希值,以此實(shí)現(xiàn)檢索帆谍。

二伪朽、對稱加密

1.簡介

對稱密鑰加密(英語:Symmetric-key algorithm)又稱為對稱加密私鑰加密汛蝙、共享密鑰加密烈涮,是密碼學(xué)中的一類加密算法。這類算法在加密和解密時(shí)使用相同的密鑰窖剑,或是使用兩個(gè)可以簡單地相互推算的密鑰坚洽。

2.特點(diǎn)

  • 計(jì)算量小
  • 加密速度快、機(jī)密效率高
  • 加密和解密使用相同秘鑰西土,安全隱患大

3.常用算法

  • DES
    數(shù)據(jù)加密標(biāo)準(zhǔn)(英語:Data Encryption Standard讶舰,縮寫為 DES)是一種對稱密鑰加密算法。
    DES現(xiàn)在已經(jīng)不是一種安全的加密方法翠储,主要因?yàn)樗褂玫?6位密鑰過短绘雁。
  • 3DES
    三重?cái)?shù)據(jù)加密算法(英語:Triple Data Encryption Algorithm,縮寫為TDEA援所,Triple DEA),或稱3DES(Triple DES)欣除,是一種對稱密鑰加密塊密碼住拭,相當(dāng)于是對每個(gè)數(shù)據(jù)塊應(yīng)用三次數(shù)據(jù)加密標(biāo)準(zhǔn)(DES)算法。
    由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng)历帚,原版DES密碼的密鑰長度變得容易被暴力破解滔岳;3DES即是設(shè)計(jì)用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊挽牢,而不是設(shè)計(jì)一種全新的塊密碼算法谱煤。
  • AES
    高級加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard,縮寫:AES)禽拔,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)刘离。

密碼學(xué)中,分組(block)密碼的工作模式(mode of operation)允許使用同一個(gè)分組密碼密鑰對多于一塊的數(shù)據(jù)進(jìn)行加密睹栖,并保證其安全性硫惕。分組密碼自身只能加密長度等于密碼分組長度的單塊數(shù)據(jù),若要加密變長數(shù)據(jù)野来,則數(shù)據(jù)必須先被劃分為一些單獨(dú)的密碼塊恼除。通常而言,最后一塊數(shù)據(jù)也需要使用合適填充方式將數(shù)據(jù)擴(kuò)展到匹配密碼塊大小的長度曼氛。
工作模式通常應(yīng)用于對稱加密豁辉,這里主要介紹一下ECBCBC兩種工作模式令野。

- (NSString *)aesCBCEncryptWithKey:(NSString *)key iv:(NSString *)iv {
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
   NSData *result = [data aesCBCEncrypt:key iv:iv];
    return [result base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    }

- (NSString *)aesCBCDecryptWithKey:(NSString *)key iv:(NSString *)iv {
    NSData *data = [[NSData alloc] initWithBase64EncodedString:self options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSData *result = [data aesCBCDecrypt:key iv:iv];
    return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}


#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
@implementation NSData (FNCBCAEScryption)


 - (NSData *)aesCBCEncrypt:(NSString *)key iv:(NSString*)iv {
     return [self aesEncrypt:key alg:kCCAlgorithmAES options:kCCOptionPKCS7Padding iv:iv];
    }
- (NSData *)aesCBCDecrypt:(NSString *)key iv:(NSString*)iv {
   return [self aesDecrypt:key alg:kCCAlgorithmAES options:kCCOptionPKCS7Padding iv:iv];
}

- (NSData *)aesEncrypt:(NSString *)key alg:(CCAlgorithm)alg options:(CCOptions)options iv:(NSString*)iv {
    return [self aes:key alg:alg options:options iv:iv isEncrypt:YES];
    }

- (NSData *)aesDecrypt:(NSString *)key alg:(CCAlgorithm)alg options:(CCOptions)options iv:(NSString*)iv {
    return [self aes:key alg:alg options:options iv:iv isEncrypt:NO];
}

- (NSData *)aes:(NSString *)key alg:(CCAlgorithm)alg options:(CCOptions)options iv:(NSString*)iv isEncrypt:(BOOL)isEncrypt {
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(isEncrypt ? kCCEncrypt:kCCDecrypt, alg,
                                          options,
                                          keyPtr, kCCKeySizeAES256,
                                          [iv UTF8String],
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}
@end

電子密碼本(ECB)

最簡單的加密模式即為電子密碼本(Electronic codebook,ECB)模式徽级。需要加密的消息按照塊密碼的塊大小被分為數(shù)個(gè)塊彩掐,并對每個(gè)塊進(jìn)行獨(dú)立加密。

image.png
image.png

ECB模式的缺點(diǎn)在于同樣的明文塊會被加密成相同的密文塊灰追;因此堵幽,它不能很好的隱藏?cái)?shù)據(jù)模式。
下面的例子顯示了ECB在密文中顯示明文的模式的程度:該圖像的一個(gè)位圖版本(左圖)通過ECB模式可能會被加密成中圖弹澎,而非ECB模式通常會將其加密成右圖朴下。

image.png

密碼塊鏈接(CBC)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苦蒿,隨后出現(xiàn)的幾起案子殴胧,更是在濱河造成了極大的恐慌,老刑警劉巖佩迟,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件团滥,死亡現(xiàn)場離奇詭異,居然都是意外死亡报强,警方通過查閱死者的電腦和手機(jī)灸姊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秉溉,“玉大人力惯,你說我怎么就攤上這事≌偎唬” “怎么了父晶?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弄跌。 經(jīng)常有香客問我甲喝,道長,這世上最難降的妖魔是什么铛只? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任埠胖,我火速辦了婚禮,結(jié)果婚禮上格仲,老公的妹妹穿的比我還像新娘押袍。我一直安慰自己,他們只是感情好凯肋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布谊惭。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圈盔。 梳的紋絲不亂的頭發(fā)上豹芯,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音驱敲,去河邊找鬼铁蹈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛众眨,可吹牛的內(nèi)容都是我干的握牧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼娩梨,長吁一口氣:“原來是場噩夢啊……” “哼沿腰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狈定,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤颂龙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纽什,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體措嵌,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年芦缰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了企巢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饺藤,死狀恐怖包斑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涕俗,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布神帅,位于F島的核電站再姑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏找御。R本人自食惡果不足惜元镀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霎桅。 院中可真熱鬧栖疑,春花似錦、人聲如沸滔驶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萝快,卻和暖如春锻霎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揪漩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工旋恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奄容。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓冰更,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昂勒。 傳聞我的和親對象是個(gè)殘疾皇子蜀细,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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