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的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
随机推荐
- .Net多线程 并行编程(三)---并行集合
为了让共享的数组,集合能够被多线程更新,我们现在(.net4.0之后)可以使用并发集合来实现这个功能. 而System.Collections和System.Collections.Generic命名 ...
- redhat安装xwindow环境
. yum groupinstall "X Window System" . yum groupinstall "GNOME Desktop Environment&qu ...
- php用get方式传json数据 变成null了
$data = I('param.data'); $data=stripslashes(html_entity_decode($data));//$data为传过去的json字符串
- lib文件反汇编
运行vc命令行,输入:dumpbin /disasm xxx.lib > test.txt lib就是obj文件打包起来的,可以用lib.exe解出来,下面是vc环境下的操作,其他环境,看命令行 ...
- Jmeter中正则表达式不区分大小写进行匹配
(?i)<r i="([A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12})" ...
- httpclient之基本类
HttpHost类 主机类 主要属性有域名和端口. HttpRoute类 路由类 主要属性有targetHost(目标主要).proxyChain[]代理链 RouteTracker类 和H ...
- 配置tomcat server.xml 文件 ,虚拟路径
<Context path="/web" docBase="D:\workspace\web\src\main\webapp" reloadable=& ...
- CSS特效汇集
http://www.lanrenzhijia.com/js/css3/ http://js.mobanwang.com/special/allcss/ 其他效果:http://www.cnblogs ...
- 2018.10.19 NOIP模拟 比特战争(kruskal)
传送门 考完发现是sbsbsb题啊. 直接考虑优化状压的转移. 可以证明最优解一定在求最小生成树的时候取得. 因此再最小生成树时维护一下连通块的最值统计答案就行了. 代码
- DIV+CSS实战(二)
一.说明 在DIV+CSS实战(一)中,已经把框架搭建起来了,现在就需要往框架里面添加内容了.需要实现的内容如下图: 二.头部的设计(全媒体订阅) 左侧是一张图片+标题 ,右侧是登录名 和上次登录的时 ...