Write in the first
在写项目中,数据的安全性至关重要,而仅仅用 POST 请求提交用户的隐私数据,还是不能完全解决安全问题。因此:我们经常会用到加密技术,比如说在登录的时候,我们会先把密码用MD5加密再传输给服务器 或者 直接对所有的参数进行加密再POST到服务器。
本篇文章主要从【iOS 数据安全相关】学习总结。
在「时间 & 知识 」有限内,总结的文章难免有「未全、不足 」的地方,还望各位好友指出,以提高文章质量。
目录:
- 数据安全介绍
- 常用加密算法
- 常用加密方式
- Base64编码方案
- 加密实现代码
5.1 MD5加密算法
5.2 对称加密算法AES和DES
5.3 非对称加密RSA- HTTPS基本使用
- 数据安全–加密解密效果
加密实战应用场景(持续更新)
Contents【相关介绍】
1.数据安全介绍
最基础的是我们发送网络请求时,使用
get
和post
方式发送请求。两者具体区别就不做解释了,只是引出相关安全性问题get
:将参数暴露在外,(绝对不安全–>明文请求或者傻瓜式请求)。post
:将参数放到请求体body中,(相对于get比较安全–>但是我们可以很容易用一些软件截获请求数据。比如说Charles(青花瓷)
)
Charles
(大部分app的数据来源都使用该工具来抓包,并做网络测试)数据安全的原则
- 在网络上
不允许
传输用户隐私数据的明文
,(即:App网络传输安全,指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听)。 - 在本地
不允许
保存用户隐私数据的明文
,(即:App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密)。 - App
代码安全
,(即:包括代码混淆,加密或者app加壳)。
- 在网络上
要想非常安全的传输数据,建议使用https。抓包不可以,但是中间人攻击则有可能。建议双向验证防止中间人攻击,可以参考下文篇章。
2.常用加密算法
常用加密算法 | 名称 |
---|---|
编码方案 | Base64 |
哈希(散列)函数 | MD5(消息摘要算法) |
SHA1 | |
SHA256 | |
对称加密算法 | DES |
AES | |
非对称加密算法 | RSA |
HTTPS | HTTP+SSL协议 |
3.常用加密方式
常用加密方式 |
---|
1.通过简单 BASE64编码 防止数据明文传输 |
2.对普通请求、返回数据,生成MD5校验(MD5中加入动态密钥),进行数据完整性(简单防篡改,安全性较低,优点:快速)校验 |
3.对于重要数据,使用RSA进行数字签名,起到防篡改作 |
4.对于比较敏感的数据,如用户信息(登陆、注册等),客户端发送使用RSA加密,服务器返回使用DES(AES)加密 |
5.要想非常安全的传输数据,建议使用https。抓包不可以,但是中间人攻击则有可能。建议双向验证防止中间人攻击 |
4.Base64编码方案
1.Base64简单说明
描述:Base64可以成为密码学的基石,非常重要。
特点:可以将任意的二进制数据进行Base64编码
结果:所有的数据都能被编码为并只用65个字符(A~Z a~z 0~9 + / =)就能表示的文本文件。
注意:对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。
2.Base64编码原理和处理过程
Base64编码原理 |
---|
1、将所有字符转化为ASCII码 |
2、将ASCII码转化为8位二进制 |
3、将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位 |
4、统一在6位二进制前补两个0凑足8位 |
5、将补0后的二进制转为十进制 |
6、从Base64编码表获取十进制对应的Base64编码 |
Base64处理过程 |
1、转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。 |
2、数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。 |
3、不断进行,直到全部输入数据转换完成。 |
4、如果最后剩下两个输入数据,在编码结果后加1个“=”; |
5、如果最后剩下一个输入数据,编码结果后加2个“=”; |
6、如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。 |
在这里提供几张图结合上面的处理过程,好理解。
Base64实现代码
简单方法直接拿走,调用
PS.终端执行编码和解码
4.加密实现代码
哈希(散列)函数
特点:
- 算法是公开的
- 对相同的数据加密,得到的结果是一样的”
- 对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是 32 个字符长度的字符串
- 信息摘要,信息”指纹”,是用来做数据识别的!
- 不能逆推反算(重要)
用途:
- 版权 对文件进行散列判断该文件是否是正版或原版的
- 文件完整性验证 对整个文件进行散列,比较散列值判断文件是否完整或被篡改
- 密码加密,服务器并不需要知道用户真实的密码!
- 搜索:
如:百度搜索–>老司机 皮皮虾 苍老师
或是 【苍老师 老司机 皮皮虾 】
上面两种方式搜索出来的内容是一样的- 如何判断:对搜索的每个关键字进行三列,得到三个相对应的结果,按位相加结果如果是一样的,那搜索的内容就是一样的!
- 经典加密算法:
MD5、SHA1、SHA512
MD5消息摘要算法
简单介绍:
- MD5:全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”(经MD2、MD3和MD4发展而来)
- 效果:对输入信息生成唯一的128位散列值(32个字符),即 32个16进制的数字。
特点:
- 输入两个不同的明文不会得到相同的输出值
- 根据输出值,不能得到原始的明文,即其过程不可逆(只能加密, 不能解密)
应用:
- 现在的MD5已不再是绝对安全(如:暴力破解的网站),对此,可以对MD5稍作改进,以增加解密的难度。
- 解决:加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5(先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序)
注意点:
- 开发中,一定要和后台开发人员约定好,MD5加密的位数是16位还是32位(大多数都是32位的),16位的可以通过32位的转换得到。
- MD5加密区分 大小写,使用时要和后台约定好。
- MD5公认被破解不代表其可逆,而是一段字符串加密后的密文,可以通过强大运算计算出字符串加密后的密文对应的原始字符串,但也不是绝对的被破解。
PS.暴力破解是指通过将明文和生成的密文进行配对,生成强大的数据库,在数据库中搜索,在这里就可以破解密码。破解网址 http://www.cmd5.com
提升MD5加密安全性,解决办法
- 1.先明文加盐,然后再进行MD5。即明文后拼接字符串(此时拼接的字符串要 足够长+足够咸+足够复杂),再进行MD5加密。如:
#define salt @"1342*&%&shlfhs390(*^^6R%@@KFGKF"
2.先加密+乱序
3.乱序|加盐,多次MD5加密等
- 4.使用消息认证机制HMAC:给定一个”秘钥”,对明文进行加密,并且做”两次散列”!-> 得到的结果,还是 32 个字符,相对安全(KEY是服务器传给你的,不是你写死的)。
消息认证机制(HMAC)简单说明
- 原理
- 消息的发送者和接收者有一个共享密钥
- 发送者使用共享密钥对消息加密计算得到MAC值(消息认证码)
- 消息接收者使用共享密钥对消息加密计算得到MAC值
- 比较两个MAC值是否一致
- 使用
- 客户端需要在发送的时候把(消息)+(消息·HMAC)一起发送给服务器
- 服务器接收到数据后,对拿到的消息用共享的KEY进行HMAC,比较是否一致,如果一致则信任
简单示例
对称加密算法AES和DES
- 对称加密的特点
- 加密/解密使用相同的密钥
- 加密和解密的过程是可逆的
- 经典算法
- DES 数据加密标准
- AES 高级加密标准
- 提示:
- 加密过程是先加密,再base64编码
- 解密过程是先base64解码,再解密
简单示例
非对称加密RSA
- 非对称加密的特点
- 使用 公钥 加密,使用 私钥 解密
- 使用 私钥 加密,使用 公钥 解密(私钥签名,公钥验签)
- 公钥是公开的,私钥保密
- 加密处理安全,但是性能极差
- 经典算法–>RSA
简单示例
MAC上生成公钥、私钥的方法,及使用
HTTPS基本使用
https简单说明
- HTTPS(
全称:Hyper Text Transfer Protocol over Secure Socket Layer
),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。 - 在HTTP下加入
SSL层
,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。 - HTTPS:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
- HTTPS(
注意
- HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的保护。
- HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSign、Microsoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。
- 因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,这样一般在客户端是不被信任的。
- 所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。
HTTPS和HTTP区别
- https协议需要到
ca申请证书
,一般免费证书很少,需要交费。 - http是超文本传输协议,信息是明文传输,https 则是具有安全性的
ssl加密传输协议
。 - http和https使用的是完全不同的连接方式,用的端口也不一样,
前者是80
,后者是443
。 - http的连接很简单,是无状态的;HTTPS协议是由
SSL+HTTP协议
构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- https协议需要到
实现代码
方案一:如果是自己使用NSURLSession来封装网络请求
方案二:如果使用AFN网络请求
补充ATS(全称:App Transport Security)
- iOS9中新增App Transport Security(简称ATS)特性, 让原来请求时候用到的HTTP,全部都转向TLS1.2协议进行传输。
- 这意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。
- 如果我们在iOS9下直接进行HTTP请求是会报错。系统会告诉我们不能直接使用HTTP进行请求,需要在Info.plist中控制ATS的配置。
- “NSAppTransportSecurity”是ATS配置的根节点,配置了节点表示告诉系统要走自定义的ATS设置。
- “NSAllowsAritraryLoads”节点控制是否禁用ATS特性,设置YES就是禁用ATS功能;
- 采用解决方法,修改配置信息。
【学习本文之外可以参考】
网络安全——数据的加密与签名,RSA介绍
关于Https安全性问题、双向验证防止中间人攻击问题
附上一张图:
期待
- 如果在阅读过程中遇到 error || new ideas,希望你能 messages 我,我会及时改正谢谢。
- 点击右上角的 喜欢 和 订阅Rss 按钮,可以收藏本仓库,并在 Demo 更新时收到邮件通知。