【资料整理】
iOS 中的网络加密
公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使用我这套工具类进行处理:文章地址
但是不论在任何时候,都应该将服务置于HTTPS上,因为它可以避免中间人攻击的问题,还自带了基于非对称密钥的加密通道!使用HTTPS后,可以省去各种加解密技术。
介绍下HTTPS交互原理
简答说,HTTPS 就是 HTTP协议加了一层SSL协议的加密处理,SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA(如GlobalSign,wosign),在验证服务器身份后颁发,这是需要花钱滴,签发后的证书作为公钥一般放在服务器的根目录下,便于客户端请求返回给客户端,私钥在服务器的内部中心保存,用于解密公钥。
HTTPS 客户端与服务器交互过程:
1、客户端发送请求,服务器返回公钥给客户端;
2、客户端生成对称加密秘钥,用公钥对其进行加密后,返回给服务器;
3、服务器收到后,利用私钥解开得到对称加密秘钥,保存;
4、之后的交互都使用对称加密后的数据进行交互。
参考资料:https://www.cnblogs.com/fengmin/p/8178217.html(包含AFN对不信任证书的相关处理)
1 前言:
在提交用户的隐私数据,例如:登录密码、银行账号等,不能用明文进行传输,很容易被截获。
1. get请求的所有参数都直接暴露在URL中,可直接看到
2. post请求可以利用软件(如Charles)拦截查看手机的请求数据,使用教程参考Charles抓包
因此:在提交用户的隐私数据时,一定不要明文提交,要先加密处理后再进行提交。
2 常见加密算法
常用加密算法 名称
编码方式 Base64 Base58
哈希(散列)函数 MD5(消息摘要算法) SHA1 SHA256 SHA512
对称加密算法 DES AES
非对称加密算法 RSA(公钥、私钥) ECC
对称加密可分为:
流加密 对信息流中每一个元素加密,如12345678, 先对1加密,在对2加密
块加密 先对信息分块。然后对块加密,如12345678,先1234成块,5678成块,然后对块加密。
2.1 Base64/Base58编码
不是加密算法。只是一种编码方式。通过简单 BASE64编码 防止数据明文传输
Base64是有64个字符组成,大写A-Z 、小写a-z,数字0-9,两个字符 + 和 =
Base58中没有字母o,没有数字0,没有大小写字母I i,也没有字符 + =.(一般用在比特币里面的一种编码方式)
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是三个字节为一组,如果位数不够时,会使用“=”进行补齐,对文件进行base64编码后文件数据的变化:编码后的数据约等于编码前数据的4/3,会大1/3左右。
2.2 哈希(散列)函数
哈希(散列)函数
特点:
算法是公开的
对相同的数据加密,得到的结果是一样的"
对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是 32 个字符长度的字符串
信息摘要,信息"指纹",是用来做数据识别的!
不能逆推反算(重要)
用途:
版权 对文件进行散列判断该文件是否是正版或原版的
文件完整性验证 对整个文件进行散列,比较散列值判断文件是否完整或被篡改
密码加密,服务器并不需要知道用户真实的密码!
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是服务器传给你的,不是你写死的)。
4.1 消息认证机制(HMAC)原理
消息的发送者和接收者有一个共享密钥,发送者使用共享密钥对消息加密计算得到MAC值(消息认证码)。
消息接收者使用共享密钥对消息加密计算得到MAC值,比较两个MAC值是否一致。
4.2 使用:客户端需要在发送的时候把(消息)+(消息·HMAC)一起发送给服务器;服务器接收到数据后,对拿到的消息用共享的KEY进行HMAC,比较是否一致,如果一致则信任。
2.3对称加密算法AES和DES
采用单钥密码系统加密方式。同一个密钥可以同时用作信息的加密和解密。
对称加密的特点
1. 加密速度快,可加密大文件
2. 密文可逆,加密和解密的过程是可逆的,一旦密钥泄露,就会导致暴露
3. 加密后编码找不到对应字符,会出现乱码,一般结合base64
经典算法
DES 数据加密标准
AES 高级加密标准(基于DES)
提示:加密过程是先加密,再base64编码; 解密过程是先base64解码,再解密 (base64是为了可读性,不然会出现乱码)
2.4 非对称加密RSA
·非对称加密的特点
使用 公钥 加密,使用 私钥 解密
使用 私钥 加密,使用 公钥 解密(私钥签名,公钥验签)
公钥是公开的,私钥保密
加密处理安全,但是性能极差
·经典算法-->RSA
# MAC上生成公钥、私钥的方法
1.打开终端,切换到自己想输出的文件夹下
2.输入指令:openssl(openssl是生成各种秘钥的工具,mac已经嵌入)
3.输入指令:genrsa -out rsa_private_key.pem 1024 (生成私钥,java端使用的)
4.输入指令:rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout (生成公钥)
5.输入指令:pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt(私钥转格式,在ios端使用私钥解密时用这个私钥)
注意:在MAC上生成三个.pem格式的文件,一个公钥,两个私钥,都可以在终端通过指令vim xxx.pem 打开,里面是字符串,第三步生成的私钥是java端用来解密数据的,第五步转换格式的私钥iOS端可以用来调试公钥、私钥解密(因为私钥不留在客户端)
iOS端公钥加密私钥解密、java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不能私钥加密公钥解密,只能用于验签
参考资料:
App安全https://www.cnblogs.com/fengmin/p/8178217.html
iOS加密详解https://www.jianshu.com/p/cee228aabdbc