数据安全

网络安全(数据安全)

相关概念

  • 安全的原则

    • 在网络上不允许传输用户隐私数据的明文
    • 在本地不允许保存用户隐私数据的明文
  • 请求方法

    • 一定要使用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:响应体
  • 工作原理

    • 代理服务器,在中间,发请求以及响应的时候会经由代理服务器,进行中转。
  • 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]
      • 发送给服务器的数据是得到的散列值,发送的过程中,数据可能被拦截,可能轻易就被破解了,安全性很差
      • 破解的实现原理:暴力破解,很大的服务器,通过各种计算,保存对应的原文密文,这个数据库很大,业界叫做彩虹表,在数据库里搜索密文,就能返回对应的明文
  • 进一步加密:进行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内容
      • 注意:>覆盖>>追加
    • 加密命令行
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
    • 设置反序列化方法
    • 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:加载失败或者出错的时候调用

案例

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

推荐阅读更多精彩内容