关于数据的安全,首先要考虑数据的不易篡改性,数据的唯一性,数据的真实性,数据的可靠性:
那么各种各样的加密方式也就随着数据安全性的要求而不断出现在开发者的字典中,并且被广泛的使用,
当然,我现在从事的就是金融类的项目,对于数据的安全性的要求非常高,数据遵循的原则:"永远不要相信前端的数据,一切数据的依赖点是服务器"
项目中经常使用到的加密方式:
AES 256
MD5
自定义安全策略
下面我详细描述各种加密及其使用的方法:
一.base64
- 是网络上使用最广泛的编码系统,能够将任何二进制数据,转换成只有65个字符组成的文本文件。
- 由 a~z,A~Z,0~9,+,/,= 等65个字符组成。
- Base64 编码后的结果能够反算,不够安全。
- Base64 是所有现代加密算法的基础算法。
【Base64】的使用原理:
参照链接: http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html
-base64的编码都是按字符串长度,以每3个8bit的字符为一组,
-然后针对每组,首先获取每个字符的ASCII编码,
-然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
-然后再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
-然后将这4个8bit的字节转换成10进制,对照Base64编码表 (下表),得到对应编码后的字符。
上代码:
#pragma mark - base64
-(NSString *)base64EncodeString:(NSString*)string{
//将要进行加密的字符串转为二进制的数据
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//返回base64 加密后的结果
return [data base64EncodedStringWithOptions:0];
}
//对使用base64加密过的字符串进行解密
-(NSString*)base64DecodeString:(NSString*)string{
//将编码后的字符串转换为二进制文件
//string 已经是编码过的二进制文件,所以不再用下面的方法转二进制
// NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
//返回解码后所需的字符串
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
二.MD5
MessageDigest AlgorithmMD5(中文名为消息摘要算法第五版)是计算机安全领域广泛使用的一种散列函数(也叫Hash函数),用以提供消息的完整性保护。其核心思想是从给定的数据中提取特征码,不容产生重复。加密后的字符串通常被称为指纹或消息摘要。
大神对该加密有封装了一个分类:
NSString+Hash
特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。相同的字符串,每次MD5后的结果是固定的。都是32个字符
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
- 强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
- 不可逆性:不能逆运算。不可破解。
- 用HMac:HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
NSString*password = [self.passField.texthmacMD5StringWithKey:@"itheima"];
上面代码 md5 的过程:使用密钥 itheima 对密码加密,加密后做md5,得到32位字符串,再次使用 itheima 加密,再md5。
- HMAC现在使用的比较广泛,安全级别更高, 破解难度高。
- 但还是有风险:每次结果一致,有可能被暴力破解。
对结果进行MD5 再次使用key对md5后的结果进行加密,再次结果进行MD5
现代加密学要求:相同的密码,相同的算法,每次加密的结果不一样---因此使用时间戳加密
- (NSString *)timePassword {
// key
NSString *key = @"keinrain".md5String;
NSLog(@"key = %@",key);
// 对密码进行hmac
NSString *pwd =[self.password hmacMD5StringWithKey:key];
// 获得当前系统时间 2016-03-07 3:14
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 设置时区:真机一般都需要设置
fmt.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
// 设置时间模式
fmt.dateFormat = @"yyyy-MM-dd HH:mm";
// 获得时间字符串
NSString *timeStr = [fmt stringFromDate:[NSDate date]];
NSLog(@"timeStr = %@",timeStr);
// 密码 + 时间
pwd = [pwd stringByAppendingString:timeStr];
return [pwd hmacMD5StringWithKey:key];
}
2>使用服务器时间生成带时间戳的密码
- (NSString *)timePassword {
// key
NSString *key = @"keinrain".md5String;
NSLog(@"key = %@",key);
// 对密码进行hmac
NSString *pwd =[self.password hmacMD5StringWithKey:key];
// 获得服务器时间--> 同步请求还是异步
NSURL *url = [NSURL URLWithString:@"http://localhost/hmackey.php"];
NSData *data = [NSData dataWithContentsOfURL:url];
// 获得字典
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
// 获得时间字符串
NSString *timeStr = dict[@"key"];
NSLog(@"timeStr = %@",timeStr);
// 密码 + 时间
pwd = [pwd stringByAppendingString:timeStr];
return [pwd hmacMD5StringWithKey:key];
}
四.对称加密 DES,3DES,AES,AES 256
1、经典加密算法
- DES(Data Encryption Standard):数据加密标准(现在用的比较少,因为它的加密强度不够,能够暴力破解)
- 3DES:原理和DES几乎是一样的,只是使用3个密钥,对相同的数据执行三次加密,增强加密强度。(缺点:要维护3个密钥,大大增加了维护成本)
- AES(Advanced Encryption Standard):高级加密标准,目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。
2、加密模式
- ECB:电子密码本,就是每个块都是独立加密的。(ECB加密模式.png)
- CBC:密码块链,使用一个密钥和一个初始化向量(IV)对数据执行加密转换。(CBC加密模式.png)
只要是对称加密都有 ECB和 CBC模式,加密模式是加密过程对独立数据块的处理。对于较长的明文进行加密需要进行分块加密,在实际开发中,推荐使用CBC的,ECB的要少用。
>>>>>>>>>>
加密过程先加密,再 base64编码。
解密过程是先 base64,再解密。
其中 | 在命令里面叫做管道。作用是将前一个命令的结果当作参数传递给后一个命令
- 钥匙串访问,使用 AES 256加密算法,能够保证用户密码的安全。
- 钥匙串访问SDK,是苹果ios7.0.3 版本以后发布的
- 钥匙串访问的接口是纯C语言的,但是,网络上有个哥们把它封装成 OC的,使用相当简单!
- 钥匙串访问的第三方框架,是对C框架的封装,可以不用看源代码
- 非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。
- 非对称加密算法需要两个密钥:公开密钥(publickey) 和 私有密钥(privatekey)
- 公开密钥和私有密钥是一对
- 如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。
- 如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。