前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漫谈iOS安全

漫谈iOS安全

作者头像
Helloted
发布于 2022-06-06 11:35:51
发布于 2022-06-06 11:35:51
49000
代码可运行
举报
文章被收录于专栏:HellotedHelloted
运行总次数:0
代码可运行

一、前言

经常都能听到大家说,iOS很安全,iPhone比安卓手机安全。那么为什么iOS会安全,难道仅仅是因为iOS是闭源然后安卓是开源的,开源的就一定比闭源安全?前段时间著名的Xcode Ghost 事件也让人觉得iOS好像并不是那么地安全,今天就随便说说iOS的安全。

二、沙盒机制

沙盒简介

Complex systems will always have vulnerabilities, and software complexity only increases over time. No matter how carefully you adopt secure coding practices and guard against bugs, attackers only need to get through your defenses once to succeed. While App Sandbox doesn’t prevent attacks against your app, it does minimize the harm a successful one can cause. A non-sandboxed app has the full rights of the user who is running that app, and can access any resources that the user can access. If that app or any framework it is linked against contain security holes, an attacker can potentially exploit those holes to take control of that app, and in doing so, the attacker gains the ability to do anything that the user can do.

复杂系统始终都会存在漏洞,软件复杂性只会随着时间的推移而增加。 无论你采取安全的编码方式多么谨慎来避免错误,攻击者只需要击穿一次防御就能成功。 虽然应用程序沙盒不能防止对您的应用程序的攻击,但它确实最大限度地减少了可能导致的危害。

非沙盒应用程序具有正在运行该应用程序的用户的完全权限,并且可以访问用户可以访问的任何资源。 如果该应用程序或任何框架被链接到一些安全漏洞,攻击者可能潜在地利用这些漏洞来控制该应用程序,并且在这样做时,攻击者可以执行任何用户可以执行的操作。

Designed to mitigate this problem, the App Sandbox strategy is twofold:

  1. App Sandbox enables you to describe how your app interacts with the system. The system then grants your app the access it needs to get its job done, and no more.
  2. App Sandbox allows the user to transparently grant your app additional access by way of Open and Save dialogs, drag and drop, and other familiar user interactions.

为了解决上面的问题,沙盒策略有两个方面:

应用程序沙盒允许您描述应用程序如何与系统进行交互。 系统然后授予您的应用程序所需的访问权限,以完成其工作,不会赋予更多的权限。 应用程序沙盒允许用户通过打开和保存对话框,拖放和其他熟悉的用户交互方式透明地授予您的应用程序附加访问权限。

iOS的沙盒

来看看iOS的沙盒结构图

iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

  1. 每个应用程序都有自己的存储空间
  2. 应用程序不能翻过自己的围墙去访问别的存储空间的内容
  3. 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

1、AppName.app 目录:这是应用程序的程序包目录,这里面存放的是应用程序的源文件,包括资源文件和可执行文件。包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

2、Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

3、Library 目录:这个目录下有两个子目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好. Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。 可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

4、tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString *tmpDir =  NSTemporaryDirectory();

综上,itunes会备份的目录为Documents以及Library目录里除Caches目录的文件。

三、HTTPS

这是对网络数据传输过程中的加密。

其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据。HTTP和SSL/TSL都处于OSI模型的应用层。从HTTP切换到HTTPS是一个非常简单的过程。

可参考这篇博文Http与Https

四、APP加固

1、字符串混淆

我们在代码中有时候会用到一些静态字符串,比如像一些SDK的key、网络加密使用的“盐”等字符串,不能使用明文保存,需要对这些静态字符串进行加密,以防止在APP被反编译后泄露。然后在需要使用字符串的地方进行解密。通常我们使用异或加密来加密字符串.

