一备图、散列(哈希)
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í)間更換一次。
獲取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)用于對稱加密豁辉,這里主要介紹一下ECB和CBC兩種工作模式令野。
- (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ú)立加密。
ECB模式的缺點(diǎn)在于同樣的明文塊會被加密成相同的密文塊灰追;因此堵幽,它不能很好的隱藏?cái)?shù)據(jù)模式。
下面的例子顯示了ECB在密文中顯示明文的模式的程度:該圖像的一個(gè)位圖版本(左圖)通過ECB模式可能會被加密成中圖弹澎,而非ECB模式通常會將其加密成右圖朴下。