iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下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补丁相关推荐
- 14-SpringSecurity:前后端分离项目中用户名与密码通过RSA加密传输
背景 登录认证几乎是所有互联网应用的必备功能,传统的用户名-密码认证方式依然流行,如何避免用户名.密码这类敏感信息在认证过程中被嗅探.破解? 这里将传统的用户名.密码明文传输方式改为采用 RSA 的非 ...
- RSA加密传输代码示例
RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现 ...
- Js参数RSA加密传输之jsencrypt.js的使用
这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 注意几点: 1.参数传递的+号处理,在传输时会把+变成 ...
- 使用RSA加密传输账号密码信息
原文地址:https://blog.springcoder.cn/posts/5b7ae417.html 背景 在开发中,通常会偷懒将用户的登录信息(账号密码)直接以明文的方式发送到后端,但我们的项目 ...
- (转)iOS应用架构谈 本地持久化方案及动态部署
原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...
- iOS应用架构谈(4) 本地持久化方案及动态部署
前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...
- iOS应用架构谈-本地持久化方案及动态部署
iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...
- 四,iOS应用架构谈 本地持久化方案及动态部署
前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...
- ssiOS应用架构谈 本地持久化方案及动态部署
本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...
最新文章
- ALTER AVAILABILITY GROUP (Transact-SQL)
- Codeforces Round #481 (Div. 3)【完结】
- 接口性能优化技巧,干掉慢代码!
- cnsul linux环境后台启动_Redis安装和配置(Windows和Linux)
- 魔术引号 php,php怎么关闭魔术引号
- consul删除无效服务
- 地图大数据来了!中国人口吸引力城市TOP 10
- 学习yield《转》
- MySQL级联复制(A-B-C) —log-slave-updates = 1
- 导入项目后资源文件乱码---eclipse插件properties Editor安装
- 网站加速--Cache为王篇
- 帅帅什么意思_帅帅帅是什么意思
- 控制元素到达可视区域内触发动效
- 浏览器前进后退静默刷新页面
- ZO-Adam/ZO-Newton
- 从零玩转人脸识别之RGB人脸活体检测
- PRML读书会第一章 Introduction(机器学习基本概念、学习理论、模型选择、维灾等)...
- 虚拟机开机问题:开机时卡在启动窗口
- 计算机应用领域中CAL代表,计算机应用领域.doc
- python绘制象棋棋盘图片_Python开发象棋小游戏(绘制棋盘)
热门文章
- 小米盒子4 android版本,安卓系统越用越卡,曾学忠:小米 10 至尊纪念版搭载黑科技 MITurbo 4.0 技术...
- php有哪些屏蔽错误的方法,php常见的错误类型及屏蔽方法
- lamp mysql脚本_初次尝试利用脚本自动编译搭建LAMP-----Mysql
- echart多个柱状图 设置y轴显示_Origin神教程:柱状图还是2D的吗?也没有误差棒?...
- 如何安装_毛巾架如何安装
- 天翼云从业认证(3.6)了解天翼云大数据SaaS服务
- F2上的8×8可逆矩阵的个数为2的62次幂
- 信息系统项目管理师论文基础知识
- SpringBoot+Swagger2常用注解
- JPA中实现双向一对多的关联关系