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 - 安全的更多相关文章

  1. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  5. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  6. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  7. 告别被拒,如何提升iOS审核通过率(上篇)

    iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...

  8. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  9. Summary of Critical and Exploitable iOS Vulnerabilities in 2016

    Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...

  10. 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结

    黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...

随机推荐

  1. 5.Javascript 原型链之原型对象、实例和构造函数三者之间的关系

    前言:用了这么久js,对于它的原型链一直有种模糊的不确切感,很不爽,隧解析之. 本文主要解决的问题有以下三个: (1)constructor 和 prototype 以及实例之间啥关系? (2)pro ...

  2. Connecting to MQSeries with .NET

    By connecting to MQSeries withing a .NET application, first it has to be done is to install MQ Serie ...

  3. DB2 SQL1477N问题

    ERROR [55019] [IBM][DB2/NT] SQL1477N  For table "DB_YHJX.YHJX_FHDKFHZ" an object "521 ...

  4. 2018.07.08 hdu1394 Minimum Inversion Number(线段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

  5. phalApi数据库操作

    在很多时候,我们会遇到数据库表里面的某个值需要+1操作,我们不能简单地在update的时候写入array('key' => 'key+1'),因为在解析sql的时候,key+1 会带上引号作为一 ...

  6. EXT combobox 二级连动 清空store缓存数据

    项目中有这样的一个需求,做一个连动操作,如图: 所属行业中的combobox中下拉框中的值会根据前一个选择框中的值动态去变化,这个其实非常好做,但不是我现在讨论的主要问题,主要问题是,当第二次选择了& ...

  7. MAC安装远程工具Securecrt的破解方式(详细有图)

    想要实现mac的远程连接功能,本来想使用终端的,但是终端的很多功能是欠佳的,所以决定安装一款,像windows的xshell一样好的软件,所以选择了这款Securecrt. 首先准备两个东西,一个是S ...

  8. jaxws.xsd

    示例: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...

  9. day16(jdbc进阶,jdbc之dbUtils)

    1.jdbc进阶 jdbc事务管理 jdbc中的事务管理其实就是交给了连接对象去管理.先写一个简单的事务管理 public class Demo01 { private static Connecti ...

  10. SSH整合 第四篇 Spring的IoC和AOP

    这篇主要是在整合Hibernate后,测试IoC和AOP的应用. 1.工程目录(SRC) 2.IoC 1).一个Service测试类 /* * 加入spring容器 */ private Applic ...