iOS 数据加密的<概念>和<用法>速成

加密解密

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加密算法。
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;

还需要在Xcode中配置一下,打开开关就行

非对称算法

  • 算法公开,可逆的加密算法
    • 用公钥加密,私钥解密
    • 用私钥加密,用公钥解密
    • 速度慢,适合小数据加密

RSA

  • 普遍的加密
    • 密钥的安全要求很高的话,可以先用RSA加密AES的密钥
RSA原理

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];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容