单向散列函数 MD5|SHA1|SHA256|SHA512等
● 消息认证码 HMAC-MD5|HMAC-SHA1
● 对称加密 DES|3DES|AES(高级加密标准)
● 非对称加密 RSA
● 数字签名
● 证书
●
● 对消息加密解密的两种处理方式
➢ 1)只需要保存一个值,保证该值的机密性,而不需要知道原文
➢ 2)除了保证机密性外还需要对该值进行解密得到消息原文
单向散列函数
性质
1)对任意长度的消息散列得到散列值是定长的
2)散列计算速度快,非常高效
3)消息不同,则散列值一定不同
4)消息相同,则散列值一定相同
5)具备单向性,无法逆推计算
如图

说明
单向散列函数也称为消息摘要函数、哈希函数或者杂凑函数。单向散列函数输出的散列值又称为消息摘要或者指纹
经典算法
MD4、MD5、SHA1、SHA256、SHA512等
MD5
MD5简单说明
MD5是由Rivest于1991年设计的单向散列函数
全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”
MD5的特点
对输入信息生成唯一的128位散列值(32个字符
明文不同,则散列值一定不同
明文相同,则散列值一定相同
根据输出值,不能得到原始的明文,即其过程不可逆
MD5的应用
加密
搜索
文件完整性验证
安全性
1)MD5解密网站:http://www.cmd5.com
2)MD5的强抗碰撞性已经被证实攻破,即对于重要数据不应该再继续使用MD5加密。
在自己的应用中如注册的流程

登录过程

MD5改进
现在的MD5已不再是绝对安全,对此,可以对MD5稍作改进,以增加解密的难度
加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5
先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
先乱序,后加密:先对明文字符串进行乱序处理,然后对得到的串进行加密
先乱序,再加盐,再MD5等
总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文
实例
- 首先在自己的项目中增加一个 NSString 的分类 增加相关的方法 如图

以下依托这个分类 来简单的实验下MD5的各种加密方式
1___MD5 - 基本的用法
分类的.h中
/**
* 计算MD5散列结果 __
*
* 终端测试命令:
* @code
* md5 -s "string"
* @endcode
*
* <p>提示:随着 MD5 碰撞生成器的出现,MD5 算法不应被用于任何软件完整性检查或代码签名的用途。<p>
*
* @return 32个字符的MD5散列字符串
*/
- (NSString *)md5String;
分类的.m中
导入 #import <CommonCrypto/CommonCrypto.h> 头文件
- (NSString *)md5String {
const char *str = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
#pragma mark -
/**
* 返回二进制 Bytes 流的字符串表示形式
*
* @param bytes 二进制 Bytes 数组
* @param length 数组长度
*
* @return 字符串表示形式
*/
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < length; i++) {
[strM appendFormat:@"%02x", bytes[i]];
}
return [strM copy];
}
导入分类的头文件#import "NSString+Hash.h" 并调用
效果

2___MD5 - 改进1加盐(Salt)
- 在需要加密的字符串后任意的拼接一个随意的字符串
// MD5 升级 加盐
// 拼接字符串 随意搞
NSString *salt = @"dewfjbskjfbskcfskvbASDLFAOWEFLASDHFOIWELSDHFALasldfhaoweflasdkhflasdhfoskvbkscs&#(*@(#@(%@(^khfksh))";
NSString *md5SaltStr = [NSString stringWithFormat:@"加盐__加密后 = %@",[[pwdStr stringByAppendingString:salt] md5String]];
结果

3___MD5 - 改进2先乱序,后加密
- 先乱序
如本次 乱序前:123456 乱序后:456123
// MD5 升级 乱序
NSInteger n = 3; // 从第几个位置开始颠倒 (从这个位置开始 前后颠倒过来 如本次 乱序前:123456 乱序后:456123)
NSString *strM1 = [pwdStr substringToIndex:n];
NSString *strM2 = [pwdStr substringFromIndex:n];
NSString *string = [strM2 stringByAppendingString:strM1];
NSString *disorderStr = [NSString stringWithFormat:@"乱序加密 = %@",[string md5String]];
效果

其他的 先加密,后乱序 先乱序,在加盐 再MD5等 道理都是一样了 这里就不演示了 自己搞搞就好了
4___MD5 - 改进3HMAC -MD5 HMAC - 散列函数
①消息的发送者和接收者有一个共享密钥
②发送者使用共享密钥对消息加密计算得到MAC值(消息认证码)
③消息接收者使用共享密钥对消息加密计算得到MAC值
④比较两个MAC值是否一致
- 在分类中增加一个 HMAC - 散列函数
经典算法
①HMAC-MD5(先用密钥加密,然后进行两次散列计算)
②HMAC-SHA1
- (NSString *)hmacMD5StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
效果
