一、非对称加密

  - RSA :

    + 公钥加密,私钥解密;

    + 私钥加密,公钥解密;

    + 只能通过因式分解来破解

二、对称加密

  - DES

  - 3DES

  - AES (高级密码标准,美国国家安全局使用,iOS操作系统内部使用,目前还没有发现过被破解的案例)

三、哈希散列函数 (摘要算法)

  1、常见算法  

    - MD5

    - SHA1

    - SHA256/512

  2、散列函数特点

    - 算法是公开的

    - 对相同的数据加密,得到的结果是一样的

    - 对不同的数据加密,得到的结果是一样长的32位字符 由a-Z 0-9 组成

    - 信息摘要,信息指纹,是用来做识别的,不能反算

  

四、iOS开发两条原则

1、不允许在网络上传递明文的用户隐私信息

  解决方案:

  * 各种加密算法(MD5  AES..........),但是有些算法并不安全,像MD5算法在网上随便找个网站都可以轻松的反加密破解掉 ,以下提供两种安全策略:

    - 加盐

      + 所谓的“盐”,其实可以理解为一串又臭又长的字符串,例如:UYGUYF&**%&**^*(&%&%&^TUGUYRFG^&R^&F^%^R$%ERFV^&VB&^R%^V

      + 客户端用用户的原始密码拼接盐再MD5得到的一串32位字符串发给服务端,服务端也用相同的算法得到字符串来对比结果

      + 盐要足够长,无规则,这样才不容易被破解,盐一般都是写死在本地,对于移动开发来说 只有iOS  安卓  服务器 三个人知道

      + 隐患一: 其实加盐已经算比较安全了,但是假如某天安卓的那哥们嫌自己的工资太低,找老板想要涨工资,老板没批,安卓那哥们直接辞职,并把加密算法和盐通通公布出去,那么GG

      + 隐患二: 换“盐”很麻烦(除非强制升级),所以一旦盐被泄漏了,对公司来说是灾难性的打击!这种角度来说加盐并不安全。

    - HMAC

      + 客户端发出登录请求,服务器返回一个随机值KEY(这里的KEY就是秘钥,也就是说每个账号的KEY都不一样),客户端和服务器均保存这个随机值KEY至本地 

      + 客户端将该随机值KEY和用户的密码进行 hmac 运算,递交给服务器,服务器保存这个值( (KEY+密码)HMAC  ),至此,注册已完成

      + 登录:获取本地的密钥 KEY,(KEY+密码)HMAC发送至服务器,服务器取出保存的值判断密码是否匹配

      + 好处:登录的过程中,黑客截获了我们发送的数据,他也只能得到 hmac 加密过后的结果,拿不到KEY,反加密不出密码,就算是拿到了KEY,也只能破解这一个用户的密码,甚至连服务器也不知道真正的密码,从而保证了安全性

      + 场景:QQ的设备锁,换了设备之后本地拿不到KEY,只能去服务器申请授权,授权成功之后,服务器返回KEY   

      + 隐患:黑客如果知道账号,又截取了密码密文,就能模仿用户登陆,获取权限,所以也不是绝对安全的     

    - HMAC 高端玩法

      + 登录:获取本地的密钥 KEY,(KEY+密码)HMAC+“时间戳精确到分” ,例如:(KEY+密码)HMAC+“201808031543”   发送至服务器

      + 服务器判断,取出保存的值(KEY+密码)HMAC,拼接“201808031544”,与客户端发来的做匹配,若不对,再用  (KEY+密码)HMAC+“201808031543”做匹配

      + 好处:加密后的密文是变化的,黑客拿到密文后在两分钟之内才有效,从而保证了安全性

2、在本地不允许明文的保存用户隐私信息

  解决方案:

    - 保存密文至程序本地,反算回明文后加载进内存 (麻烦)

    - 钥匙串(iOS开发者的福音)

      + 苹果“生态圈”,从iOS7.0.3版本开始,苹果开放给开发者访问!

      + 钥匙串加密方式就是AES加密,可以将保存的密码以明文的方式反算给你

      + 钥匙串苹果原生都是c语言的接口,代码又臭又长,但有三方框架,推荐 SSkeyChain

      + 用到的参数就三个:账号----密码-----包名(Bundle identifier)

  

  以下就是SSkeyChain的所有接口,简单易用:

+ (NSArray *)allAccounts;
+ (NSArray *)accountsForService:(NSString *)serviceName;
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;

注意xcode要打开下面这个开关:

五、MD5其他用法

1、搜索

场景:在百度搜索三个关键字: “深圳” “福田” “喜年支行”

    打乱关键字顺序: “福田” “喜年支行” “深圳” 

     搜索出的结果是一样的

    原理(方案):将三个关键字转为MD5字符串后 按位相加结果一样

2、版权问题

  - 图片MD5后是一串固定的字符串,只要是原图,MD5之后都是一样的

  - 如果是复制的也一样

  - ps过的图片MD5与原图的MD5是不一样的,文件、视频同理

  - 文件的后缀名不会影响MD5的结果,后缀名只决定操作系统用什么工具打开

iOS开发——高级篇——iOS开发之网络安全密码学的更多相关文章

  1. iOS开发——高级篇——iOS中如何选择delegate、通知、KVO(以及三者的区别)

      在开发IOS应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers[B]怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信:1委托delegation2通知 ...

  2. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  3. iOS开发——高级篇——iOS 项目的目录结构

    最近闲来无事去面试一下iOS开发,让我感到吃惊的,面试官竟然问怎么分目录结构,还具体问每个子目录的文件名. 目录结构确实非常重要,面试官这么问,无疑是想窥探开发经验.清晰的目录结构,可让人一眼明白相应 ...

  4. iOS开发——高级篇——iOS 强制退出程序APP代码

    1.先po代码 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplication message:@" ...

  5. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  6. iOS开发——高级篇——iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  7. iOS开发——高级篇——iOS键盘的相关设置(UITextfield)

    一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapa ...

  8. iOS开发——高级篇——iOS 中的 NSTimer

    以前的老代码在使用 NSTimer 时出现了内存泄露 NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: 1 2 3 ...

  9. iOS开发——高级篇——iOS涂鸦画板效果实现

    一个简单的绘图应用,模仿苹果自带软件备忘录里的涂鸦功能 核心代码 #import "DrawView.h" #import "DrawPath.h" @inte ...

随机推荐

  1. JavaScript基础对象---Map

    一.创建Map对象 Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值 1.构造函数 语法:new Map([iterable])参数:         iterable  可 ...

  2. 3.3.2 使用 cut 选定字段

        cut 命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型.后一种数据类型在遇到需要从文件里剪下特定的列时,特别方便.请注意:一个制表字符在此被视为单个字符.          ...

  3. Redis 主从复制与哨兵

    Redis 可以使用从属服务器来实现读写分离提高吞吐量或在主服务器故障时接替主服务器以提高可用性. 每个 Redis 服务器实例都可以配置多个 slave 节点,slave 服务器也可以拥有次级 sl ...

  4. .NET Core使用log4Net记录日志

    1.引入Nuget包 log4net 2.添加log4Net配置文件 <?xml version="1.0" encoding="utf-8" ?> ...

  5. 大数据学习——实现多agent的串联,收集数据到HDFS中

    采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs,使用agent串联 根据需求,首先定义以下3大要素 第一台flume agent l  ...

  6. python3--shelve 模块

    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式 import shelve d = shelve.open('shelve_t ...

  7. PTA 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    原题地址 https://pta.patest.cn/pta/test/15/exam/4/question/710 5-2 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的 ...

  8. bzoj 1503[NOI 2004] 郁闷的出纳员

    题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...

  9. [转]制作一个64M的U盘启动盘(mini linux + winpe +dos toolbox)

    自己动手定制winpe+各类dos工具箱U盘启动盘+minilinux 由于一个64M老U盘,没什么用,拿来发挥余热.如果U盘够大,可以使用功能更强大的mini linux和带更多工具的winpe.这 ...

  10. 一个APP的由来

    之前在站酷.UI中国.优设等网站看过不少的APP教程.规范等一些东西.自认为有些规范讲的内容过于繁琐,对于像我这样的大多数设计师来说看着看着就懵逼了....