异或的运算方法是一个二进制运算: 1^1=0 0^0=0 1^0=1 0^1=1 两者相等为0,不等为1. 对于一个字符来说,都可以用二进制码来表示.如A:01000001,字符的异或就是对每一位进行二进制运算. 用于加密算法时,假设你要加密的内容为A,密钥为B,则可以用 异或加密:C=A^B 在数据中保存加密后的C就行了. 用的时候:A=B^C 即可取得原加密A的内容,所以只要知道密钥,就可以完成加密和解密. 异或加密和解密的方法一致,运算一次就是加密,再运算一次就是解密。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (NSString *)xorStr:(NSString *)xorStr withKey:(NSString *)key{
    NSData  *strData = [xorStr dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    Byte *keyBytes = (Byte *)[keyData bytes];   //取关键字的Byte数组, keyBytes一直指向头部
    Byte *sourceDataPoint = (Byte *)[strData bytes];  //取需要异或的数据的Byte数组
    for (long i = 0; i < [strData length]; i++) {
        sourceDataPoint[i] = sourceDataPoint[i] ^ keyBytes[(i % [keyData length])]; //然后按位进行异或运算
    }
    NSString *outStr = [[NSString alloc]initWithData:strData encoding:NSUTF8StringEncoding];
    return outStr;
}
  1. 类名、方法名混淆 对应用程序的方法名和方法体进行混淆,保证源码被逆向后很难明白它的真正功能。
  2. 程序结构混淆加密 对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。
  3. 反调试、反注入等一些主动保护策略 这是一些主动保护策略,增大破解者调试、分析APP的门槛。

五、数据加密

以下代码可以在Github下载

Github-iOS加密

哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

1、哈希Hash

基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

1.1、Md5
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (NSString *)md5:(NSString *)src
{
    if (src && src.length > 0) {
        const char *cStr = [src UTF8String];
        unsigned char result[16];
        CC_MD5( cStr, (CC_LONG)strlen(cStr), result ); // This is the md5 call
        return [NSString stringWithFormat:
                @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                result[0], result[1], result[2], result[3],
                result[4], result[5], result[6], result[7],
                result[8], result[9], result[10], result[11],
                result[12], result[13], result[14], result[15]
                ];
    }
    return nil;
}
1.2、SHA
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (NSString*)sha1:(NSString *)src
{
    const char *cstr = [src cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:src.length];
    //使用对应的CC_SHA1,CC_SHA256,CC_SHA384,CC_SHA512的长度分别是20,32,48,64
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    //使用对应的CC_SHA256,CC_SHA384,CC_SHA512
    CC_SHA1(data.bytes, data.length, digest);
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    return output;
}
2、Base64编码

Base-64编码可以将任意一组字节转换为较长的常见文本字符序列

3、对称加密
3.1、DES

DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。

3.2 、AES

AES(Advanced Encryption Standard),高级加密标准,是下一代的加密算法标准,速度快,安全级别高。AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface NSString (AES)
//加密
- (NSString *) AES256_Encrypt:(NSString *)key;
//解密
- (NSString *) AES256_Decrypt:(NSString *)key;
@end

.m

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//加密
- (NSString *) AES256_Encrypt:(NSString *)key{
    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:self.length];
    //对数据进行加密
    NSData *result = [data AES256_Encrypt:key];

    //转换为2进制字符串
    if (result && result.length > 0) {

    Byte *datas = (Byte*)[result bytes];
    NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
    for(int i = 0; i < result.length; i++){
        [output appendFormat:@"%02x", datas[i]];
    }
    return output;
    }
    return nil;
}

//解密
- (NSString *) AES256_Decrypt:(NSString *)key{
    //转换为2进制Data
    NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [self length] / 2; i++) {
    byte_chars[0] = [self characterAtIndex:i*2];
    byte_chars[1] = [self characterAtIndex:i*2+1];
    whole_byte = strtol(byte_chars, NULL, 16);
    [data appendBytes:&whole_byte length:1];
    }

    //对数据进行解密
    NSData* result = [data AES256_Decrypt:key];
    if (result && result.length > 0) {
        return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    }
    return nil;
}
4、非对称加密

几种非对称性加密算法:RSA,DSA,ECC

RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java8新特性总结备忘
java8新特性总结备忘 lambda List<String> list = Arrays.asList("a", "b", "d", "c"); //一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示 list.forEach(e -> System.out.println(e)); list.forEach((String e) -> System.out.println(e)); // 在某些情况下lambda的函数体会更加复杂,这时可以把函数体放到在一对花括号中 list
earthchen
2020/09/24
3450
一文看透java8新特性
毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。在这篇教程中,我们将一一探索这些变化,并用真实的例子说明它们适用的场景。
好好学java
2018/08/16
8510
一文看透java8新特性
【译】Java 8的新特性—终极版
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自
汤高
2018/01/11
1.3K0
【译】Java 8的新特性—终极版
Java基础20:Java8新特性终极指南
毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具与JVM(Java虚拟机)带来了大量新特性。在这篇教程中,我们将一一探索这些变化,并用真实的例子说明它们适用的场景。
程序员黄小斜
2019/04/07
5840
马上Java14要来了,你还不知道Java8的新特性?
Lambda表达式, 也可以称为闭包,它是Java8这个版本最重要的新特性.Lambda允许把函数作为一个方法的参数, 可以使代码变得更加简洁.
故里
2020/11/25
7330
马上Java14要来了,你还不知道Java8的新特性?
Java8新特性实践
Java 8 已经发行好几年了,作为一名Java程序员,再不应用它的美好的新特性肯定要被社会淘汰了。这篇文章,我作为一名Java8新手用代码实践Java8新特性,来探究它的美好。 1. Lambda表达式与Functional接口 Lambda表达式(也称为闭包),它允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据,这一特性和scala语言很像。 在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示。例如: Arrays.asList( "
神秘的寇先森
2018/05/30
9360
Java8新特性
Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口
shimeath
2020/07/30
6310
Java8新特性
JDK1.8的新特性
JDK1.8已经发布很久了,在很多企业中都已经在使用。并且Spring5、SpringBoot2.0都推荐使用JDK1.8以上版本。所以我们必须与时俱进,拥抱变化。
框架师
2021/03/04
8710
JDK1.8的新特性
全网最通透的Java8版本特性讲解
以下是 Java 8 中的引入的部分新特性。关于 Java 8 新特性更详细的介绍可参考这里。
我没有三颗心脏
2020/08/20
9660
拥抱变化,面向Java17,Java8-18全系列特性详解
当我们大部分Javaer还沉浸在Java 8 的特性中时,Java 19 预计在2022年9月20号发布,现在半年发布一次的节奏真让人应接不暇,况且Spring Boot 3.0开始最低版本为Java 17,Spring Security、KafKa等也都宣布在后期版本最低需要Java 17 ,所以我们恶补一下Java 8-18的特性很有必要。
阿提说说
2022/11/18
2.6K0
拥抱变化,面向Java17,Java8-18全系列特性详解
Java8的十大新特性你了解多少呢?
Java 8可谓是自Java 5以来最具革命性的版本了,她在语言、编译器、类库、开发工具以及Java虚拟机等方面都带来了不少新特性。我们来一一回顾一下这些特性。
MonroeCode
2018/01/12
9070
一次性实战java8 新特性(全)—— Lambda、Optional、stream、DateTime
本篇博客你将学到: 1.Lambda表达式 2.Optional类,告别空指针异常 3.Stream流式处理 4.时间处理LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Clock、Duration 5.重复注解 6.扩展注释 7.更好的类型推荐机制 8.参数名字保存在字节码中 9.异步调用 CompletableFuture
源码之路
2020/09/03
2.6K0
Java 8的新特性还不了解?快进来!
Java 8从发布到现在已经6年多了,java 8在Java历史版本中是一个具有“里程碑”意义的重要版本,相信现在很多公司都用上了Java 8这个版本,用了之后你就知道为什么说是“里程碑”了,然后你会觉得“真香”!
编程大道
2020/08/20
1.3K0
Java 8的新特性还不了解?快进来!
Java8新特性及使用(一)
以下是Java8中的引入的部分新特性。关于Java8新特性更详细的介绍可参考这里。
Abalone
2022/07/14
1K0
Java8-新特性
哈喽!大家好,我是小简。今天开始学习《Java8-新特性》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/04
4220
Java8-新特性
Java 面试知识点解析(四)——版本特性篇(2)
在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧。
我没有三颗心脏
2018/05/17
1.6K0
Java 面试知识点解析(四)——版本特性篇(2)
JAVA8十大新特性详解
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:
用户3467126
2019/11/01
9600
java8 新特性
Java 8 Tutorial 接口的默认方法(Default Methods for Interfaces) Lambda表达式(Lambda expressions) 函数式接口(Functional Interfaces) 方法和构造函数引用(Method and Constructor References) Lamda 表达式作用域(Lambda Scopes) 访问局部变量 访问字段和静态变量 访问默认接口方法 内置函数式接口(Built-in Functional Inter
袁新栋-jeff.yuan
2020/08/26
5550
java8新特性
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
1.6K0
java8新特性
Java8新特性详解
Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。
Jensen_97
2023/07/20
2.3K0
Java8新特性详解
相关推荐
java8新特性总结备忘
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档