本文转载至 http://blog.cnbang.net/tech/2879/

使用 JSPatch 有两个安全问题:

  1. 传输安全:JS 脚本可以调用任意 OC 方法,权限非常大,若被中间人攻击替换代码,会造成较大的危害。
  2. 执行安全:下发的 JS 脚本灵活度大,相当于一次小型更新,若未进行充分测试,可能会出现 crash 等情况对 APP 稳定性造成影响。

接下来说下这两个问题的解决方案。

传输安全

方案一:对称加密

若要让 JS 代码传输过程中不轻易被中间人截获替换,很容易想到的方式就是对代码进行加密,可以用 zip 的加密压缩,也可以用 AES 等加密算法。这个方案的优点是非常简单,缺点是安全性低,容易被破解。因为密钥是要保存在客户端的,只要客户端被人拿去反编译,把密码字段找出来,就完成破解了。

对此也有一些改进方案,例如:

1.可以把密码保存到 keychain 上,但这种方式也是不可靠的,只要随便找一台机器越狱装了这个 APP,用 hook 的方式在 APP 上添加一些代码,获得 keychain 里的密钥值,就可以用于其他所有机器的传输解密了。

2.给每个用户下发不同的密钥。但这样就非常繁琐,需要对下发密钥的请求做好保护,后台需要每次都对脚本进行不同密钥的加密操作,复杂性高了。

综上,对称加密安全性低,若要稍微提高点安全性,就会提升程序复杂度。

方案二:HTTPS

第二个方案是直接使用 HTTPS 传输,优点是安全性高,只要使用正确,证书在服务端未泄露,就不会被破解。缺点是部署麻烦,需要使用者服务器支持 HTTPS,门槛较高。另外客户端需要做好 HTTPS 的证书验证(有些使用者可能会漏掉这个验证,导致安全性大降),具体的认证方式可见网上一些文章,例如这篇。如果服务器本来就支持 HTTPS,使用这种方案也是一种不错的选择。

方案三:RSA 校验

有没有安全性高,部署简单,门槛低的方案?RSA 校验就是。

这种方式属于数字签名,用了跟 HTTPS 一样的非对称加密,只是简化了,把非对称加密只用于校验文件,而不解决传输过程中数据内容泄露的问题,而我们的目的只是防止传输过程中数据被篡改,对于数据内容泄露并不是太在意。整个校验过程如下:

  1. 服务端计算出脚本文件的 MD5 值,作为这个文件的数字签名。
  2. 服务端通过私钥加密第 1 步算出的 MD5 值,得到一个加密后的 MD5 值。
  3. 把脚本文件和加密后的 MD5 值一起下发给客户端。
  4. 客户端拿到加密后的 MD5 值,通过保存在客户端的公钥解密。
  5. 客户端计算脚本文件的 MD5 值。
  6. 对比第 4/5 步的两个 MD5 值(分别是客户端和服务端计算出来的 MD5 值),若相等则通过校验。

只要通过校验,就能确保脚本在传输的过程中没有被篡改,因为第三方若要篡改脚本文件,必须计算出新的脚本文件 MD5 并用私钥加密,客户端公钥才能解密出这个 MD5 值,而在服务端未泄露的情况下第三方是拿不到私钥的。

这种方案安全性跟 HTTPS 一致,但不像 HTTPS 一样部署麻烦,一套代码即可通用。对于它的缺点:数据内容泄露,其实在传输过程中不泄露,保存在本地同样会泄露,若对此在意,可以对脚本文件再加一层简单的对称加密。这个方案优点多缺点少,推荐使用,目前 JSPatch 平台就是使用这个方案。

最后有个小问题,保存在客户端的代码也可能被人篡改,需不需要采取措施?这个要看各人需求了,因为这个安全问题不大,能篡改本地文件,差不多已经有手机所有权限了,这时也无所谓脚本会不会被篡改了。若有需要,可以加个简单的对称加密,或者按上述流程每次都验证一遍MD5值。

执行安全

对于中大型 APP,下发 JS 脚本需要谨慎,有可能因为疏忽下发了有问题的代码,导致大量 APP crash,或一些其他异常情况,需要有一些机制避免这种情况。若要做得完整,可以分为:事发前(灰度),事发中(监控),事发后(回退)。

灰度

首先需要在事发前把出现问题的影响面降到最低,对于中大型 APP,不能一次把脚本下发给所有用户,需要有灰度机制,也就是一开始只下发给其中一部分用户,看看会不会出现异常情况,再逐步覆盖到所有用户。有条件的话灰度的用户最好按机型/系统/地域等属性随机分配,尽量让最少的人覆盖到大部分情况。

