美文网首页
数据安全

数据安全

作者: 彼岸的黑色曼陀罗 | 来源:发表于2016-10-13 21:31 被阅读0次

    网络安全(数据安全)

    相关概念

    • 安全的原则

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

      • 一定要使用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配置

    相关文章

      网友评论

          本文标题:数据安全

          本文链接:https://www.haomeiwen.com/subject/guqgyttx.html