概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中。

在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你也可以选择其他的算法)。
iOS客户端中RSA加解密的例子不是很多,我在网络上寻找了一些开源代码,发现揭秘算法有误。我就在其基础上做了修改,修复了问题。并且我重新整理了一份,并且支持cocoapod接入,下面是github地址。以后我还会详细的说明RSA加密的原理,以及github上代码实现。

https://github.com/qianhongqiang/RSAEncryptor

生成RSA公私钥文件

RSA公私钥声称可以参考下面的文章,照着一步步做就是了。其中,公私钥长度建议1024位以上,我自己则采用了2048位的。

http://blog.csdn.net/yi_zz32/article/details/50097325

使用.der后缀的公钥和.p12为后缀的私钥作为秘钥对,对尚未加密的patcher进行加密。

MD5校验

因为网络传输存在不稳定性,倘若传输中某个字节出现了错误,那么加载patch后肯定会运行失败,在这种情况下,我们是不能加载patcher的。游戏游戏在下载patch后,都会提示正在进行MD5校验(或其他算法校验),都是这个道理。MD5的功能只是单纯的进行校验。我直接把使用的代码贴出来了,比较短。需要倒入库#import <CommonCrypto/CommonDigest.h>,你可以直接拷贝。

+(NSString*)fileMD5:(NSString*)path
{NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];if( handle== nil ) return @"ERROR GETTING FILE MD5"; // file didnt existCC_MD5_CTX md5;CC_MD5_Init(&md5);BOOL done = NO;while(!done){NSData* fileData = [handle readDataOfLength: 256 ];CC_MD5_Update(&md5, [fileData bytes], (uint32_t)[fileData length]);if( [fileData length] == 0 ) done = YES;}unsigned char digest[CC_MD5_DIGEST_LENGTH];CC_MD5_Final(digest, &md5);NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",digest[0], digest[1],digest[2], digest[3],digest[4], digest[5],digest[6], digest[7],digest[8], digest[9],digest[10], digest[11],digest[12], digest[13],digest[14], digest[15]];return s;
}

生成加密后的Patcher

目前来说,我紧紧打算用patche做bug紧急修复的用途,没有打算直接使用它发布新功能,所以patcher中紧紧包涵脚本的文本,不包含图片等文件。
自己定义了流的生成与解析过程:

写入md5值的长度,我这里用1个字节表示,已经足够的长度来表示了。

NSMutableData *finalData = [NSMutableData data];//所有的data最后都写入这个data中NSString *fileMD5 = [MD5 fileMD5:dataFileName];
NSData *md5Data = [fileMD5 dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger length = [md5Data length];unsigned char bit8 = length & 0x000000FF;//提取低八位
[finalData appendBytes:&bit8 length:1]; [finalData appendData:md5Data];

最后在把RSA加密后的data拼接到finalData中,在把data输出到文件。这样patcher就搞定了。

解密patcher

patcher下载客户端后,就需要对patcher进行解析。解析就逆着patcher的生成过程就可以

NSData *decryptFileData = [NSData dataWithContentsOfFile:encryptFileName]; //获取文件的data//读取文件的第一个字节,
int8_t v1;
[decryptFileData getBytes:&v1 range:NSMakeRange(0,1)];
//查看MD5值的长度
int getMG5Length = (int32_t)v1 & 0x0ff;
//查看md5信息
NSData *getmd5Data = [decryptFileData subdataWithRange:NSMakeRange(1, getMG5Length)];
NSString *fileMD5s = [[NSString alloc] initWithData:getmd5Data encoding:NSUTF8StringEncoding];
//获取真正的patcher文本的data
NSData *contentData = [decryptFileData subdataWithRange:NSMakeRange(1+getMG5Length, decryptFileData.length - 1 -getMG5Length)];

该有的信息全部存在了,只需要将data转成文本,再次md5跟校验值比较,是否一致,一致的话,那么这个patcher就是正常的,可以加载。如果不正常的话,那么根据app需求,可以重新下载等等处理。

转载于:https://www.cnblogs.com/qianhongqiang/p/5310480.html

iOS动态部署之RSA加密传输Patch补丁相关推荐

  1. 14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输

    背景 登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名.密码这类敏感信息在认证过程中被嗅探.破解? 这里将传统的用户名.密码明文传输方式改为采用 RSA 的非 ...

  2. RSA加密传输代码示例

    RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现 ...

  3. Js参数RSA加密传输之jsencrypt.js的使用

    这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 注意几点: 1.参数传递的+号处理,在传输时会把+变成 ...

  4. 使用RSA加密传输账号密码信息

    原文地址:https://blog.springcoder.cn/posts/5b7ae417.html 背景 在开发中,通常会偷懒将用户的登录信息(账号密码)直接以明文的方式发送到后端,但我们的项目 ...

  5. (转)iOS应用架构谈 本地持久化方案及动态部署

    原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  6. iOS应用架构谈(4) 本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

  7. iOS应用架构谈-本地持久化方案及动态部署

    iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...

  8. 四,iOS应用架构谈 本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

  9. ssiOS应用架构谈 本地持久化方案及动态部署

    本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

最新文章

  1. ALTER AVAILABILITY GROUP (Transact-SQL)
  2. Codeforces Round #481 (Div. 3)【完结】
  3. 接口性能优化技巧,干掉慢代码!
  4. cnsul linux环境后台启动_Redis安装和配置(Windows和Linux)
  5. 魔术引号 php,php怎么关闭魔术引号
  6. consul删除无效服务
  7. 地图大数据来了!中国人口吸引力城市TOP 10
  8. 学习yield《转》
  9. MySQL级联复制(A-B-C) —log-slave-updates = 1
  10. 导入项目后资源文件乱码---eclipse插件properties Editor安装
  11. 网站加速--Cache为王篇
  12. 帅帅什么意思_帅帅帅是什么意思
  13. 控制元素到达可视区域内触发动效
  14. 浏览器前进后退静默刷新页面
  15. ZO-Adam/ZO-Newton
  16. 从零玩转人脸识别之RGB人脸活体检测
  17. PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)...
  18. 虚拟机开机问题:开机时卡在启动窗口
  19. 计算机应用领域中CAL代表,计算机应用领域.doc
  20. python绘制象棋棋盘图片_Python开发象棋小游戏(绘制棋盘)

热门文章

  1. 小米盒子4 android版本,安卓系统越用越卡,曾学忠:小米 10 至尊纪念版搭载黑科技 MITurbo 4.0 技术...
  2. php有哪些屏蔽错误的方法,php常见的错误类型及屏蔽方法
  3. lamp mysql脚本_初次尝试利用脚本自动编译搭建LAMP-----Mysql
  4. echart多个柱状图 设置y轴显示_Origin神教程:柱状图还是2D的吗?也没有误差棒?...
  5. 如何安装_毛巾架如何安装
  6. 天翼云从业认证(3.6)了解天翼云大数据SaaS服务
  7. F2上的8×8可逆矩阵的个数为2的62次幂
  8. 信息系统项目管理师论文基础知识
  9. SpringBoot+Swagger2常用注解
  10. JPA中实现双向一对多的关联关系