前言:
前段时间,经理突然找我说:能不能在项目中对缓存的图片进行加密?当时就感到疑惑,就说:可以是可以,但为什么要这样做?有什么意义没?
我们都知道,apple使用的是沙盒(sandbox)机制,这种机制是:在受限的安全环境中运行应用程序的一种做法,而这种做法是要限制授予应用程序的代码访问权限。
所以才有这样的疑问:为什么还要对缓存的图片加密呢?于是经理立马打电话对客户说了原因,觉得没必要再做加密。但得到的回答是:有越狱的手机可以看到。。。。我那个无语啊??。
没办法,那就想办法呗。立马想到的是两种方案:
(1)网络请求下来的图片网址(imgUrl)手动加密存储。
(2)修改第三方库(例如:EMAsyncImageView、SDWebImage等)。
下面一个个说一下:
1、网络请求下来的图片网址(imgUrl)手动加密存储
大概的代码是这样的:
UIImage *image = [[UIImage alloc]init]; NSData *imageData = UIImagePNGRepresentation(image); //加密成data类型 NSData *base64Data = [imageData base64EncodedDataWithOptions:0]; //加密成字符串 NSString *base64String = [imageData base64EncodedStringWithOptions:0];
然后对data或者base64String 存储到本地就行了。读取时先进行解密,在使用就可以了
具体的base64加解密可以看 :Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
2、修改第三方库(例如:EMAsyncImageView、SDWebImage等)
这种方案就比较麻烦了,当然这种麻烦不是说修改比较麻烦,以后的维护也是问题。
2.1、EMAsyncImageView
这个库比较早了,估计除了老的项目,现在使用的就不多了。值得一提的事:这个库并不像SDWebImage一样,它是直接返回的imageView。
使用大抵就是这样:
#import "EMAsyncImageView.h" @property (weak, nonatomic)EMAsyncImageView *imageView; imageView.imageUrl = [NSURL URLWithString:imgUrl];
2.2、SDWebImage
SDWebImage的使用,现在来说事比较多的,很是受欢迎,也很是简单。
Objective-C: #import <SDWebImage/UIImageView+WebCache.h>//(我使用时添加的头文件:#import "UIImageView+WebCache.h") [imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
对于使用就不多说了。我这里说一下思路吧。如果有看过SDWebImage就会知道。这个图也对图片首次加载进行缓存的,缓存后,下次加载就直接从本地读取了,这样做的好处不言而喻。并且为了保证图片的唯一性:SDWebImage的做法是对图片的名字进行加密,以此确保图片的唯一性。
那么现在步入正题:怎样在SDWebImage缓存的图片进行加密呢?其实做法很简单,方法是和手动图片加密一样的。至于关联SDWebImage里面的代码,这点是关键。
但这样做只有弊端是:已有的多个项目修改繁琐、项目维护困难。
3、iOS--越狱检测
之后是这样回复经理的:这种功能可以实现,但费时费力,也不好维护。这只是一个为了防止越狱手机使用的功能,付出与效果不成正比(毕竟越狱手机占少数)。
但问题还在呢,于是有了另一个想法:对项目进行防越狱。app对手机进行越狱检测:如果是越狱手机,无法安装app。
到这里这件破事才算告一段落。。。。。。。??????????????????
具体的防越狱方法我就不一一列出了,可以看这里,挺详细的:iOS越狱检测总结及代码实现(JailBreak)