近期接到一个新需求:APP企业版需要接入热更新功能。

热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击。

需要用到数据加密传输方面的知识,以下是我设计的加密解密流程:

  0. 将脚本 base64 编码,得到编码后的文本 encodedScript;

  1. 将 encodedScript 使用 AES 算法 加密,得到密文 cipherScript;

  2. 用 RSA 的私钥将 AES 的密钥加密,得到 cipherKey;

  3. 将 cipherKey 和 cipherText 下发到 app 端;

  4. 在 app 端用公钥 decrypt cipher Key 得到 AES 密钥的明文;

  5. 用 AES 密钥 decrypt cipherScript 得到编码后的脚本encodedScript;

  6. base64 解码得到脚本明文;

  7. 加载运行补丁;

至此,整个脚本的安全下发流程完毕!

整个加密流程涉及到:

  1. base64编码
  2. 对称加密算法 AES
  3. 非对称加密算法 RSA

接下来依次介绍

1. base64编码

Base64,就是说选出64个字符-小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符,具体原理见base64

为什么要先用base64将原文本编码呢? 根本原因在于:系统间的字符集存在差异,传输过程中,另一个系统可能无法正确表达或者解析其他系统中的字符,因此用所有系统都能正确表示、解析的64个基本字符,将要穿输的内容进行编码,然后再穿输完毕后进行解码得到原内容。

2. 对称加密算法 AES

这里先解释一下什么是 对称加密算法 和 非对称加密算法:

  • 对称加密算法:加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
  • 非对称加密算法:加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。

在这里是通过 RSA 加密 AES 的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。

AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

关于AES 的原理,感兴趣的可以点击这里AES 趣解

AES 需要注意的地方:

  1. 密钥长度可以是16、24、32个字符(分别对应 128、192、256位),注意!这里只能用一个字节就能表示的字符,因为AES是基于字节byte和位bit进行加密的,AES对密钥长度是固定的。
  2. 初始向量 initialization vector,发送端、接收端要保持一致。
  3. 填充模式,iOS用的是 kCCOptionPKCS7Padding 填充模式,PKCS5Padding 是 PKCS7Padding 的一个子集,注意区分。
  4. 加密模式, iOS默认的是CBC模式,如果需要其他加密方式如ECB,在kCCOptionPKCS7Padding这个参数后边加上kCCOptionECBMode,即kCCOptionPKCS7Padding | kCCOptionECBMode,但是记得修改上边的偏移量,因为只有CBC模式有偏移量。

3.非对称加密算法RSA

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

RSA 需要注意的点:

  1. 明文长度不能超过 密钥长度,如果密钥长度128字节的话,去掉padding的长度11字节,明文不能超过117字节
  2. 密文长度最大为 密钥长度-1.

如果明文长度超过密钥长度,可以将明文定厂分割,加密后拼接,然后解密拼接。

RSA 加密算法在OpenSSL 中有集成实现,链接 ,sdk 

iOS 数据安全、数据加密传输的更多相关文章

  1. Android 和 PHP 之间进行数据加密传输

    Android 和 PHP 之间进行数据加密传输 [代码] [Java]代码 1 mcrypt = new MCrypt(); 2 /* Encrypt */ 3 String encrypted = ...

  2. 一步步改造wcf,数据加密传输-匿名客户端加密传输

    一步步改造wcf,数据加密传输-匿名客户端加密传输 百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传 ...

  3. IOS关于数据加密(主要为登录加密)想总结的

    首先上来就来说一下,IOS常见的几种加密算法  *哈希(散列)函数 : MD5.SHA  *对称加密算法:DES.3DES.AES  *非对称加密算法:RSA 一.哈希(散列)函数  1.MD5 MD ...

  4. iOS——数据安全

    在移动互联网快速发展的今天,iOS应用直接运行在用户的手机上,与运行在服务器后台服务相比,更有可能被黑客攻击. a.网络安全: 1.1 安全地传输用户密码 事先生成一对用于加密的公私钥,客户端登录的时 ...

  5. 密码学——网间数据加密传输全流程(SSL加密原理)

    0.导言 昨天写了一篇关于<秘钥与公钥>的文章,写的比较简单好理解,有点儿像过家家,如果详细探究起来会有不少出入,今天就来详细的说明一下数据加密的原理和过程.这个原理就是大名鼎鼎SSL的加 ...

  6. TCP/IP数据加密传输及CA简述

    TCP/IP跨主机之间的通信数据封装发送的都是明文数据,现代通讯中会有安全问题. 三个安全问题 如:A发送消息给B的三个安全问题机密性:明文传输如:ftp,http,smtp,telnet等完整性:数 ...

  7. ios NSURLSession后台传输

    http://www.appcoda.com/background-transfer-service-ios7/ http://www.raywenderlich.com/51127/nsurlses ...

  8. RSA与AES实现数据加密传输

    RSA.AES简介 RSA:非对称加密,需要提前生成两个密钥(一对的),通过其中一个密钥加密后的数据,只有另一个密钥能解密.通常这两个密钥中有一个会暴漏出来,即对外公开的,这个密钥称为“公钥”,反之另 ...

  9. java servlet手机app访问接口(一)数据加密传输验证

    前面几篇关于servlet的随笔,算是拉通了 servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送---> ...

随机推荐

  1. [转]运用@media实现网页自适应中的几个关键分辨率

    转自百度经验:http://jingyan.baidu.com/article/6f2f55a1ab36c3b5b83e6c46.html 经常为不同分辨率设备或不同窗口大小下布局错位而头疼,可以利用 ...

  2. vlan配置命令

    # 为VLAN10 指定一个描述字符串“connect to LAB1”.<Sysname> system-viewSystem View: return to User View wit ...

  3. Java中int与Integer的区别

    转自https://www.cnblogs.com/guodongdidi/p/6953217.html import java.lang.Integer; public class intDemo{ ...

  4. 如何在Ubuntu上安装gcc-6.3

    装显卡驱动推荐 gcc 6.3 版本,其实linux上多个版本的gcc是可以共存的,需要的的时候切换就好,参加之前的博客 https://www.cnblogs.com/jins-note/p/951 ...

  5. HTML5新增的标签和属性归纳

    收集总结的HTML5的新特性,基本除了IE9以下都可以使用. HTML5语法 大部分延续了html的语法 不同之处:开头的 <!DOCTYPE html> <html lang=&q ...

  6. Scratch www 系统搭建

    原文地址:https://blog.csdn.net/litianquan/article/details/82735809 Scratch www要基于Nodejs的环境才可以运行,我尝试了在Win ...

  7. 第一个JavaScript代码

    既然我们的CSS就必须要要放再专门的style标签内  那么javascript也需要放在子级的标签内,那就是script标签内 在页面中,我们可以在body标签中放入<script type= ...

  8. python的文件对象(1)

    1  首先要明确的是,文件只是连续的字节. 数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成. 2  打开文件之门的钥匙--open() open()内建函数成功打开文件后会返回一个 ...

  9. Linux 系统的文件类型

    Linux文件类型常见:普通文件.目录文件.字符设备文件和块设备文件.符号链接文件 1.1. 普通文件(-) ls -lh 来查看某个文件的属性,可以看到有类似-rwxrwxrwx,值得注意的是第一个 ...

  10. Linux 下shell中exec解析

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息.       bash shell ...