HASH严格来说,不算加密,但是常常和加密算法配合使用。
这里需要提两个原则:
1.网络上不允许明文传递用户隐私信息;
2.本地不允许明文保存用户隐私信息;
哈希(散列)函数
大致分为三类:
--MD5
--SHA1/256/512
--HMAC
哈希(散列)函数特点:
--算法公开
--对相同数据运算,得到的结果是一样的(https://www.cmd5.com/
的解密,其实就是穷举)
--对不同的数据运算,如MD5得到的结果默认是128位,32个字符(16进制标示)
--没法逆运算
--信息摘要,信息“指纹”,是用来做数据识别的
哈希(散列)函数用途:
--用户密码的加密
--搜索引擎
--版权
--数字签名
用户密码的加密(重点)
我们创建一个Category,继承自NSString,命名为Hash;
NSString+Hash.h
NSString+Hash.m
--MD5
- (NSString *)md5String {
const char *str = self.UTF8String;
//开辟一个空间buffer
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
/**
* //最关键的函数 CC_MD5
* str 需要加密数据的指针
*
* (CC_LONG)strlen(str) 数据所指向的长度
*
* buffer 给一个空间,用于存储返回的二进制
*
*
*/
CC_MD5(str, (CC_LONG)strlen(str), buffer);
//MD5是128位的,转换成16进制
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
/**
* 返回二进制 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];
}
用法一(不推荐,不安全,因为可以反向查询):
//hash我们的密码
NSString *pwd = @"123456";
pwd = pwd.md5String;
NSLog(@"pwd = %@",pwd);
用法二,静态字符串加盐(不推荐,所以不列出来,因为静态字符串是固定的):
--HMAC
//使用一个密钥加密,并且做两次散列
//在实际开发中,密钥来自服务器(动态的)!
//HMAC算一种方案,不能理解成是一种算法;
//一个账号,对应一个KEY,而且还可以更新;
- (NSString *)hmacMD5StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
/**
* //最关键的函数 CCHmac
* str 需要加密数据的指针
*。kCCHmacAlgMD5 加密算法,枚举
* keyData key的指针
* strlen(keyData) key的长度
* buffer 给一个空间,用于存储返回的二进制
* strData 加密数据的指针
* strlen(strData) 加密数据的长度
* buffer 存储空间
*/
CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
用法一:(推荐)
NSString *pwd = @"123456";
pwd = [pwd hmacMD5StringWithKey:@"231"];
NSLog(@"pwd = %@",pwd);
搜索引擎
例子:我们要搜索,iOS 哈希 函数
搜索引擎会把每个词的HASH值获取到,我们用命令行演示
哈希值把三个词的哈希值,按位对应相加,这就是搜索引擎做的关键词搜索到同一篇文章。
版权
用过百度云的朋友都知道,自己有一些小视频,莫名其妙的被和谐,或者别人发给你的小视频,也被和谐,是人工审核的吗?上亿条数据,人工审核显然是不可能的,审核过一个视频以后,保存当前视频的哈希值,如果有其他资料和该哈希值匹配,直接和谐!
类似的匹配操作,还用于其他云平台。“秒传”等,都是哈希值的利用。
数字签名(重点)
用RSA,如果利用私钥加密,叫做“签名”。
从字面意思来讲,为什么叫签名呢?
--老外喜欢用支票,支票上面的签名,能够证明这玩意是你的,那么数字签名顾名思义,就是用于鉴别数字信息的方法。
核心思想:
1.用于验证数据的完整性,可以用HASH来验证;
2.RSA耗时,不适合加密过大的数据;
3.需要特别隐私的数据,在优先保证安全的同时,再去提高效率;利用时间换取空间;
例子:客户端将一笔支付信息,发送给服务器,客户端的操作如下:
1.将支付信息封装;
2.将封装好的数据HASH一次;
3.将HASH值,RSA加密;
4.将封装好的信息和RSA加密后的信息,同时发送给服务器;
这样,能很大概率,避免中间人串改;保护了数据的有效性;
我们将,23步骤组合一起,RSA加密后的信息,就叫做数字签名。
网友评论