iOS在安全方面所采用的的加密方式:MD5、BASE64、(AES)对称加密、非对称加密、DES(keychain中使用)
1.MD5
使用场景:
(1)登陆、注册密码需要MD5加密下(防止直接看到明文)
(2)在http请求时候header需要(防止被篡改)
//MD5是不可逆的只有加密没有解密
NSTimeIntervaltimeInterval=[[NSDate date] timeIntervalSince1970]*1000;
NSString*timeStamp=[NSString stringWithFormat:@"%.f",floor(timeInterval)];
// MD5加密 单纯的MD5加密不安全 需要加盐,加盐就是在要加密的内容后加一些常量,常量越长越安全
//盐值
NSString*safeKey=safekey;//安全码
NSString*signStr=[NSString stringWithFormat:@"timestamp=%@&safekey=%@",timeStamp,safeKey];
NSString*auth=[[Utils md5HexDigest:signStr ] lowercaseString];
[manager.requestSerializersetValue:auth forHTTPHeaderField:@"crpdb_auth"];
[manager.requestSerializersetValue:timeStamp forHTTPHeaderField:@"timestamp"];
原理简介:MD5算法原理
2.BASE64(只支持加密英文)
base64编码是可逆的,它是一种编码格式不是加密方式。
#import "NSString+Base64.h"
@implementation NSString (Base64)
- (NSString *)base64EncodedString;
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}
- (NSString *)base64DecodedString
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:self options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
@end
NSString *codeString = @"Hello world";
NSLog(@"原文--%@",codeString);
NSString *base64Str = [codeString base64EncodedString];
NSLog(@"Base64编码--%@",base64Str);
NSString *decodeStr = [base64Str base64DecodedString];
NSLog(@"Base64解码--%@",decodeStr);
3.AES加密(对称加密)
原理:
AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。
加密代码
NSString *password = @"password";//一般来说用户名就是用户密码的Key
NSString *passwordKey = @"userName";
NSString *encryptedData = [AESCrypt encrypt:password password:passwordKey];//加密
NSString *messagepassword = [AESCrypt decrypt:encryptedData password:passwordKey]; //解密
NSLog(@"加密结果 = %@",encryptedData);
NSLog(@"解密结果 = %@",messagepassword);
加密实例代码
-(void)saveUserNameAndPwd:(NSString *)userName andPwd:(NSString *)pwd
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
[settings removeObjectForKey:@"UserName"];
[settings removeObjectForKey:@"Password"];
[settings setObject:userName forKey:@"UserName"];
pwd = [AESCrypt encrypt:pwd password:@"pwd"];
[settings setObject:pwd forKey:@"Password"];
[settings synchronize];
}
-(NSString *)getPwd
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSString * temp = [settings objectForKey:@"Password"];
return [AESCrypt decrypt:temp password:@"pwd"];
}
4.DES(对称加密)
DES(数据加密标准)原理
DES是一个分组加密算法,它以64位为分组对数据加密。64位一组的明文从算法的一端输入,64位的密文从另一段输出。它是一个对称算法:加密和解密用的是同一个算法。
密钥通常表示为64位的数,但每个第8位都用作奇偶校验,可以忽略,所以密钥长度为56位。密钥可以是任意的56位的数,且可在任意的时候改变。
DES算法只不过是加密的两个基本技术——混乱和扩散的组合,即先代替后置换,它基于密钥作用于明文,这是一轮(round),DES在明文分组上实施16轮相同的组合技术。
用于keychain本地存储钥匙串
加密、解密代码
pod 'SSKeychain'
NSString *bundleID = [NSBundle mainBundle].bundleIdentifier;
[SSKeychain setPassword:@"111" forService:bundleID account:@"ni"];
[SSKeychain setPassword:@"222" forService:bundleID account:@"wo"];
[SSKeychain setPassword:@"333" forService:bundleID account:@"ta"];
NSString *passwords = [SSKeychain passwordForService:bundleID account:@"wo"];
NSLog(passwords);
总结:对称加密分为 AES和DES,AES高级加密标准,DES数据加密标准。
一般使用都是将用户名和密码存储到本地。用于本地用户存储化。
对称加密就是需要一个公钥,拿着公钥去加密,并且拿着公钥去解密。带来问题是:一旦公钥被获取,就会被解密。
5.非对称加密
原理简介
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。
以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进行解码了。以上就是RSA算法的工作流程。
简单说 甲利用公钥加密 乙利用随机key作为私钥
公钥是通过私钥生成,并且公钥几乎不能解析成私钥,公钥可以通过网络传输给甲,不用担心公钥被劫持。公钥是用来加密的。
私钥保存在服务器,可以使用私钥解密被公钥加密后的数据。
参考网站1
参考网站2
使用地方
支付宝RSA签名
iOS中使用RSA加密
http://www.jianshu.com/p/74a796ec5038
总结:
可能会有人在不理解Base64编码的情况下,将其误用于数据加密或数据校验。
Base64是一种数据编码方式,目的是让数据符合传输协议的要求。标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。
对于数据加密应该使用专门的目前还没有有效方式快速破解的加密算法。比如:对称加密算法AES-128-CBC,对称加密需要密钥,只要密钥没有泄露,通常难以破解;也可以使用非对称加密算法,如 RSA,利用极大整数因数分解的计算量极大这一特点,使得使用公钥加密的数据,只有使用私钥才能快速解密。
对于数据校验,也应该使用专门的消息认证码生成算法,如 HMAC - 一种使用单向散列函数构造消息认证码的方法,其过程是不可逆的、唯一确定的,并且使用密钥来生成认证码,其目的是防止数据在传输过程中被篡改或伪造。将原始数据与认证码一起传输,数据接收端将原始数据使用相同密钥和相同算法再次生成认证码,与原有认证码进行比对,校验数据的合法性。
可以看出MD5作用主要是用户数据校验;对称加密和非对称加密用于数据加密;base64是数据的编码方式。
以下是查看的链接
链接:http://www.jianshu.com/p/b8a5e1c770f9
http://www.jianshu.com/p/b12e88231367
http://www.jianshu.com/p/74a796ec5038