簡介
MD5加密是最常用的不可逆加密方法之一企蹭,是將字符串通過相應(yīng)特征生成一段32位的數(shù)字字母混合碼白筹。對輸入信息生成唯一的128位散列值(32個16進(jìn)制的數(shù)字)
加密約定
加密結(jié)果位數(shù): 加密結(jié)果位數(shù)是16位還是32位(大多數(shù)都是32位的)。
加密結(jié)果大小寫: MD5加密區(qū)分 大小寫谅摄,使用時要和后臺約定好徒河。
聲明和實現(xiàn): (NSString的類別)
// 32位 (較為常用)
- (NSString *)md5HashToLower32Bit;
- (NSString *)md5HashToUpper32Bit;
// 16位
- (NSString *)md5HashToLower16Bit;
- (NSString *)md5HashToUpper16Bit;
pragma mark - 32位 小寫
-
(NSString *)md5HashToLower32Bit {
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;
}
pragma mark - 32位 大寫
-
(NSString *)md5HashToUpper32Bit {
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;
}
pragma mark - 16位 小寫
-
(NSString *)md5HashToLower16Bit {
NSString *md5Str = [self md5HashToLower32Bit];NSString *string;
for (int i=0; i<24; i++) {
string=[md5Str substringWithRange:NSMakeRange(8, 16)];
}return string;
}
pragma mark - 16位 大寫
-
(NSString *)md5HashToUpper16Bit {
NSString *md5Str = [self md5HashToUpper32Bit];NSString *string;
for (int i=0; i<24; i++) {
string=[md5Str substringWithRange:NSMakeRange(8, 16)];
}return string;
}
加鹽: 即就是添加"佐料", 如果用戶密碼數(shù)據(jù)庫不小心被泄露, 黑客就可以通過反查詢方式獲得用戶密碼或者對于數(shù)據(jù)庫中出現(xiàn)頻率較高的hash碼(即很多人使用的)進(jìn)行暴力破解(因為它通常都是弱口令)
鹽值就是在密碼hash過程中添加的額外的隨機(jī)值, 來提高加密算法, 加Salt可以一定程度上解決這一問題。所謂加Salt方法送漠,就是加點“佐料”顽照。其基本想法是這樣的:當(dāng)用戶首次提供密碼時(通常是注冊時),由系統(tǒng)自動往這個密碼里撒一些“佐料”闽寡,然后再散列代兵。而當(dāng)用戶登錄時,系統(tǒng)為用戶提供的代碼撒上同樣的“佐料”爷狈,然后散列植影,再比較散列值,已確定密碼是否正確涎永。
這里的“佐料”被稱作“Salt值”思币,這個值是由系統(tǒng)隨機(jī)生成的鹿响,并且只有系統(tǒng)知道。這樣谷饿,即便兩個用戶使用了同一個密碼惶我,由于系統(tǒng)為它們生成的salt值不同,他們的散列值也是不同的博投。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的用戶绸贡,但這個幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。