• 一个iOS开发本地资源文件的加密方案 在开发中,不可避免的要有一些本地资源文件要放在 mainBundle 里面,比如 plist 文件、json文件、视频、图片 等等这样的。那如果能拿到 ipa 文件,直接解包就可以看到我们 ...
    # 一个iOS开发本地资源文件的加密方案
     
    
    > 在开发中,不可避免的要有一些本地资源文件要放在 mainBundle 里面,比如 plist 文件、json文件、视频、图片 等等这样的。那如果能拿到 ipa 文件,直接解包就可以看到我们 mainBundle 里面的文件。如此一来,这些资源就会暴露无遗。
    
    我大概在网上搜了一下,有用 AES 加解密的,各种,甚至还编写了简单的 MacApp 方便操作。如此当然安全性是很高的,同时也容易带来性能问题。
    
    我想到了一个很简单的办法。其实就是利用 归档。
    
    plist 要单独处理,因为 plist 有可能是数组,也有可能是字典。
    其他文件可以统一按照二进制文件处理。
    
    打开Xcode,Command + Shift + N 创建一个新的 Command Line Tool 工程,用 Command Line Tool 就足够啦。
    
    在我们项目的工程中,把所有的需要加密的资源文件提取出来,并在工程中不要引用他们。本例我放在 Resources 文件夹下
    ![工程中资源文件](https://img-blog.csdn.net/20180809140506428?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbnFpMzc2OTkwMzEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    
    接下来在我们刚创建的 Command Line Tool 工程中,把文件夹拖进来。注意:这里选择 Create folder references
    ![导入工程](https://img-blog.csdn.net/20180809140655295?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbnFpMzc2OTkwMzEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    
    导入之后,看到的应该是蓝色的文件夹,就没问题了
    ![导入之后](https://img-blog.csdn.net/20180809140814151?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbnFpMzc2OTkwMzEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    
    接下来,开始编辑 main.m 文件:
    
    ```
    #import 
    
    NSString * OutputFilePath(NSString *fileName) {
    	//加密之后的文件输出路径,这里我是输出到桌面
        return [NSString stringWithFormat:@"/Users/#这里替换成你的用户名#/Desktop/%@.data", fileName];
    }
    
    NSString * InputFilePath(NSString *fileName) {
    	//资源文件路径,其实就是那个 Resources 文件夹的路径
        return [NSString stringWithFormat:@"/Users/#这里替换成你的用户名#/Desktop/#这里是你主项目的名称#/Resources/%@", fileName];
    }
    
    /**归档二进制文件*/
    void EncryptionDataFiles(NSArray *names) {
        [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSData *data = [NSData dataWithContentsOfFile:InputFilePath(obj)];
            [NSKeyedArchiver archiveRootObject:data toFile:OutputFilePath(obj)];
        }];
    }
    
    /**归档数组类型的Plist文件*/
    void EncryptionArrayPlistFiles(NSArray *names) {
        [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSArray *array = [NSArray arrayWithContentsOfFile:InputFilePath(obj)];
            [NSKeyedArchiver archiveRootObject:array toFile:OutputFilePath(obj)];
        }];
    }
    
    /**归档字典类型的Plist文件*/
    void EncryptionDictionaryPlistFiles(NSArray *names) {
        [names enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:InputFilePath(obj)];
            [NSKeyedArchiver archiveRootObject:dic toFile:OutputFilePath(obj)];
        }];
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSArray *names = @[@"BankBin.plist"];
    //        EncryptionDataFiles(names);
    //        EncryptionArrayPlistFiles(names);
    //        EncryptionDictionaryPlistFiles(names);
        }
        return 0;
    }
    ```
    
    编辑好之后,Command + R 就可以在输出目录上找到我们加密之后的文件了~
    
    然后我们在主工程中的某目录下,导入我们刚才输出的文件,所以这时候,加密之后的 data 文件,就会出现在 Copy Bundle Resources 里面了,也就是之后的 mainBundle 里面。
    ![加密之后](https://img-blog.csdn.net/2018080914224065?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbnFpMzc2OTkwMzEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    那么在主工程中要使用这些文件,需要解密。这里我用了内联函数,我写在 PrefixHeader.pch 中
    
    ```
    NS_INLINE id LocalFile(NSString *name) {
    	//为什么用 id 类型呢,因为返回结果有可能是 NSData ,也可能是 NSArray, 也可能是 NSDictionary 完全取决于当初你加密之前是什么类型的。
        return [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]];
    }
    ```
    
    
    ###附:
    查看当前工程所有会出现在 mainBundle 的资源文件:
    ![资源文件](https://img-blog.csdn.net/20180809141739189?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbnFpMzc2OTkwMzEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    
    
    图片资源的问题:
    如果是有@2x  和 @3x 的区分,那可能你在取出图片的时候需要判断[UIScreen mainScreen].scale 是 2 还是 3 ,从而取不同的 NSData
        
     文件命名的问题:
     我选择 data 作为扩展名,当然也可以随便输入的。另外,导出的能是这样的文件名:“BankBin.plist.data”,有两个扩展名,可以把.plist去掉,这样看起来更规范一些。即 "BankBin.data"
     
    有的小伙伴可能对 蓝色文件夹 和 黄色文件夹 有什么区别,存在困惑,请移步:
    https://blog.csdn.net/qinqi376990311/article/details/81536091
    展开全文
  • 最近技术群里看到了也有人在问关于iOS加密的问题,今天就顺便解答一下。 常用的是MD5加密,这是一种单向加密,实现如下: 需要添加的类库: #import #import #import #include MD5实现方法(16位): + ...
  • iOS--本地存储加密 2016-09-01 14:42:53
    1.本地存储加密:重要的数据名称。2.代码安全问题,现在已有工具可以反编译出C语言代码(逆向工程)3.解决办法:代码混淆
  • iOS开发 ☞ 数据加密方法 2019-03-12 11:06:03
    3、HMAC 加密算法 用途:实现设备锁 特点:长度一定 使用方法:秘钥一般从服务器获取(在注册的时候给客户端发送这个随机秘钥,服务器保存数据是账号、秘钥、还有加密后的密码。客户端保存服务器给的秘钥,保证这...
  • iOS 开发 base64 加密和解密 2016-06-30 15:44:15
    iOS 开发 base64 加密和解密首先给一个密码@property(nonatomic,copy) NSString *password;base加密方法//加密 - (void)encryption{ //1.获取需要加密文件的二进制数据 //获取本地 NSData *data = [NSData ...
  • 原文链接 写在前面:任何应用的开发中安全都是重中之重,在信息交互异常...这篇文章就介绍在iOS开发中最常用的数据加密方式。 文中证书锁定内容部分参考了博客http://blog.csdn.net/dd864140130/article/details/5...
  • iOS开发的几种加密方式 2017-06-22 16:24:34
    1base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组表示数据,改为 6个bit一组表示数据,不足的部分补零,每 两个0 用 一个 = 表示 用base64 编码之后,数据长度会变大,增加了大约...
  • 此外、面向对象、结构体、类Class,以及手动内存管理、自动内存管理、协议与抽象类型、错误处理、iOS开发中的常见概念、Xcode操作、多媒体编程、网络编程、数据解析和加密、Sqlite数据库、多线程编程、内购等实用...
  • 本地播放器作为日常生活中不可或缺的一款工具类APP,Windows、Android等平台不乏一些功能与体验兼优的产品,但 iOS 平台的用户就没有那么幸运了,优秀的产品凤毛麟角,且多数收费。 这源于 iOS 平台的特殊性,完美...
  • iOS app加密&探究爱加密iOS app加密原理。做安卓开发的一定都了解有爱加密安卓加密技术以及原理,不知道的我这里重新讲解下:  常见的安卓加密方法有:伪加密、混淆保护、运行时验证、爱加密apk加密四个方法。在...
  • IOS开发rsa加密,解密,公钥,私钥导入,导入方法有字符串导入,文件导入两种形式。
  • 向各位求教,现在项目中需要做代码混淆吗,还有本地文件一定要加密吗,比如plist文件在未越狱的时候肯定无法看到,但是越狱后就算是加密后的文件一样安全系数低啊,技术上我可以实现,但是道理没有想清楚
  • iOS开发-数据安全之加密 2016-10-12 02:02:29
    在黑客日益猖獗的今天,作为程序员,大家多多少少都要有一些数据安全方面的意识。尤其是发起网络请求时,请求的URL一般都会记录在公司服务器的访问日志中,服务器的访问日志就是是黑客攻击的重点对象之一。
  • iOS常用的加密模式 2017-10-28 17:28:08
    之前的项目中接触过一些加密的方法,也没有太仔细的进行记录和研究。最近在写SDK时,加密模块的占比相当之大;借此时机,对我们常用的加密方式做一个笔记。 为什么要做加密操作?加密就是为了保证我们的数据安全,即...
  • 还有的时候需要将一些数据保存在本地,方便其他操作。这个时候就需要对数据库中的数据进行加密了。加密听起来神奇,但是实际使用起来缺很简单; 我现在用到的加密方式有MD5和AESC加密 1.MD5加密是不可逆的 2....
  • 我现在有一个M3U8文件的URL 。它是一个加密的.ts文件上。该M3U8文件还包含的URI解密密钥,服务器那边说不需要我进行任何的解密,但是我现在使用的AVplayer不能播放,有没有人遇见过这种问题呢?安卓端可以播放
  • 由于我们的视频是直接转化为data上传至阿里云的,阿里云以及本地没有对.mov结尾的视频做处理。现得出以下两种解决方法。 1.阿里云开通视频转码服务,此方法需要付费以及后台配置。 2.iOS端将获取到...
  • 提交用户的隐私数据一定要使用POST请求提交用户的隐私数据 GET请求的所有参数都直接暴露在URL中 请求的URL一般会记录在服务器的访问日志中 服务器的访问日志是黑客攻击的重点对象之一用户的隐私数据 ...
  • iOS之数据加密 2016-05-06 21:57:51
    密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数.(密钥分为对称密钥和非对称密钥,也可以根据途径分为加密密钥和解密密钥) 明文:没有进行加密,能够直接代表原文含义的信息 密文:经过加密...
  • iOS MD5加密 —— HERO博客 2017-01-13 10:32:16
    iOS MD5加密算法,加密思路。
1 2 3 4 5 ... 20
收藏数 12,386
精华内容 4,954