网络安全(数据安全)
相关概念
-
安全的原则
- 在网络上不允许传输用户隐私数据的明文
- 在本地不允许保存用户隐私数据的明文
-
请求方法
- 一定要使用POST请求提交用户的隐私数据
- GET请求的所有参赛都直接暴露在URL中
- 请求的URL一般会记录在服务器的访问日志中
- 服务器的访问日志是黑客攻击的重点对象之一
-
数据拦截(抓包攻击)
- 只用POST请求也不是很安全
- Charles设置代理服务器,拦截查看手机的请求数据
- 提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交
-
信息安全所面临的威胁
- 机密性(被窃听,秘密泄露)
- 完整性(篡改,信息被修改)
- 认证(伪装,伪装成通信双方)
- 不可否认(否认,事后不承认是自己发送的)
-
常用的加密算法
- MD5
- SHA
- DES
- 3DES
- RC2|RC4
- RSA
- IDEA
- DSA
- AES
加密算法的选择:按照公司的接口文档的规定去加密
Charles的使用(抓包工具)
安装好之后先打开
-
破解
- 新版本:Ignore
- 退出程序
- 替换charles.jar
- 显示包内容
- Java
- 显示包内容
- 没有试用期的时间限制了
- 配置之后才能抓包
- 打开iTools,保证手机电脑处于同一个网段上面的
- 设置,连接wifi,点击详情,http代理选择手动
- 服务器:ip地址
- 端口:8888
- 退出
- 可以进行抓包处理了 Allow
- Overview:概要信息
- URL:在线格式化JSON
- Protocol:HTTP1.1
- request:参数
- response:响应体
- Overview:概要信息
-
工作原理
- 代理服务器,在中间,发请求以及响应的时候会经由代理服务器,进行中转。
clearOthers
repeat
repeatAdvanced:测试服务器短时间内发送大量请求,服务器会不会崩掉
编码模式
密码学简单介绍
- 最早:凯撒密码 - 加密模式:位移
- 明文:ABCDEF
- 密文:BCDEFG
- 对照表 - 加密方式:密码本
- 对称加密 - 加密方式:密钥
- 原文-加密(密钥)-密文-解密(密钥)-原文
- 传输安全的问题:传输过程中密钥可能被泄露
- 非对称加密 - 历史性变革
- 原文-加密(公钥)-密文-解密(私钥)-原文
- 数字签名
- 数字证书
- 杰出人物:王小云
Base64编码
-
编码原理
- 可以将任意的二进制数据进行Base64编码
- 所有的数据都能被编码,并只用65个字符就能表示的文本文件
- 65个字符:AZ,az,0~9,+,/,=
-
编码
- cd 进入文件夹
- ls -la以列表形式展开
- base64 文件名称
- 得到65个字符组成的文本文件
- base64 文件名称 -o 123.txt将编码结果输出到123.txt文件里
- M-77(ASCII编码每8位一组)- 二进制位(每8位一组)-索引(每六位一组)-Base64编码(每六位一组)
- A : QQ==
- BC : QkM=
- 维基百科搜索详细介绍
-
解码
- base64 123.text -o 123.png -D
-
对字符串进行编码|解码
- 编码
- 先把字符串转为二进制数据datausingEncoding
- 对二进制数据进行编码,转为字符串返回[data base64EncodedStringWithOptions:0];
- 解码
- 先对字符串进行解码处理
- [ NSData allocinitWithBase64EncodedString:options:0]
- 把二进制数据转换为字符串
- [NSString alloc]initWithData:encoding:]
- 先对字符串进行解码处理
- ios7.0之后才有的base64,以前都是用框架C语言。
- 对一个字符串进行编码,得到的结果不一样,可以使用终端进行校验
- 命令行编码解码:
- echo -n "A" |base64 编码
- echo -n "QQ==" |base64 -D解码
- 编码
散列函数(掌握)
单向散列函数
-
性质
- 对任意长度的消息进行散列得到散列值是定长的
- 散列计算速度快,非常高效
- 消息不同,散列值一定不同(原文不同,密文一定不同)
- 消息相同,散列值一定相同(原文相同,密文一定相同)
- 具备单向性,无法逆推计算
-
说明
- 单向散列函数又称为消息摘要函数、哈希函数、杂凑函数
- 输出的散列值又称为消息摘要或者指纹
-
经典算法
- MD4|MD5|SHA1|SHA256|SHA512等
-
MD5
- 是由Rivest1991年设计的单向散列函数
- 消息摘要算法第五版
- 特点:
- 对输入信息生成唯一的128位散列值(32个字符)
- 明文不同,则散列值一定不同
- 明文相同,则散列值一定相同
- 根据输出值,不能得到原始的明文,其过程不可逆
- 安全性:
- MD5解密网站:http://www.cmd5.com
- MD5的强抗碰撞性已经被正式攻破,对于重要的数据不应该再继续使用MD5加密
-
MD5应用
- 搜索
- 先分别对每个关键字进行散列计算,之后把得到的所有散列值进行异或运算
- 文件完整性验证
- 原文相同则密文相同的性质
- 防止文件被篡改
- 版权
- 怎么验证一个软件是不是正版?签名
- 云盘秒传
- 先对文件进行散列计算,得到散列值,根据散列值,把服务器的数据拷贝一份给我们
- 搜索
md5加密
- 加密
- 对字符串进行md5加密
- 导入NSString+Hash分类
- [string md5String]
- 发送给服务器的数据是得到的散列值,发送的过程中,数据可能被拦截,可能轻易就被破解了,安全性很差
- 破解的实现原理:暴力破解,很大的服务器,通过各种计算,保存对应的原文密文,这个数据库很大,业界叫做彩虹表,在数据库里搜索密文,就能返回对应的明文
- 对字符串进行md5加密
- 进一步加密:进行n次MD5加密提高安全性
- string.md5String.md5String.md5String
-
加密进阶
:加盐,然后再进行MD5计算- NSString * salt
- NSString *str = [string stringByAppendingString: salt]
- [str md5String]
- 安全性高一些
- 注意:盐要足够的长,足够的复杂,盐是写死在本地的,但是并不是绝对安全,如果拦截到多组用户的多条数据,那么就不安全了,相同的地方可能就是盐。
- 加密进阶2:先乱序+MD5
- 用户的隐私数据,只有在用户输入的那一刻是明文,其他情况都是密文处理
- 截取字符串,拼接字符串
- 安全性会更高一些
- 用户的隐私数据,只有在用户输入的那一刻是明文,其他情况都是密文处理
- 加密:乱序+盐+md5
- md5是把盐写在本地,但是如果运用逆向工程,会得到盐,会让数据变得不安全
消息认证码HMac
- 加密两次
- 内部实现原理
- 先使用密钥来加密,加密之后会得到密文,然后再对密文进行一次散列计算
- key是服务器返回给我们的,不是保存在本地的。。
- [string hmacMD5StringWithKey:密钥]
对称加密
简介
-
特点
- 加密|解密使用相同的密钥
- 加密解密的过程是可逆的
- 速度非常快,效率非常高
-
存在问题:
- 客户端和服务器端进行通信,密钥放到服务器端的,密钥传输安全存在问题,密钥可能被窃取
-
对称加密
- 散列函数只能用在登录注册过程中,服务器端不需要知道密码,不需要逆推计算的
- 当服务器端需要收集用户的信息,就不能使用散列函数了,要使用对称加密
-
经典加密算法
- DES:数据加密标准
- 3DES:3个密钥(加密1->解密2->加密3)是为了兼容DES
- AES:高级加密标准
-
密码算法两种类型
- 分组加密
- 每次只能处理特定长度的一组数据的一类密码算法
- 分类
- DES
- 3DES
- AES
- 有多种分组方式
- ECB分组加密模式
- CBC分组加密模式
- 流密码
- 对数据流进行连续处理的一类算法
- 分组加密
分组加密
- ECB:电子密码本模式
-
特点:
- 相同的明文分组会被转换为相同的密文分组
- 类似于一个巨大的明文分组-密文分组对照表
-
命令行演示
- cd
- ls -la
- vim 123.txt
- 按键盘上的i
- 输入数据,按esc退出,按shift
- :wq退出
- cat
- openssl enc -des-ecb -K 616263 -nosalt -in 123.txt -out msg1.bin
- 616263就是abc
- cat
- xxd:以16进制的方式查看文件内容
-
- CBC:电子密码链条
- 加密之前明文分组会与前一组密文进行异或运算,得到密文分组
- 命令行演示
- cd
- vim 123.txt
- openssl enc -dec -cbc -K 616263 -nosalt -iv 0102030405060708 -in 123.txt -out msg1.bin
- 只有改了一个地方,后面的都不一样,相互影响
- AEC:高级数据加密标准
- 使用分类EncryptionTools
- sharedEncryptionTools单例方法
- AEC - ECB
- 加密代码 sharedEncryptionTools ]encryptString:要加密的字符串keyString:key iv:初始向量,ECB不需要向量,传nil
- 该方法使用AES算法进行对称加密,加密时候采用的加密分组模式为ECB模式,该方法会把加密之后的字符串进行Base64编码,编码之后返回
- abc = 616263
- touch 123.txt
- cat 123.txt
- echo "abc">>123.txt
- cat 123.txt
- xxd 123.txt
- echo "xiaoming" >123.txt 覆盖123.txt内容
- 注意:>覆盖>>追加
- 加密命令行
- 加密代码 sharedEncryptionTools ]encryptString:要加密的字符串keyString:key iv:初始向量,ECB不需要向量,传nil
echo -n "520it" |openssl enc -aes-128-ecb -K 616263 -nosalt |base64
- 解密代码
- decryptString:keyString:iv:
- 解密命令行
echo -n "FAUNHMGMDFMGAAFDD=="|base64 -D |openssl enc -aes-128-ecb -K 616263 -nosalt -d
- AEC - CBC
- 加密encryptString:keyString:iv:data
- 初始向量怎么传?
- uint8_t iv[8] ={1,2,3,4,5,6,7,8};
- [[NSDatata alloc] initWithBytes:iv length:sizeof(iv) ];
- 命令行
echo -n "520it" |openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 |base64
- 解密decryptString:keyString:iv:data
echo -n"密文"|base64 -D|openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 -d
- DES
- DES - ECB
- 加密
- EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;修改加密算法为DES
- sharedEncryptionTools ]encryptString:要加密的字符串keyString:key iv:初始向量,ECB不需要向量,传nil
- 命令行
echo -n "520it" |openssl enc eds-ecb -K 616263 -nosalt |base64
- 解密
- decryptString:keyString:iv:
- 命令行
echo -n "密文"|base64 -D |openssl enc -des-ecb -K 616263 -nosalt -d
非对称加密
- 特点:
- 使用公钥加密,使用私钥解密
- 公钥是公开的,私钥保密
- 加密处理安全,但是性能极差
- 经典算法
- RSA:三个人名字的缩写
- 原理
- 求N,准备p,q两个质数 ,N = p*q
- 求L,L是p-1和q-1的最小公倍数,L = 1cm(p-1,q-1)
- 求E,E和L的最大公约数为1(E和L互质)
- 求D,E*D mode L = 1
- 公钥:E N
- 私钥:D N
- 加密:明文的E次方 mod N的E次方
- 解密:密文的D次方mod N的D次方
- openSSL生成密钥命令
- 生成强度是512的RSA私钥
- 以明文的输出私钥内容
- 校验私钥文件
- 从私钥中提取公钥
- 以明文输出公钥内容
- 使用公钥加密小文件
- 使用私钥解密小文件
- 将私钥转成DER格式
- 将公钥转成DER格式
中间人攻击
- 解决:对公钥进行数字签名(数字证书)
- 签名:
- CA:权威机构,收费的支付宝
- 任何人 (自签名):没有人信任12306
- 签名:
- 证书内容
- 公钥
- 认证机构的数字签名
- 加密标准:PKCS#12:
- 描述个人信息交换语法标准,描述了将用户公钥、私钥、证书、和其他相关信息打包的语法,苹果的开发者证书就是P12标准的。
- 后台处理的
- 搜索 HTTPS证书
- 自签名:自己生成一个证书
- 生成私钥
- 创建证书请求
- 生成证书并签名,有效期10年
- 将PEM格式文件转换成DER格式
- 导出P12文件
RSA加密解密
- p.p12
- rsacert.der
- 加载公钥
- 使用分类:RSACryptor工具类
- RSACryptor sharedRSACryptor]loadPublicKey:
- 加密
- RSACryptor sharedRSACryptor]encryptData:返回二进制数据就是加密之后得到的密文
- 进行base64编码处理
- 加载私钥
- loadPrivateKey:password:
- 解密
- decryptData:
- 产生问题的根本原因:所有的数据使用HTTP传输的时候是明文的。
HTTPS
- ATS特性
- ios9之后,让原来请求时使用到的HTTP,全部都转向TLS1.2协议进行传输,这意味着所有的HTTP协议都强制使用了HTTPS协议进行传输
- 如果发送的请求时HTTPS请求,那么有两种情况
- 该请求的网站所使用的证书是CA签名的并且加密的方式满足ATS的要求,那么我们在代码中什么都不需要做
- 该请求网站所使用的证书是自签名,那么需要做如下操作:
- 禁用ATS特性
- 需要在代码中信任这个证书(安装证书)
- 2017年1月1日开始不允许使用HTTP请求,必须使用HTTPS请求(后台的事情)
- HTTPS请求
- 确定请求路径
- 创建请求对象
- 创建会话对象
- 根据会话对象发送请求
- 解析数据
- 自签名证书
- 禁用ATS特性
- 安装证书
- 设置自定义会话对象,设置代理
- 遵守NSURLSessionDataDelegate
- 实现didReceiveChanllenge:方法
- Chanllenge质询(受保护空间protectionSpace)
- 当请求是HTTPS请求的时候会调用该方法,需要在该方法中告诉系统如何处理这个证书
- NSURLAuthenticaionMethodServerTrust服务器信任
- Port 443(HTTPS) 80(HTTP)
- 告诉系统安装证书,提取内部的公钥
- completionHandler(如何处理证书,认证信息)
- HTTP通信过程
- https == http +ssl(secure socket layer安全套接字层)
- HTTPS协议中关于SSL/TLS层握手
- 阶段一:协商加密方式等参数
- 阶段二:验证证书的有效性并交换会话密钥
- 阶段三:使用会话密钥对消息进行加密处理,所有的消息在安全的信道中传输
HTTPS请求处理(AFN)
-
请求受信任的网站
- text/html
- 设置反序列化方式
- manager.responseSerializer = [AFHTTPResponseSerializer serializer]
- meta charset = utf-8 网站的编码模式
-
请求不受信任的网站
- 禁用ATS特性
- AFSecurityPolicy三个重要属性
- AFSSLPinningMode
- 枚举类型,有三个值
- None
- PublicKey
- Certificate
- 枚举类型,有三个值
- allowInvalidCertificates 默认为NO,需要设置为YES
- validatesDomainName 是否验证主机名,默认为YES需要修改为NO
- AFSSLPinningMode
- 设置反序列化方法
- AFSecurityPolicy AFSecurityPolicy - None
- 设置允许不受信任的证书YES
- 设置不验证域名NO
- manager.securityPolicy =给manager属性赋值
UIWebView
简介
- 专门用来加载网页的控件
- Safari就是用UIWebView做的,ios内置的浏览器控件
- 不但能够加载远程的网页资源,还能加载绝大部分的常见文件
- html/htm
- pdf/doc/ppt/txt
- mp4
- ...
- 常用加载资源方法
- loadRequest:
- 常用属性方法
- reload
- stopLoading
- goBack
- goForward
- ...
- 注意点:
- 内存泄露的问题,是控件本身存在的,非常耗性能的,如果用的这个控件,内存会飙升
- 解决:WKWebView
基本使用
-
加载远程网页
- 创建请求对象
- 加载请求self.webview loadRequest:
- 修改配置文件:ATS
-
注意点:
- 为什么可以实现滚动?
- ScrollView属性,可以设置滚动范围
- 为什么可以实现滚动?
-
常见方法
- 设置滚动的属性
- .contentInset
- 设置滚动的属性
-
加载本地资源(pdf/ppt/mp4等)
- 创建请求对象fileURLWithPath:
- 加载请求
-
加载的网页很难看
- 原因:没有做自适应,流水布局
- Bootstrap尝试学习一下
- 设置属性,让网页自适应
- self.webview.scalesPageToFit = YES
-
识别网页的特殊字符
- 新建一个html文件
- 设置识别特殊的字符串
- self.webview.dataDetectorTypes = UIDataDetectorTypeAll
-
代理方法
- 设置代理:self.webview.delegate = self
- 遵守代理协议UIWebViewDelegate
- 遵守代理协议
- shouldStartLoadWithRequest:即将加载某个请求
- request.URL.absoluteString
- 返回值:
- YES加载
- NO拒绝加载
- didStartLoad:开始加载网页的时候调用
- didFinishLoad:加载完成的时候调用
- didFailLoadWithError:加载失败或者出错的时候调用
- shouldStartLoadWithRequest:即将加载某个请求
案例
- viewDidLoad
- 创建请求对象
- 加载网页loadRequest:
- 设置代理self.webview.delegate=self;
- 遵守代理协议
- 实现代理方法
- webViewDidFinishLoad:
- 加载完成之后调用,在这个方法里面设置按钮是否可以点击
- self.goBack.enabled = self.webview.canGoBack;
- self.goForward.enabled = self.webview.canGoForward;
- 回退
- goBack
- 前进
- goForward
- 刷新
- reload
WKWebView
- 在控件库里暂时找不到,ios8之后推出的,给出了一个新的高性能的webview解决方案,解决UIWebView占用内存的问题
- 说明
- 7.3版本里面还没有WKWebView,只能通过代码实现
- 需要包含WebKit框架
- 主要特性
- 性能提升:将浏览器内核渲染进程提取出APP,由系统进行统一管理,减少了相当一部分性能损失
- 允许JavaScript的Nitro库加载并且使用
- 支持更多的HTML5特性
- 高达60fps的滚动刷新率
- 可以监听网页加载进度KVO
- 内置手势探测
- 代码
- 包含WebKit框架
- 创建WKWebView控件
- allocinitWithFrame:
- 创建请求对象
- 加载请求loadRequest:
- 添加控件self.view addSubview:webview
- 监听加载进度
- webview addObserver:forKeyPath:@"estimatedProgress"options:context:
- observeValueForKeyPath:ofObject:change:context:
- 代理:
- WKNavigationDelegate
- 修改ATS配置