监控

接着是事发了我们需要知道脚本有问题,需要对 APP 有一些监控机制,像 crash 监控,这个一般所有 APP 都有接入,再按需求自行加入其他监控指标。

回退

最后是事发后回退代码。一般为了避免不可预料的情况出现,JSPatch 脚本建议在启动时执行,APP 运行过程中不去除,所以这个回退建议的实现方式是后台下发命令,让 APP 在下次启动时不执行 JSPatch 脚本即可。

但这里能回退的前提是 APP 可以接收到后台下发的回退命令,若因为下发的脚本导致 APP 启动即时 crash,这个回退命令也会接收不到。所以建议再加一层防启动 crash 的机制,APP 在连续启动即 crash 后,下次启动不再执行脚本文件。

灰度和监控中小型 APP 可以考虑不用,回退机制是每个使用 JSPatch 都建议加上的。目前 JSPatch 平台实现了上述回退方案。

JSPatch 部署安全策略的更多相关文章

  1. JSPatch部署JS代码控制OC代码

    前言: 这里算是比较实用的一篇了吧,进行了网络安全部署 准备: bmob账号,JSPatch,公钥,私钥,MD5加密,AFNetWorking下载文件 #import <CommonCrypto ...

  2. JSPatch - 基本使用和学习

    介绍 JSPatch是2015年由bang推出的能实现热修复的工具,只要在项目中引入极小的JSPatch引擎,就可以用 JavaScript 调用和替换任何 Objective-C 的原生方法,获得脚 ...

  3. flash游戏服务器安全策略

     在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递.在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器.究 ...

  4. 配合 APP 调用 JS 的一次尝试

    项目初衷 最初的场景是用户在对购物车的操作中,由于用户对购物车的每次操作(包括选择,调整数量)都需要计算商品的促销和分组的情况,而这段逻辑的计算都需要调用后端的接口,那么瓶颈来了: 请求时间长--一次 ...

  5. 一篇文看懂Hadoop:风雨十年,未来何去何从

    本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...

  6. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

        你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...

  7. bigdata_一篇文看懂Hadoop

    本文转载:暂未找到原出处,如需署名 请联系 我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文 ...

  8. 一篇文看懂Hadoop

    我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文分为技术篇.产业篇.应用篇.展望篇四部分 技 ...

  9. Hadoop十年解读与发展预测

    编者按:Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在2016年Ha ...

随机推荐

  1. SEMI-PARAMETRIC TOPOLOGICAL MEMORY FOR NAVIGATION

    github: https://github.com/nsavinov/SPTM

  2. JAVA组成原理及使用方法编辑环境及实现过程

    JAVA组成原理一.由四方面组成:1.Java编程语言2.Java类文件格式3.Java虚拟机4.Java应用程序接口 当编辑并运行一个Java程序时,需要同时涉及到这四种方面.二.使用文字编辑软件: ...

  3. numpy中dtype

    简单说明dtype使用方法: Rule为规则类,其中有3个字段,1为类型,2为计算规则,3为保留位数 如 :'close': Rule(float64, 1 / 10000.0, 2), 表示收盘价, ...

  4. 目标跟踪之meanshift---meanshift2

    均值漂移,可以对非刚性物理进行跟踪,是分参数估计,过程是迭代的过程,对光和形态不敏感,缺点是检测目标是固定的,特征不较少,模板背景没有实时更新,没有目标的位置精度预测只是梯度浓聚, 原理: 用文字标书 ...

  5. AFNetWorking能做什么

    AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其它方法为基础的. 以下这个样例是用来处理json请求的: NSURL *url = ...

  6. 笔记关闭fn功能

    使用笔记本在vs开发中调试需要加fn+10进行调试,一点都不方便,使用fn+esc(fnLock)这个功能就可以关闭fn功能

  7. C# 将DateTime.Now.DayOfWeek的值转为中文星期

    1.  如果常规使用DateTime.Now.DayOfWeek则得到是英文,如果加ToString后再加上相关参数(“G”.“g”.“X”.“x”.“F”.“f”.“D”或“d”),则还会有所变化. ...

  8. 远程桌面连接工具 Remote Desktop Manager 9.1.2.0 Enterprise 多国语言绿色版附注册码 简单使用

    1:修改成中文简体 2: 注册破解  (记得一定要先断网)   admin admin@admin.com 31GKI-OK1HY-59H35-Y8GPB-8WDY6 3 : 创建连接   搞定

  9. tracert

    TRACERT命令 编辑 Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP数据包访问目标所采取的路径.Tracert 命令使用用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确 ...

  10. kafka基本概念

    介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计. 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语:Kafka将消息以to ...