iOS - 安全
1. CheckList
http://www.jianshu.com/p/d3cc2d5c177d
a 数据安全。分为数据传输安全和数据存储安全
数据存储安全为保存在App中的数据安全。不允许明文存储用户的敏感信息如用户名,密码,token等。应采用适当的加密技术
数据传输安全即要求采用Https传输数据。同事对敏感参数进行加密。客户端收到服务器返回的数据后应进行证书和域名的校验。
b 信息泄露。NSLog和 brachground Snapshot
NSLog在Release下应该销毁。采用宏处理
brackground Snapshot保存在Library/Caches/Snapshots目录下,如果有敏感信息Snapshot机制会造成信息泄露。在进入后台时加蒙层或者覆盖图片。
c IPC安全 URL Scheme检验和UIPasteboard安全
通过URL Scheme调用APP时应校验URL和传递回来的信息。
在进入后台时应该清空粘贴板上的内容
d 越狱和代理校验。
2 通过AFNetworking的SSL保证网络安全
http://www.jianshu.com/p/4102b817ff2f
a 获取到站点的公开二进制证书。
"openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer"
此时会在当前目录下保存google的公共证书,保存的名称是https
b 将获取到的证书放入工程中 勾选 copy items if needed 和 add to targets
c 校验证书
- // 设定证书的校验策略
- /*
- typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
- AFSSLPinningModeNone, //无条件的信任服务器端返回的证书
- AFSSLPinningModePublicKey, //验证服务器端返回的证书与本地保存的证书的public key是否一致,一致的话进行请求。否则返回。
- AFSSLPinningModeCertificate, //代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行
- };
- */
- //
- - (void)setCustomerSecurityPolicy:(AFHTTPSessionManager*)manager{
- //获取本地保存的公共证书的路径。
- NSString *securityPath = [[NSBundle mainBundle] pathForResource:@"xxxx" ofType:@"cer"];
- NSData *securityData = [NSData dataWithContentsOfFile:securityPath];
- AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[NSSet setWithObject:securityData]];
- // 校验证书,不允许无效的证书
- securityPolicy.allowInvalidCertificates = NO;
- // 检验域名
- securityPolicy.validatesDomainName = YES;
- manager.securityPolicy = securityPolicy;
- }
这种方式是AFNetworking自己实现的单方面的服务器证书验证,双向验证需要自己重写验证回调函数
3 类名混淆
http://www.jianshu.com/p/0d42e5c6361c
在编译时遇到权限拒绝是
cd 到shell脚步所在的目录。执行 chmod 755 xxxx.sh 赋予执行shell脚步的权限。
4 class-dump获取方法名列表
http://stevenygard.com/projects/class-dump/
class-dump的使用
http://www.jianshu.com/p/b37b19864fd5
以3.5版本为例,解压后得到
将archive后得到的ipa包改成zip格式,解压,然后显示包内容的对象项目名的app文件即exec格式
然后将class-dump拖入终端,得到正确的路径之后:
/Volumes/class-dump-3.5/class-dump -h app所在的路径 -o 导出文件的路径
4 加解密
http://www.jianshu.com/p/8424b47cc8a2
MD5
- - (void)ddk_MD5EncryptWithString:(NSString *)string
- {
- // 将要加密的字符串转换成二进制数据
- NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
- // 加密结果保存地址
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- // 加密
- CC_MD5(data.bytes, (CC_LONG)data.length, result);
- NSString *encry16 = @"";
- // 获取16位的加密串
- for (int i = ; i < ; i++) {
- encry16 = [encry16 stringByAppendingString:[NSString stringWithFormat:@"%02x", result[i]]];
- }
- NSLog(@"%@", [encry16 uppercaseString]);
- NSString *encrypt = @"";
- // 获取32位的加密串
- for (int i = ; i < CC_MD5_DIGEST_LENGTH; i++) {
- encrypt = [encrypt stringByAppendingString:[NSString stringWithFormat:@"%02x", result[i]]];
- }
- NSLog(@"%@", [encrypt uppercaseString]);
- }
SHA256加密
- /*
- @string 要加密的字符串
- @algorith 要使用的加密算法
- @key 加密时的秘钥
- HMAC_SHA256和SHA256的区别:“HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。”HMAC是需要一个密钥的。所以,HMAC算法系列需要秘钥而SHA系列不需要秘钥
- enum {
- kCCHmacAlgSHA1,
- kCCHmacAlgMD5,
- kCCHmacAlgSHA256,
- kCCHmacAlgSHA384,
- kCCHmacAlgSHA512,
- kCCHmacAlgSHA224
- };
- */
- - (void)ddk_encryptHMACWithString:(NSString *)string algorithm:(CCHmacAlgorithm)algorith key:(NSString *)key
- {
- NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *keyString = [string dataUsingEncoding:NSUTF8StringEncoding];
- // 加密后保存的位置
- unsigned char buf[CC_SHA256_DIGEST_LENGTH];
- // 加密
- CCHmac(algorith, keyData.bytes, [keyData length], keyString.bytes, [keyString length], buf);
- // 将加密后的数据转化为字符串。
- NSMutableString *mstr = [NSMutableString string];
- for (int i = ; i < CC_SHA256_DIGEST_LENGTH; i++) {
- [mstr appendString:[NSString stringWithFormat:@"%02x", buf[i]]];
- }
- NSLog(@"++++++++ %@", mstr);
- }
Base64编码解码
- /// base64 编码
- - (NSString *)ddk_base64EncryptWithString:(NSString *)string
- {
- NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
- NSData *encryptData = [data base64EncodedDataWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
- NSString *test = [[NSString alloc] initWithData:encryptData encoding:NSUTF8StringEncoding];
- NSLog(@"--- %@", test);
- return test;
- }
- /// base64 解码
- - (NSString *)ddk_base64DecryptWithString:(NSString *)string
- {
- NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
- NSString *tempStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- NSLog(@"----- %@", tempStr);
- return tempStr;
- }
AES加解密
进制转换
- /**
- * 将二进制数据转换成十六进制字符串
- *
- * @param data 二进制数据
- *
- * @return 十六进制字符串
- */
- + (NSString *)data2Hex:(NSData *)data {
- if (!data) {
- return nil;
- }
- Byte *bytes = (Byte *)[data bytes];
- NSMutableString *str = [NSMutableString stringWithCapacity:data.length * ];
- for (int i=; i < data.length; i++){
- [str appendFormat:@"%02x", bytes[i]];
- }
- return str;
- }
- /// 转成二进制。
- + (NSData *)hex2data:(NSString *)hex {
- NSMutableData *data = [NSMutableData dataWithCapacity:hex.length / ];
- unsigned char whole_byte;
- char byte_chars[] = {'\0','\0','\0'};
- int i;
- for (i=; i < hex.length / ; i++) {
- byte_chars[] = [hex characterAtIndex:i*];
- byte_chars[] = [hex characterAtIndex:i*+];
- whole_byte = strtol(byte_chars, NULL, );
- [data appendBytes:&whole_byte length:];
- }
- return data;
- }
- // AES256加密
- //CCCryptorStatus CCCrypt(
- // CCOperation op, /* kCCEncrypt, etc. 进行加密还是解密 */
- // CCAlgorithm alg, /* kCCAlgorithmAES128, etc. 选择使用的算法 */
- // CCOptions options, /* kCCOptionPKCS7Padding, etc. 填充模式PKCS7(iPhone) */
- // const void *key, /* 密钥串 */
- // size_t keyLength,
- // const void *iv, /* optional initialization vector. 工作模式。传nil为ECB(电子密码本)模式,传值(密钥偏移量,长度与密钥串长度相等。)为CBC(加密块链)模式。 */
- // const void *dataIn, /* optional per op and alg */
- // size_t dataInLength,
- // void *dataOut, /* data RETURNED here */
- // size_t dataOutAvailable, /* The size of the dataOut buffer in bytes */
- // size_t *dataOutMoved /* 获取加密后的二进制数据的长度 */)
- - (void)ddk_AESEncryptWithString:(NSString *)string alg:(CCAlgorithm)alg key:(NSString *)key iv:(NSString *)iv
- {
- NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
- NSData *strData = [string dataUsingEncoding:NSUTF8StringEncoding];
- size_t length = strData.length + kCCKeySizeAES128;
- void *buf = malloc(length);
- if (ivData.length != ) {
- return;
- }
- size_t decryptsize = ;
- CCCryptorStatus status = CCCrypt(kCCEncrypt, alg, kCCOptionPKCS7Padding, keyData.bytes, (size_t)keyData.length, ivData.bytes, strData.bytes, (size_t)strData.length, buf, length, &decryptsize);
- if (status == kCCSuccess) {
- NSData *re = [NSData dataWithBytes:buf length:decryptsize];
- free(buf);
- NSLog(@"++++ %@", [ViewController data2Hex:re]);
- NSLog(@"---- %@", [re base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]);
- }else {
- free(buf);
- }
- }
- // AES256解密
- - (void)ddk_AESDecryptWithString:(NSString *)string alg:(CCAlgorithm)alg key:(NSString *)key iv:(NSString *)iv
- {
- NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
- NSData *strData = [string dataUsingEncoding:NSUTF8StringEncoding];
- strData = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
- size_t length = strData.length + kCCBlockSizeAES128;
- void *buf = malloc(length);
- if (ivData.length != ) {
- return;
- }
- size_t decryptsize = ;
- CCCryptorStatus status = CCCrypt(kCCDecrypt, alg, kCCOptionPKCS7Padding, keyData.bytes, (size_t)keyData.length, ivData.bytes, strData.bytes, (size_t)strData.length, buf, length, &decryptsize);
- if (status == kCCSuccess) {
- NSData *re = [NSData dataWithBytes:buf length:decryptsize];
- free(buf);
- // NSLog(@"++++ %@", [ViewController data2Hex:re]);
- NSString * mm = [[NSString alloc] initWithData:re encoding:NSUTF8StringEncoding];
- NSLog(@"+++++ %@", mm);
- NSLog(@"---- %@", [re base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]);
- }else {
- free(buf);
- }
- }
iOS - 安全的更多相关文章
- iOS可视化动态绘制连通图
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- iOS总结_UI层自我复习总结
UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- 告别被拒,如何提升iOS审核通过率(上篇)
iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- Summary of Critical and Exploitable iOS Vulnerabilities in 2016
Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...
- 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结
黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
随机推荐
- iOS.Dev.Support.MultiVersions
如何利用target conditionals和availabilty 如何来区分平台iOS OR Mac “When building for iOS the deployment target i ...
- 品味性能之道<三>:方法论
自顶向下的性能优化方法论 系统优化是包括系统设计.开发.产品上线.平台优化的全过程,不同阶段的优化工作对全系统所带来的效益是不同的.理想的性能优化论应该采用自顶向下的优化方法,即在项目设计.开发和上线 ...
- jquery ui中的dialog,官网上经典的例子
jquery ui中的dialog,官网上经典的例子 jquery ui中dialog和easy ui中的dialog很像,但是最近用到的时候全然没有印象,一段时间不用就忘记了,这篇随笔介绍一下这 ...
- CSS 关键的基础知识
今晚看了 百度传课 一门关于CSS的课程, 感觉不错, 随手记了点儿笔记, 供以后查阅. =================================================== pos ...
- 2018.07.01 洛谷小B的询问(莫队)
P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...
- 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)
传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...
- vs2010点调试,显示系统找不到指定的文件
首先,查看“项目”-“属性”-“链接器”-“常规”-“输出文件”,路劲是否是“bin/xxx.exe”,如果是请继续看我的解答,否则请忽略下面的内容.原因是用VS2010加载调试以前的VC6.0下的程 ...
- web前端技术合集
视频课程包含: 微服务精品课程包含:Ajax和Jquery基础入门视频.ajax教程.css视频教程.JQuery视频教程.MUI快速混合APP开发-视频.vuejs教程.极客学院HTML5全套教程. ...
- Event事件冒泡和事件捕获
<!doctype html> <html lang="en"> <head> <meta charset="gb2312&qu ...
- python3中 for line1 in f1.readlines():,for line1 in f1:,循环读取一个文件夹
循环读取一个文件: fr.seek(0) fr.seek(0, 0) 概述 seek() 方法用于移动文件读取指针到指定位置. 语法 seek() 方法语法如下: fileObject.seek(of ...