HASH
現(xiàn)在在處理App的用戶敏感信息方面,大部分都是采用HASH加密的方式來進行處理。
1、HASH的概念
Hash,一般翻譯做“散列”,也有直接音譯為“哈?!钡?,就是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。
2、HASH的特點
? 算法是公開的
? 對相同數(shù)據(jù)運算,得到的結(jié)果是一樣的
? 對不同數(shù)據(jù)運算,如MD5得到的結(jié)果默認(rèn)是128位,32個字符(16進制標(biāo)識)。
? 沒法進行逆運算
? 信息摘要,信息“指紋”,是用來做數(shù)據(jù)識別的。
3、HASH的用途
? 用戶密碼的加密
? 搜索引擎
? 版權(quán)
? 數(shù)字簽名
密碼加密處理
1、直接使用md5
//密碼
NSString* pwd =@"123456";
//MD5 直接加密 e10adc3949ba59abbe56e057f20f883e
//不足:不夠安全了??梢苑床樵?!
pwd = pwd.md5String;
2、md5+salt方式
//MD5 加鹽
//弊端: 鹽是固定的,寫死在程序里面,一旦泄露就不安全了!
static NSString * salt = @"67%^&^ffhjgjkHD";
pwd = [pwd stringByAppendingString:salt].md5String;
3、HMAC方式加密
/** HMAC
* 使用一個密鑰加密,并且做兩次散列!
* 在實際開發(fā)中,密鑰(KEY)來自于服務(wù)器(動態(tài)的)!
* 一個賬號,對應(yīng)一個KEY,而且還可以跟新!
*/
NSString*serverKey =@"chh";
pwd = [pwd hmacMD5StringWithKey:serverKey];
4、HMAC方式優(yōu)化
/** HMAC優(yōu)化
* 由于直接一直使用HMAC的話,容易被逆向獲取HMAC,
* 所以考慮在傳輸HMAC的前向服務(wù)器請求時間戳(忽略秒),
* 然后在HMAC基礎(chǔ)上加上服務(wù)器的時間戳并進行md5加密后進行傳輸
* 服務(wù)器存儲的是HMAC(密碼+KEY)的值和KEY,key用于返給客戶端,校驗的時候只需拿HMAC這個值再加上時間戳進行MD5進行比較
*/
pwd = [[pwd hmacMD5StringWithKey:serverKey] stringByAppendingString:@"服務(wù)器時間戳"].md5String;
數(shù)字簽名
數(shù)字簽名本質(zhì)上是通過HASH算法和RSA加密來實現(xiàn)的。
HASH算法專門用來做文件數(shù)據(jù)的識別.那么在網(wǎng)絡(luò)數(shù)據(jù)傳遞的過程中,我們可以將明文數(shù)據(jù),和數(shù)據(jù)的HASH值一起傳遞給對方.對方可以拿出HASH值來進行驗證。
但是在這個過程中,如何做到數(shù)據(jù)的保護呢?明文數(shù)據(jù)和HASH值如果直接傳遞就有都被篡改的風(fēng)險.所以這里我們要對數(shù)據(jù)進行加密。明文數(shù)據(jù)有時會比較大,不適合使用RSA非對稱加密算法,那么數(shù)據(jù)的HASH值是比較小的。這個數(shù)據(jù)是用于校驗的,它完全可以使用RSA來加密。所以在數(shù)據(jù)傳遞的時候,我們將明文數(shù)據(jù)加上通過RSA加密的校驗數(shù)據(jù)一并傳遞給對方。那么這個通過RSA加密的校驗數(shù)據(jù),我們稱之為簽名.
驗證數(shù)字簽名
當(dāng)對方拿到數(shù)據(jù)之后,如何進行驗證呢?
首先傳遞數(shù)據(jù)時會將原始的數(shù)據(jù)和數(shù)字簽名一起發(fā)送
對方拿到數(shù)據(jù)后,先進行校驗,拿到原始數(shù)據(jù),通過同樣的HASH算法得到數(shù)據(jù)的HASH值。
然后通過非對稱加密,將數(shù)字簽名中的校驗HASH值解密出來。
最后對比兩個HASH值是否一致,這樣可以很好的判斷數(shù)據(jù)是否被篡改。