最早的密码学:
密码本加密
持续到了上世纪的70年代
RSA加密
只能通过因式分解的方式来破解,破解难度巨大
rsa加密之后衍生出了很多加密算法,如:
- 哈希(散列)函数
1. MD5
2. SHA1
3. SHA256/512 - 对称加密算法
1. DES
2. 3DES
3. AES(高级密码标准,ios内部使用)
散列函数:
特点:
- 算法公开
- 对相同的数据加密,得到的结果是一样的
- 对不同的数据加密,得到的结果是定长的.32位字符(a-z,0-9)
- 信息摘要(信息“指纹”),是用来做识别的
- 不能反算
用途:
- 密码
- 搜索引擎的算法
- 版权
破解:
- 目前破解的散列只有MD5, SHA1 也在破解的边缘
- 散列碰撞,不同的数据,使用MD5之后能够得到相同的散列结果!
由于32位字符能表达的数据个数是有限的,而被散列的数据个数可以是无限的
MD5的实现
- (NSString *)md5String {
const char *str = self.UTF8String;
unsigned char buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), buffer);
NSMutableString * ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
/**
X 表示以十六进制形式输入/输出
02 表示不足两位,前面补0输出;出过两位不影响
printf("%02X", 0x123); 打印出:123
printf("%02X", 0x1); 打印出:01
*/
[ret appendFormat:@"%02X",buffer[i]];
}
return ret;
}
由于使用MD5已经不是很安全了,为了保证MD5的基本安全:
- 加盐(但是“盐”是固定的,如果“盐”泄露了就不安全了,而“盐”无法更改)
- HMAC,目前一两年在国内开始增多
给定一个秘钥,对明文进行加密,并且做了“两次散列”
服务器将保存用户的账号以及账号对应的秘钥
- (NSString *)hmac_md5String:(NSString *)key {
return [self.md5String stringByAppendingString:key].md5String;
}
hmac 登录思路:
- 用户登录
- 本地查找秘钥,若找不到,则像服务器发送账号,获取秘钥
设备锁思路:
当新设备登录时,在本地查找不到对应账号的秘钥,就会想服务器发送秘钥请求,此时服务器就向原先的设备发解锁请求,如果请求通过了,则向新设备发送秘钥,新设备保存至本地。
hmac+时间
客户端: (pwd.hmac+当前时间).md5
服务端:(加密后的密码+当前时间).md5 || (加密后的密码+当前时间前一分钟).md5
本地保存
- 记住密码,加密保存,反向解密。
钥匙串访问:
钥匙串加密使用AES加密,可以将保存的密码以明文的方式反算给你
pod 'SAMKeychain'
需要先开启钥匙串访问
网友评论