ios提出的安全熔断机制是谁提出的和安全服务内容

TB前卫网店铺大全为您精选最好的精品店铺导航,欢迎您。上一篇:当前位置:>>【编者案】本文为再读苹果《Threading Progra妹妹ing Guide》笔记第四篇,主要分享了线程安全机制和设计时所需要注意的事项。从最初的“甚么是线程”到“什么时候使用Run Loop”和“线程安全机制”等,作者付宇轩对苹果官方《Threading Progra妹妹ing Guide》进行了深度的学习,并将自己的所学到的点点滴滴总结成数万字的笔记,其中还包括了自己的动手实践。浏览他的笔记,相信所有iOS开发者都能收获颇丰。系列浏览配置Timer事件源配置Timer事件源拢共分几步?很简单,大体只有两步,先创立Timer对象,然后将其添加至Run Loop中。在Cocoa框架以及Core Foundation框架中都提供了相干的对象以及接口,在Cocoa框架中,它为咱们提供了NSTimer类,该类有两个类法子,可让咱们很利便的在当前线程的Run Loop中配置Timer事件源:scheduledTimerWithTimeInterval:target:selector:userInfo:repeats::该法子有五个参数分别是履行事件动静时间间隔、接管事件动静的目标对象、事件动静、发送给事件动静的参数、是不是重复履行标识。NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: &fireTimer:&, userInfo: &This is a arg&, repeats: true)func fireTimer(sender: NSTimer) { & & & && & print(&Fire timer...\(sender.userInfo as! String)&) & & & &}scheduledTimerWithTimeInterval:invocation:repeats::该法子有三个参数,分别是履行事件动静事件间隔、NSInvocation对象、是不是重复履行标识。这里说一下NSInvocation类,该类的作用是静态渲染动静,说的简单粗鲁一点,那就是该类表示某个对象中的某个法子,和该法子的一个或者多个参数以及返回值,当咱们需要发送有多个参数或有返回值的动静时就能够用这个类。然而在Swift中没法使用这个类,这里就不做过量说明了。以上两个类法子所添加的Timer事件源都只能添加在当前线程的Run Loop中,并且是在默许的Run Loop模式下(NSDefaultRunLoopMode),如果咱们想将Timer事件源添加至其他线程Run Loop的其他模式下,那末就需要创立NSTimer对象,并使用NSRunLoop的addTimer:forMode:法子添加创立好的NSTimer对象:import Foundationclass CustomThread: NSThread {& & var myTimer: NSTimer!& & init(myTimer: NSTimer) {& & & & self.myTimer = myTimer & & & && & }& & override func main() { && & & & autoreleasepool{& & & & & & let runloop = NSRunLoop.currentRunLoop()& & & & & & runloop.addTimer(self.myTimer, forMode: NSRunLoopCo妹妹onModes)& & & & & & print(NSThread.isMultiThreaded())& & & & & & runloop.runUntilDate(NSDate(timeIntervalSinceNow: 5)) &&& & & & } &&& & } &&}class TestThread: NSObject {& & func testTimerSource() {& & & & let fireTimer = NSDate(timeIntervalSinceNow: 1)& & & & let myTimer = NSTimer(fireDate: fireTimer, interval: 0.5, target: self, selector: &timerTask&, userInfo: nil, repeats: true)& & & & let customThread = CustomThread(myTimer: myTimer)& & & & customThread.start()& & & & sleep(5) &&& & }& & func timerTask() {& & & & print(&Fire timer...&) &&& & }}let testThread = TestThread()testThread.testTimerSource()在Core Foundation框架中,也为咱们提供了一系列相干的类以及法子为Run Loop添加Timer事件源,咱们一块儿来看看:import Foundationclass TestThread: NSObject {& & func testCFTimerSource() { & & & && & & & let cfRunloop = CFRunLoopGetCurrent()& & & & var cfRunloopTimerContext = CFRunLoopTimerContext(version: 0, info: unsafeBitCast(self, UnsafeMutablePointer&Void&.self), retain: nil, release: nil, copyDescription: nil)&& & & & let cfRunloopTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, 1, 0.5, 0, 0, cfRunloopTimerCallback(), &cfRunloopTimerContext)&& & & & CFRunLoopAddTimer(cfRunloop, cfRunloopTimer, kCFRunLoopDefaultMode) && & & & CFRunLoopRun()& & }& & func cfRunloopTimerCallback() -& CFRunLoopTimerCallBack {& & & & return { (cfRunloopTimer, info) -& Void in& & & & & & print(&Fire timer...&)& & & & } &&& & }}let testThread = TestThread()testThread.testCFTimerSource()配置基于端口的事件源Cocoa框架以及Core Foundation框架都提供了创立配置基于端口事件源的类以及法子,下面咱们来看看如何使用Cocoa框架创立基于端口的事件源和配置使用该类事件源。使用NSMachPort对象NSMachPort对象是甚么呢?其实就是线程与线程之间通讯的桥梁,咱们创立一个NSMachPort对象,将其添加至主线程的Run Loop中,然后咱们在二级线程履行的任务中就能够获得并使用该对象向主线程发送动静,也就是说这类方式是将NSMachPort对象在不同线程中互相传递从而进行动静传递的。在主线程中创立配置NSMachPort由于NSMachPort只能在OS X系统中使用,所以咱们需要创立一个OS X利用的工程咱们先来看看代码:import Cocoaclass ViewController: NSViewController, NSMachPortDelegate {& & let printMessageId = 1000& & override func viewDidLoad() {& & & & super.viewDidLoad()& & & & let mainThreadPort = NSMachPort()& & & & mainThreadPort.setDelegate(self)& & & & NSRunLoop.currentRunLoop().addPort(mainThreadPort, forMode: NSDefaultRunLoopMode) && & & & let workerClass = WorkerClass() && & & & NSThread.detachNewThreadSelector(&launchThreadWithPort:&, toTarget: workerClass, withObject: mainThreadPort) & &&& & }&& & // MARK: NSPortDelegate Method & && & func handlePortMessage(message: NSPortMessage) { & & &&& & }}首先咱们看到ViewController类遵守了NSMachPortDelegate协定,由于它要作为NSMachPort的代理类,通过NSMachPortDelegate的handlePortMessage:法子处理来自二级线程的动静。在viewDidLoad法子中咱们先是创立了NSMachPort对象的实例,接着设置它的代理,然后使用NSRunLoop的addPort:forMode:法子将创立好的端口对象添加至主线程的Run Loop中,最后通过NSThread的detachNewThreadSelector:toTarget:withObject:法子创立二级线程,并让该二级线程履行WorkerClass类中的launchThreadWithPort:法子,同时将刚才创立好的端口对象作为参数传给该法子,也就是将主线程中的端口对象传到了二级线程中。下面来看看handlePortMessage:中应当如何处理接管到的动静:func handlePortMessage(message: NSPortMessage) { &&& & let messageId = message.msgid&& & if messageId == UInt32(printMessageId) { & & && & & & print(&Receive the message that id is 1000 and this is a print task.&) & && & } else { & & &&& & & & // Handle other messages & &&& & }}通过端口传递的动静可以依据动静编号判断该履行甚么样的任务,所以该法子中通过NSPortMessage对象获得到动静id然落后行判断并履行相应的任务,动静id在二级线程通过端口向主线程发送动静时可以设置。在二级线程中创立配置NSMachPort首先二级线程中与主线程中同样,都需要创立端口对象、设置代理、将端口对象添加至当前线程的Run Loop中:import Cocoaclass WorkerClass: NSObject, NSMachPortDelegate {& & func launchThreadWithPort(port: NSMachPort) {& & & & autoreleasepool{& & & & & & let secondaryThreadPort = NSMachPort()& & & & & & secondaryThreadPort.setDelegate(self)& & & & & & let runloop = NSRunLoop.currentRunLoop()& & & & & & runloop.addPort(secondaryThreadPort, forMode: NSDefaultRunLoopMode)& & & & & & sendPrintMessage(port, receivePort: secondaryThreadPort)& & & & & & runloop.runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 500)) & &&& & & & }& & }& & func sendPrintMessage(sendPort: NSMachPort, receivePort: NSMachPort) { &&& & }& & // MARK: NSPortDelegate Method& & func handlePortMessage(message: NSPortMessage) { & && & } &&}创立并配置好端口后就需要向主线程发送动静了,下面咱们来看看sendPrintMessage:receivePort:法子:func sendPrintMessage(sendPort: NSMachPort, receivePort: NSMachPort) {& & let portMessage = NSPortMessage(sendPort: sendPort, receivePort: receivePort, components: nil)&& & portMessage.msgid = UInt32(1000) && & portMessage.sendBeforeDate(NSDate(timeIntervalSinceNow: 1))&}首先需要创立NSPortMessage对象,该对象就是端口之间互相传递的介质,初始化法子的第一个参数为主线程的端口对象,也就是发送动静的目标端口,第二个参数是二级线程的端口对象,第三个参数的作用是向主线程发送需要的数据,该参数的类型是AnyObject的数组。创立完动静对象后,要给该动静设置动静id,以便主线程接管落后行判断,最后通过sendBeforeDate:法子发送动静。线程安全机制在前文中提到过,在利用中使用多线程必将会给增添咱们编写代码的工作量,而且会带来一些潜伏的问题,最大的问题就是资源竟争的问题,多个线程同时走访资源或重复更改资源。如果咱们足够荣幸,这些问题会使利用发生对比显明的异样现象,那咱们尚可发现并修复,然而如果这些问题发生的影响不那末显明,或说只有在利用做一些特定操作才会产生异样,而咱们又没测到时就会给咱们带来大麻烦。或者许咱们可让每一个线程之间都不进行交互,没个线程都有独有资源,从而防止资源竟争问题的产生,然而这其实不是长远之计,许多情况下线程之间必需要进行交互,这时候咱们就需要更好的设计模式或工具策略来防止这种问题的产生。所幸的是OS X以及iOS系统已提供了多种线程安全的法子,这一节让咱们来看看如何使用它们。原子操作(Atomic Operations)原子操作是最简单也是最基本的保证线程安全的法子,原子的本意是不能被分裂的最小粒子,故原子操作是不可被中止的一个或者一系列操作。从处理器角度来讲原子操作是当一个处理器读取一个字节时,其他处理器不能走访这个字节的内存地址,从利用层面来讲就是当一个线程对同享变量进行操作时,其他线程不能对该变量进行操作,并且其他线程不会被梗阻。举个简单的例子,有一个同享变量i,初始值是1,现在咱们对它进行两次i++的操作,指望值是3,然而在多核CPU的情况下就有多是CPU1对i进行了一次i++操作,CPU2对i进行了一次i++操作,所以结果就其实不是咱们指望的值3,而是2,由于CPU1以及CPU2同时从各自的缓存中读取变量i,分别进行加一操作,然后分别写入系统内存之中。那末想要保证读改写同享变量的操作是原子的,就必需保证CPU1读改写同享变量的时候,CPU2不能操作缓存了该同享变量内存地址的缓存。在咱们使用原子操作时首先应将变量声名为原子类型(atomic_t),然后依据内核提供的原子操作API对变量进行操作,譬如给原子类型的变量v增添值i的函数void atomic_add(int i, atomic_t *v);等。OS X以及iOS也提供了一些数学运算以及逻辑运算的原子操作供咱们使用,这里就不深刻说明了,大家如果有兴致可以去官方文档找找。内存屏障(Memory Barriers)以及可见变量(Volatile Variables)CPU对内存的操作不过就是读以及写,咱们尽管了解CPU对内存进行了操作,然而咱们没法抉择在一系列CPU对内存的操作时单个操作指令的顺序,这些顺序完整由CPU随性而来。举个例子,在有两个CPU的情况下,现在有四个指令待操作:A = 1; x = A;B = 2; y = B;这四个指令的履行顺序便可能有24种不同的组合。所之内存屏障就是一个匡助CPU规定操作指令顺序的手腕,它将内存操作隔开,给屏障双侧的内存操作强加一个顺序关联,譬如所有该屏障以前的写操作以及读操作必需在该屏障以后的写操作以及读操作以前履行。可见变量是另外一个确保同享变量被多个线程操作后仍能维持正确结果的机制,CPU为了提高处理速度,通常情况下不会直接与主存打交道,而是先将系统主存中的数据读到缓存中,当从缓存中读取到同享变量,对其进行操作后又不会当即写回主存,所以如果其他CPU也要操作该同享变量,就颇有可能读到它的旧值。然而当咱们在声名同享变量时加之volatile症结字,将其声名为可见变量时就能够防止这类情况,由于CPU从缓存中读取并修改可见同享变量后会当即写回主存,而且其他CPU在操作以前会先判断缓存中的数据是不是已经过期,如果过期那末从主存中从新缓存,这样一来可见变量在每一个CPU操作时都能保证是最新值。但需要注意的是内存屏障以及可见变量都会下降编译器的机能,所以没有必需要使用的情况时不要滥用这两个机制。锁机制锁机制在大多数编程语言中都是很经常使用的线程安全机制,你可以在症结的代码先后,或只但愿同时只能被一个线程履行的任务先后加之线程锁来防止由于多线程给程序造成不可预知的问题。OS X以及iOS提供了多种锁的类型,下面让咱们来看一看:互斥锁(Mutex):互斥锁扮演的角色就是代码或说任务的栅栏,它将你但愿维护的代码片断围起来,当其他线程也试图履行这段代码时会被互斥锁梗阻,直到互斥锁被释放,如果多个线程同时竟争一个互斥锁,有且只有一个线程可以取得互斥锁。递归锁(Recursive lock):递归锁是互斥锁的变种。它允许一个线程在已具有一个锁,并且没有释放的条件下再次取得锁。当该线程释放锁时也需要一个一个释放。读写锁(Read-write lock):读写锁一般用在有资源被多个线程频繁的进行读操作,而只偶尔会有专职线程对该资源进行写操作的情况下。读写锁可被多个进行读操作的线程取得,但只能被一个进行写操作的线程取得,当有读操作的线程等待时,写操作的线程就不能取得锁,反之亦然,当写操作的线程在等待时,读操作的线程就不能取得锁。分配锁(Distributed lock):这类锁作用在过程级别,将过程维护起来,然而该锁不会梗阻其他过程,而是当其他过程与被维护过程交互时分配锁会告诉前来的走访过程被走访过程处于锁状况,让前来走访的过程自行抉择下一个操作。自旋锁(Spin lock):自旋锁与互斥锁有点相似,但不同的是其他线程不会被自旋锁梗阻,而是而是在过程中空转,就是履行一个空的循环。一般用于自旋锁被持有时间较短的情况。双检测锁(Double-checked lock):这类锁的目的是为了最大限度推延上锁的时间,由于在多线程中线程安全对开消仍是挺大的,所以一般能不上锁就不上锁。所以这类锁在上锁以前会先检查一次是不是需要上锁,在上锁以后再检查一次,最后才真正履行操作。ConditionsConditions是一种多线程间调和通讯的机制,它通经常使用于标明同享资源是不是可被走访或确保一系列任务能依照指定的履行顺序履行。如果一个线程试图走访一个同享资源,而正在走访该资源的线程将其前提设置为不可走访,那末该线程会被梗阻,直到正在走访该资源的线程将走访前提更改成可走访状况或说给被梗阻的线程发送信号后,被梗阻的线程才能正常走访这个资源。后面会说明如何使用这类机制。设计线程安全需要注意的事项诚然使用线程安全的各种机制可以是咱们的程序更为硬朗,不容易犯错,然而由于这些机制自身也会有较大的机能开消,如果滥用这些机制反而会严重影响到程序的机能。所以咱们应当在线程安全以及机能之间追求到一个平衡点,这一节咱们就来看看在设计线程安全时应当注意的事项。防止滥用线程安全机制不管是新的项目仍是已有的项目,在设计逻辑代码或属性时应当防止发生线程安全与不安全的问题。有效的防止措施就是减少逻辑代码之间的交互,或说任务与任务之间的交互,线程与线程之间的交互,减少多线程中任务走访同一变量的情况,如果需要那末可以确保每一个任务中都有该变量的拷贝,这样就能够有效防止对变量或任务采用线程安全机制。尽管对变量进行拷贝也会损耗资源,然而咱们应当要判断一下这与采取线程安全机制损耗的资源之间谁多谁少,从而做出正确的抉择。认清使用线程安全机制时的圈套在使用锁机制以及内存屏障机制时咱们常常需要斟酌将它们设置在代码的哪一个位置是最正确的,然而有些时候,你认为正确的位置不代表它真的正确,下面是一段伪代码片断,向咱们揭露一个使用锁机制时容易产生的圈套。假定有一个可变类型的数组myArray,然而该数组中的对象是不可变类型的对象anObject:NSLock* arrayLock = GetArrayLock();&NSMutableArray* myArray = GetSharedArray();&id anO[arrayLock lock];&anObject = [myArray objectAtIndex:0];&[arrayLock unlock];[anObject doSomething];上述代码片断中,对从myArray数组中获得第一个元素的操作加了锁,由于该数组是可变类型的,所以加锁避免其他线程同时操作该数组从而致使过错产生,又由于anObject是一个不可变类型对象,所以不需要耽心其他线程会对其进行扭转,所以调用anObject对象的doSomething法子时并无加锁。看起来这段代码的逻辑仿佛没甚么问题,然而凡事都架不住如果以及万一,如果在arrayLock释放锁以后以及anObject对象调用doSomething法子以前这区间里,此外一个线程清空了myArray里的元素,这时候这段代码的结果会怎么呢?谜底明显是由于当前类对anObject对象的援用被释放,anObject对象由于指向了过错的内存地址从而调用法子犯错。所以为了不这类小几率事件的产生,应当将anObject对象调用法子的操作也加之锁:NSLock* arrayLock = GetArrayLock();&NSMutableArray* myArray = GetSharedArray();id anO[arrayLock lock];&anObject = [myArray objectAtIndex:0];&[anObject doSomething];&[arrayLock unlock];那末问题又来了,如果doSomething法子履行的时间很长,线程锁一直没法释放,那末又会对线程的机能发生很大影响。要想完全解决问题,就要找到发生问题的症结点,在这个示例中发生问题的症结点就是anObject对象有可能被其他线程释放,所以解决问题的症结就是避免anObject对象被释放,咱们来看看终究的解决方案:NSLock* arrayLock = GetArrayLock();&NSMutableArray* myArray = GetSharedArray();&id anO[arrayLock lock];anObject = [myArray objectAtIndex:0];&[anObject retain];&[arrayLock unlock];[anObject doSomething];&[anObject release];避免逝世锁以及活锁的产生逝世锁的意思就是线程A以及线程B各持有一把锁,现在线程A在等待线程B释放锁,而线程B又在等待线程A释放锁,所以这两个线程谁也拿不到锁,也不是释放自己持有的锁,就会永久被梗阻在过程中。活锁的意思是线程A可使用资源,但它很礼貌,让其他线程先使用资源,线程B也能够使用资源,但它很名流,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都没法使用资源,致使活锁,活锁与逝世锁的区分在于前者的线程并无被梗阻,而是在不停的做一些与任务无关的事。发生逝世锁以及活锁的根本缘由是线程中持有多把锁,所以免这两种情况产生的最佳办法就是尽可能让线程只持有一把锁,如果实在有需求要持有多把锁,那末也应当尽可能防止其他线程来要求锁。正确使用volatile症结字如果你已使用的锁机制来维护一段代码逻辑,那末就不要使用volatile症结字来维护这段代码中使用的变量。上文中说过,可见变量机制会让代码每一次从主存中加载读取变量而非缓存,自身就对比影响机能,如果再与锁机制结合,不仅没有起到额外的维护作用,反而会严重影响程序的机能。所以如果使用了锁机制,那末可以完整省去使用可见变量机制,由于锁机制就已可以很好的维护变量的线程安全性了,不需要多此一举。作者简介: 付宇轩(@DevTalking),从事Java中间件开发、iOS开发。主要主持开发企业级ETL中间件、BPM中间件、企业级挪动利用,个人博客地址:。责编:唐小引CSDN(资讯)微信公家号:CSDNnews【公众号】:CSDN【微信号】:CSDNnews【微宣言】:CSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。下一篇:随意看看头条君是个体育迷,在体育世界里,如果说一个运动员在伤病痊愈以后想要重...|图文源自网络良多女生觉得画眉是化装中最难的步骤,不论粗细、浓淡仍是...文/张子学 重要申明:(1)本文完成于数年前,此后境内外法律、规则与...旅游君提醒:要去桂林阳朔旅游的小伙伴们?旅游君告诉大家去阳朔必做的几...唯一无二的主食店明明是北京桑拿海鲜的缔造者,现在却恰恰在专注做主食,...每一天精选家庭教育资讯以及文章,供您阅读。
假如我问你...哪四个字?交通工具?今日限行?买车摇号?……别闹。这不浪费大家的流量...我们大多数人终其一生未曾挑战过自己的极限,只活在愿望里。不过怀有愿望...搜罗娱乐花边,这里有最劲爆,最八卦的明星新闻。第一手猛料,劲爆,想看...非得通过春晚要看六小龄童的人,可能真的不是六小龄童真实的粉丝。你们所...推荐文章亲,精彩逐日话题商定你,以及咱们互动的亲们均可以取得精美礼品哟,有空...与其发一些会让大家看了心塞塞的新闻,不如让孩子学会如何维护自我。学会...美颜瘦身日记”再点击“ 话说赵本山有这样一个门徒,名叫胖丫,当年体重...| 微信第一风尚自媒体 |范主说:这里其实不出售时装。(商务范出品,...2016年3月份沪公寓项目成交套数排行榜TOP100 排名项目名称区...听好歌看图文本期举荐的是《踏浪》这首歌曲哦!我们边听好歌边看精彩图文...奔驰新C级Coupe(进口)售价:38.28-48.88万动力:2....改 装 圈玩 车 人 专 属 的 手 机 软 件改装集会至于推进改装...人生的很多烦恼,不在于以及但愿的距离,而在于心态的选择,那些选择过度...本日下昼,广州公积金中心官网发布通告宣告:从日起,...声明:TB前卫()所有信息来源于网络,转载的文章、图片、数据等内容版权均属于原网站、原店铺、原作者等拥有,如有意见、反馈或投诉等情况请联系站长:TB前卫汇集精品店、旗舰店网址/店铺信息/商品展示,并不售卖任何商品,展示信息仅供参考,购买商品均在点击链接后到淘宝/天猫商铺成交,故安全可靠。.Copyright &
&&/&& All Rights Reserved &&&|&&|&&|&&|&&|&&Processed in 0.0018 second(s)查看: 5393|回复: 1
iOS与Android的一些区别
总结了在做iOS与Android安全研究时,需要了解的区别。包括系统架构的区别,安装包的区别,文件系统的区别,二进制文件的区别,安全机制的区别与版权保护的区别
一、系统架构的区别(左边iOS,右边Android)
分为4层,分别为
(1)cocoa Touch层:包括Foundation Framework,UIkit Framework,Address Book UI Framework
(2)媒体层:包括图像(Quartz,Core Animation,OpenGL ES),音频(Core Audio,OpenAL)和视频技术
(3)核心服务层:例如CoreFoundation.framework是基于C语言的接口集,提供应用的基本数据管理和服务功能;CFNetwork.framework是一组高性能的C语言接口集,提供网络协议的面向对象的抽象。开发者可以使用CFNetwork框架操作协议栈,并且可以访问底层的结构如BSD sockets等;Security.framework提供管理证书,公钥/私钥对和信任策略等的接口来确保应用数据的安全性
(4)核心OS层: 基于Mac操作系统
2.Android架构
分为4层,分别为
(1)应用程序:使用java编写
(2)应用程序框架:
活动管理器:用来管理应用程序生命周期并提供常用的导航回退功能资源管理器:提供非代码资源的访问,如本地字符串、图形和布局文件内容提供器:用来存放和获取数据并使用这些数据可以被所有应用程序访问XMPP服务器:基于XML的网络实时通讯协议
(3)系统运行库+Android运行时
系统运行库:android包括一些c/c++库,这些库能被android系统中的不同的组件使用,例如libc是一个从BSD继承来的标准c系统函数库;webkit为Web浏览器引擎,支持Android浏览器(苹果Safari的引擎也是webkit)。SQLite为功能强劲的轻量级关系数据库引擎(iOS也是采用的该数据库引擎)。
Android运行时:包括核心库(基本类库,例如data structure,network,file system等),很多实现代码都来自Apache Harmony项目,主要目的时保证虚拟机的类库能够与Java SE类库最大程度的兼容)与Dalvik虚拟机(用于运行dex:dalvik executable格式二进制可执行文件,该虚拟机较之java虚拟机的最大区别是Dalvik基于寄存器)
(4)linux内核:基于linux 2.6内核
总的来说,如果要深层次挖掘Android的漏洞就要明白linux内核安全,如果要挖身深层次挖掘iOS的漏洞就要了解Mac内核安全(BSD内核安全)。
二、安装包的区别(左边iOS,右边Android)
总的来说,安装包由可执行文件,资源文件,签名文件,配置文件组成。
三、文件系统的区别(左边iOS,右边Android)
注意: android的sdcard是不受文件访问控制约束的
四、二进制文件的区别
1. iOS二进制文件格式
mach-o , dylib
2.Android二进制文件的区别
dex, so(ELF shared object)
五、安全机制的区别
1. iOS安全机制
(1)安全沙箱
进程隔离,每个程序都有自己的虚拟地址空间。应用程序在安装之后,系统就通过计算得到一个标识,然后基于应用程序的根目录和这个标识构件一个指向应用程序目录的路径,其他应用程序都不能进行访问。iOS 的沙箱是基于TrustBSD策略框架的内核扩展模块,针对每个进程都可以制定特殊的沙箱配置文件,沙箱配置文件编译后以2进制的方式保存在KernelCache文件中(iOS下),需反汇编成可读的文本格式来查看内核中的沙盒规则
(2)代码签名
apple需要所有开发人员对自己的iPhone应用程序使用数字签名技术。这个签名用来标识应用程序的开发者以及保证应用程序在签名之后不被更改和损坏。开发者证书由apple提供(这是与android最大的区别,android是自签名),有以下两类证书:
Developer Certificate:用于本机测试
Distribution Certificate:Ad-hoc用于100台设备以内的测试和共享;app store用于发布应用程序
所有的可执行文件、库文件都需要Apple签名后才可以运行在iOS中,内核会在调用execve之前检测Mach-o文件中的LC_CODE_SIGNATURE段是否有效和可信任的,iOS启动的时候同样也会检测KernelCache的签名是否有效代码签名的破坏可见《》
(3)ASLR(address space layout randomisation)/DEP
PIE: position independent executable
iOS 4.3后开始支持该功能,iOS上的预装应用都开启了该功能
ASLR的其他信息可见《》
DEP(Data execution Prevention),内核不允许将页面保护标志设置为RWS,并在ARMv6引入XN(execute never)标志位,从而在硬件上支持执行保护。
(4)文件系统加密
Data protection APIs
NSFileProtectionNoneNSFileProtectionCompleteNSFileProtectionCompleteUnlessOpenNSFileProtectionCompleteUntilUserAuthenticationKSecAttrAccessibleAlwaysKSecAttrAccessibleWhenUnlockedKSecAttrAccessibleAfterFirstUnlockKSecAttrAccessibleAlwaysThisdeviceOnlyKSecAttrAccessibleWhenUnlockedThisDeviceOnlyKSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
2.Android安全机制
(1)安全沙箱
每一个Android应用程序(apk文件)会在安装时分配一个独有的linux用户ID(即一个用户id识别一个应用程序),这就为它建立了一个沙箱,使其不能与其他应用程序进行接触。这个用户ID在安装时分配,并在该设备上一直保持同一个数值。所有存储在应用程序中的数据都会赋予该应用程序的用户ID,使其他应用程序无法访问这些数据(如需要访问,见(4)文件访问控制)。
(2)代码签名
采用自签名机制,不需要权威机构签名和审核,完全由用户自行判断是否信任该程序(与iOS区别很大)。签名是为了:
识别代码的作者检测应用程序是否发生了变化在应用程序之间建立信任:使用相同数字签名签署的两个应用程序可以相互授予权限来反问基于签名的API,如果他们共享用户ID,那么也可以运行在同一进程中,从而允许访问对方的代码和数据(见(4)文件访问控制)。
代码签名的详细机制可见《》
(3)manifest权限管理
Android要求用户在使用API时进行申明,称为permission,对一些敏感API的使用在安装时就可以给用户风险提示,由用户确定是否安装,例如READ_CONTACTS为读取通讯录数据权限。权限在AndroidManifest.xml文件里进行设置,通过元素添加子元素,如下图所示
permission分为4个保护等级:normal,dangerous,signature,signatureorsystem。不同的保护级别代表程序要使用此权限时的认证方式。
normal:只要申请就可以使用
dangerous:在安装时需要用户确认才可以使用,最经常使用的权限
signature:告诉android系统这个权限只能授予拥有同样数字签名并且定义了该权限的应用程序
signatureorsystem:需要开发者的应用和系统使用同一个数字证书,即需要系统或者平台签名,真实手机中的系统签名只有厂商知道
应用程序也可以定制权限以保护自己的资源,当前ita应用程序想要访问一个应用程序的受保护资源时,就必须通过它们自己的manifest文件请求适当的权限
(4)文件访问控制
因为安全沙箱的存在导致不同应用程序之间的数据(文件)是隔离的。在通过
getSharedPreferences(filename,operatingMode)openFileOutput(filename,operatingMode)openOrCreateDatabase(filename,operatingMode, SQLiteDatabase.CursorFactory)
等方法来创建一个新文件时,可以通过指定文件的存储方式operationMode来进行文件的访问控制,android文件存储有以下4种方式:
Context.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:代表该文件是私有数据,只能被应用本身访问,在该模式下,会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
除了使用Context.MODE_WORLD_READABLE/Context.MODE_WORLD_WRITEABLE标识位来使两个程序相互访问对方的资源。还可以通过设置AndroidManifest.xml文件的manifest标签中的sharedUserId属性,来使得不同的应用程序共用同一个用户ID,并且这些应用程序还使用同一个签名签署,在满足以上两个条件(共同的sharedUserID,共同的签名)的情况下就可以实现不同应用程序相互资源的访问了,如下图所示
android 4.1后才开始支持完整版功能
六、版权保护的区别
App store,采用FairPlay DRM保护商店下载应用
2. Android
(1)google play store,采用Android License Verification Library保护商店下载应用
(2)Amazon Appstore DRM
《移动互联网之智能终端安全揭秘》Android与iOS章
本帖子中包含更多资源
才可以下载或查看,没有帐号?
大神啊,IOS安卓都懂,佩服
站长推荐 /3
为更好地促进会员间的相互交流,经管理团队讨论,决定即日起开启论坛的暗组认证申请,两种认证类型:1、学生认证 2、单位或个人认证。通过认证立即获得100AB奖励!
这年头不仅帮助别人有回扣拿,还有奖品拿啊!你是那个热心的人吗?来试试吧,U盘周周送,每周参加总会有一天能中的!
暗组定制8G SLC+8G MLC,套餐购买只要88元。品牌那种TLC芯片的U盘你还是扔了吧,用MLC或SLC更稳定更快速!现在购买还送SecLight定制充电线!
Powered by

我要回帖

更多关于 ios安全机制 的文章

 

随机推荐