HASH
现在在处理App的用户敏感信息方面,大部分都是采用HASH加密的方式来进行处理。
1、HASH的概念
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2、HASH的特点
• 算法是公开的
• 对相同数据运算,得到的结果是一样的
• 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)。
• 没法进行逆运算
• 信息摘要,信息“指纹”,是用来做数据识别的。
3、HASH的用途
• 用户密码的加密
• 搜索引擎
• 版权
• 数字签名
密码加密处理
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
* 使用一个密钥加密,并且做两次散列!
* 在实际开发中,密钥(KEY)来自于服务器(动态的)!
* 一个账号,对应一个KEY,而且还可以跟新!
*/
NSString*serverKey =@"chh";
pwd = [pwd hmacMD5StringWithKey:serverKey];
4、HMAC方式优化
/** HMAC优化
* 由于直接一直使用HMAC的话,容易被逆向获取HMAC,
* 所以考虑在传输HMAC的前向服务器请求时间戳(忽略秒),
* 然后在HMAC基础上加上服务器的时间戳并进行md5加密后进行传输
* 服务器存储的是HMAC(密码+KEY)的值和KEY,key用于返给客户端,校验的时候只需拿HMAC这个值再加上时间戳进行MD5进行比较
*/
pwd = [[pwd hmacMD5StringWithKey:serverKey] stringByAppendingString:@"服务器时间戳"].md5String;
数字签名
数字签名本质上是通过HASH算法和RSA加密来实现的。
HASH算法专门用来做文件数据的识别.那么在网络数据传递的过程中,我们可以将明文数据,和数据的HASH值一起传递给对方.对方可以拿出HASH值来进行验证。
但是在这个过程中,如何做到数据的保护呢?明文数据和HASH值如果直接传递就有都被篡改的风险.所以这里我们要对数据进行加密。明文数据有时会比较大,不适合使用RSA非对称加密算法,那么数据的HASH值是比较小的。这个数据是用于校验的,它完全可以使用RSA来加密。所以在数据传递的时候,我们将明文数据加上通过RSA加密的校验数据一并传递给对方。那么这个通过RSA加密的校验数据,我们称之为签名.
验证数字签名
当对方拿到数据之后,如何进行验证呢?
首先传递数据时会将原始的数据和数字签名一起发送
对方拿到数据后,先进行校验,拿到原始数据,通过同样的HASH算法得到数据的HASH值。
然后通过非对称加密,将数字签名中的校验HASH值解密出来。
最后对比两个HASH值是否一致,这样可以很好的判断数据是否被篡改。