加密解密
base64编码
是网络上使用最广泛的编码系统,能够将任何二进制数据,转换成只有 65 个字符组成的文本文件
az,AZ,0~9,+,/,=
Base 64 编码后的结果能够反算,不够安全
Base 64 是所有现代加密算法的基础算法
base64只能算
伪加密
,因为base64的码表是公开的.如果自己创建私有
码表
就可以实现加密的效果.base64编码 "加密"
//加密到base64
- (NSString *)encodeBase64String:(NSString *)UTF8String{
//将普通字符串转换成Data
NSData *data = [UTF8String dataUsingEncoding:NSUTF8StringEncoding];
//将普通Data编码成base64string
return [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
- 从base64编码解码
//将base64转换成普通字符串
- (NSString *)decodeBase64String:(NSString *)base64String
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:base64String options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
对称算法
- 加密解密都使用相同的密钥
- 速度快,适合大数据加密
- AES
- AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。
- DES,3DES.(重点)Keychain中保存密码就是用过3DES加密
- 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。
钥匙串Keychain
网络数据就不用说了,任何节点都可能截取请求.所以网络数据一定要加密
不过即使存储在本地沙盒的敏感信息也一定要加密,防止手机越狱后可以访问到程序的沙盒从而泄密.
- SSKeychain 提供把密码添加到iOS系统的钥匙串的接口 推荐直接使用
- 内部是3DES加密 就是进行三轮DES加密.
- SSKeychain框架的使用
/**
设置密码到Keychain钥匙串
@param password 字符串形式的密码
@param serviceName 服务名称,其实是Bundle identifier
@param account 密码对应的帐号
@return 是否写入成功
*/
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
/**
获取保存的密码
@return 返回对应的密码
*/
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
/**
删除对应的密码
@return 是否删除成功
*/
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
非对称算法
- 算法公开,可逆的加密算法
- 用公钥加密,私钥解密
- 用私钥加密,用公钥解密
- 速度慢,适合小数据加密
RSA
- 普遍的加密
- 密钥的安全要求很高的话,可以先用RSA加密AES的密钥
HTTPS基本原理
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
说人话就是找SSL服务器,通过几次握手,验证彼此的证书,确定传输的密钥.然后根据记录协议进行安全的传输. 证书由第三方发布,第三方进行验证.
- 服务器找CA申请证书
- 证书中有
公钥
,私钥
,认证信息
- 证书中有
-
客户端
链接服务器,告诉服务器自己支持的加密算法
,摘要算法
,和SSL版本号
. 同时发送一个随机数用于产生密钥. -
服务器
选择要使用的加密算法,并将自己的证书中的认证信息
,公钥
回传给客户端. -
客户端
通过CA服务器验证
证书.如果服务器要求验证客户端证书,就把自己的证书发给服务器. -
服务器
根据前面提供的随机数计算出用于数据加密的共享密钥
-
客户端
将所有握手消息的 MAC 值发送给服务器端,服务器端也将所有握手消息的 MAC 值发送给客户端。这么做是为了防止攻击者在握手过程中篡改了消息内容。
客户端和服务器端使用握手过程中产生的加密密钥交换握手结束消息。握手结束,SSL 连接建立。
在 SSL 连接建立后,将开始遵循记录协议对数据进行传输。
散列算法
不可逆加密:MD5,SHA1,SHA256,SHA512
MD5Hash算法的特点:
1:输入任意长度的信息,经过摘要处理,输出为128位的信息.。(数字指纹)
2:不同输入产生不同的结果,(唯一性)
3:根据128位的输出结果不可能反推出输入的信息(不可逆)
- MD5 摘要算法
- 在加密的时候就已经丢失了原来的信息,所以没办法还原回去.
- MD5以后只有128位二进制数据,表现为长度32的16进制字符串.
- MD5对密码加密,工具类.
- MD5在线破解
- 暴力破解,字典破解.将明文密文存为字典,查询.
- 防止破解:就算将密码以MD5形式存储,也可能出现暴力破解,撞库等泄密,所以要提高存储安全性
-
加盐
:原密码加一个复杂的字符串,防止用户输入的密码过于简单.但不太安全,计算机性能越来越强大,迟早被破解.
-
HMAC(朋友们,重!!点!! 敲黑板)
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个
消息摘要
作为输出。
既然是摘要,你应该就懂了.和MD5一样.不过它的安全系数更高,就算碰撞出来也不可能知道你原来的消息是什么.
HMAC+时间 实际运用于登录场景
原密码加
KEY
进行HMAC
计算,结果再加上Time
后再加KEY
进行HMAC
计算. 使破解有一个时效性
- HMAC+时间,每分钟生成的值不一样.具体步骤
- 将
KEY
(第一次链接随机生成的字符串)用MD5
计算得到md5Key
-
数据
和之前md5Key
的进行HMAC
计算 - 从服务器获取
当前时间
到分钟的字符串 - HMAC值+时间 和
KEY
的MD5值进行HMAC计算传递给服务器.- 考虑到网络延迟,服务器一般会对接收到最终HMAC的时间和前一分钟做两次计算,符合其中一次即可.
- 额外好处:防止监守自盗.公司内部存储数据也不要使用明文数据,而是加密后的结果.避免出现CSDN的泄密事件
- 将
具体代码步骤!
//将传入的密码以HMAC形式加密
- (void)hamcString:(NSString *)password complete:(void(^)(NSString * secureStr))block
{
//这是第一次链接时确定的KEY
NSString *KEY = @"keykey";
//将KEY做MD5处理 使用自定义分类
NSString *md5Key = [KEY md5String];
//将明文和md5Key进行HMAC计算
NSString *hmacStr = [password hmacMD5StringWithKey:md5Key];
//获取服务器时间信息.
//创建服务器URL
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/php/hmackey.php"];
//开启异步任务,访问服务器获取时间
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//根据服务器返回的数据类型,反序列化.这里返回的JSON
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSString *time = dic[@"key"];
//获取到时间后,进行拼接然后再进行HMAC. 得到最后加密完成的字符串进行传输
NSString * secureStr =[[hmacStr stringByAppendingString:time] hmacMD5StringWithKey:md5Key];
//因为是网络异步耗时任务,所以通过block回调来返回给主线程. 这里先进入主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (block) {
//回调block block中只需要将生成的字符串交给服务器作为密码进行验证就行了.
//顺便说一下,登录等敏感信息通常采用POST方式访问
block(secureStr);
}
}];
}] resume];
}