2013-04-10 09:33:45 qhexin 阅读数 704
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7628 人正在学习 去看看 李文瀚


直接加密sql内容不大现实,不能模糊搜索。


网上搜索了在 ios 上的加密处理。还没试,但是记下来先,等试了再补充结果。


使用 http://sqlcipher.net/ios-tutorial/  来做。

这个还有收费版本

SQLCipher for iOS

¥987.49

 

A fully functional SQLCipher library for iOS for use in iPhone and iPad development:


2017-12-29 16:50:47 linlinyin1991 阅读数 1042
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7628 人正在学习 去看看 李文瀚

AES:对称加密算法

AES是一种对称加密算法,加密和解密密钥为同一个,密钥的长度最少支持为128、192、256,分组长度128位。

我们项目中是AES加密完成之后再用Base64加密一下,所以解密的时候就需要先解密Base64,再进行AES解密,Base64这步并不是必须的。

关键代码

//定义加密密钥长度类型
typedef NS_ENUM(NSInteger, AESType) {
    AES128 = 0,
    AES192,
    AES256
};

//AES加密实现
+ (NSString *)aesEncrypt:(NSString *)string key:(NSString *)key {
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSData * result = [self aes:data key:key mode:kCCEncrypt type:AES128];
    if (result.length == 0) {return @"";}
    NSString *resultStr = nil;
    NSData * aesData = [NSData dataWithBytes:(const void *)result.bytes length:result.length];
    NSData *tmpData = [aesData base64EncodedDataWithOptions:0];
    resultStr = [[NSString alloc] initWithData:tmpData encoding:NSUTF8StringEncoding];;
    if (resultStr.length == 0) {return @"";}
    return resultStr;
}
//AES解密
+ (NSString *)aesDecrypt:(NSString *)string key:(NSString *)key {
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSData* result = [self aes:data key:key mode:kCCDecrypt type:AES128];
    NSString * resultStr = nil;
    if (result.length == 0) {return @"";}
    resultStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    if (resultStr.length == 0) {return @"";}
    return resultStr;
}
//加解密算法实现
+ (NSData *)aes:(NSData *)data key:(NSString *)key mode:(CCOperation)operation type:(AESType)type {
    NSInteger size;
    switch (type) {
        case AES128:
            size = kCCKeySizeAES128;
            break;
        case AES192: {
            size = kCCKeySizeAES192;
        }
            break;
        case AES256: {
            size = kCCKeySizeAES256;
        }
            break;
        default:
            size = kCCKeySizeAES128;
            break;
    }
    char keyPtr[size + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = data.length;
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void * buffer = malloc(bufferSize);
    size_t numBytesDecrypted = 0;
    NSString * initIv = [self iv];
    char ivPtr[size + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [initIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    NSData * result;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          size,
                                          ivPtr,
                                          data.bytes,
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        return result;

    } else {
        free(buffer);
        return nil;
    }
}

//偏移量
+ (NSString *)iv {
    if (self.aesType == AES128) {
        return @"8841054029634287";
    }
    if (self.aesType == AES192) {
        return @"884105402963428788410540";
    }
    if (self.aesType == AES256) {
        return @"88410540296342878841054029634287";
    }
    return @"";
}

源码下载链接

2018-05-14 17:55:26 wtdask 阅读数 286
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7628 人正在学习 去看看 李文瀚

网络开发中的原则:

  1. 在网络上不允许传输用户的明文隐私数据
  2. 在本地不允许保存用户的明文隐私数据

密码学:
领域 –> 军事
起源公元前 : 凯撒大帝
有一个密码本:
a – e
b – c
c – z

持续到上世纪70年代
二战时期:美国!设备是最先进的! 截取日军的电报信息!(密文传递的) – 破译

时间 事件(大规模的集结) 地点?AF(中途岛)

持续到 上世纪70年代 ,70 年代出现了一个特别伟大的算法叫RSA(三个人名)

RSA - 加密算法!算法是公开的!
- 公钥加密,私钥解密
- 私钥加密,公钥解密

用因式分解破解密码,大概需要50年!! <我和RSA的20年> – 结果就是破解RSA 只能用因式分解

  • 哈希(散列)函数

    • MD5
    • SHA1
    • SHA256/512
  • 对称加密算法

    • DES
    • 3DES
    • AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))
  • 非对称加密算法
    • RSA

散列函数:
特点:
- 算法公开的.
- 对相同的数据加密,得到的结果是一样的.
- 对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是32个字符.
- 信息摘要,信息”指纹”,是用来做数据识别的.
- 不能反算的.

MD5用途
- 密码,(服务器是不需要知道用户的真实密码的!在用户注册的时候服务器就对密码进行了加密处理,然后保存在数据库!)
- 搜索

hank  ios
ios   hank

ios  - MD5 9e304d4e8df1b74cfa009913198428ab
hank - MD5 b6dfea72ba631c88abe4a1d17114bfcf

- 版权
    不同的数据 MD5 之后差别是非常大的!!
    123.png 0e6c471b5849e7a10f1a6a3172034fff
    456.png 0fea626f61419becf8005fdf942e668e

散列破解:
- 目前破解散列函数,只有 MD5,SHA1也在边缘
- 散列碰撞,找出不同的数据使用MD5之后能够得到相同的结果!
(有可能吗?必须有可能!!) – 36^32
- 张小云

MD5 的基本安全:
1.加”盐” - 早期使用!
2.HMAC,近一两年,在国内开始使用增多!
给定一个密钥,对明文进行密钥拼接,并且做”两次散列” -> 得到32位结果!

HMAC :
- 用户在注册的那一刻,向服务器索取 密钥(key)!!
- 客户端拿到KEY的这一刻,就将KEY保存在本地!!
- 切换了新的设备(换手机登录,登录新的已有账号!) – 重新找服务器获取!!

#import "ViewController.h"
#import "NSString+Hash.h"

@interface ViewController ()

@end

@implementation ViewController

//盐
static NSString * salt =@"*DJSF(*QYEWOIOAJ()*)ASDASDASD";

- (void)viewDidLoad {
    [super viewDidLoad];
    //发给服务器校验!
    NSString * pwd =@"123456";
//    pwd=[pwd stringByAppendingString:salt];
//    pwd=pwd.md5String;
    //加密!直接MD5加密

    //直接发送给服务端pwd可以嘛?
    //答案是不可以,因为虽然MD5是不可逆的,但是一些简单的密码转换成哈希值之后是固定的,有大量的网站依然可以匹配出你加密后的哈希,然后找到你的原密码。那有没有方法解决呢?我们可以进行“加盐”

    //如果盐被泄露呢?那就严重了,所以肯定不能使用固定的盐
    //我们尝试另一种方式:HMAC
    pwd =[pwd hmacSHA1StringWithKey:@"hank"];
    //(HMAC密码+服务器时间戳+盐(服务器和客户端商议))md5
    //服务端存储用户名 key HMAC密码
    //服务端验证:1.(HMAC密码+服务器时间戳(时间戳只到分钟)+key(服务器和客户端商议)MD5
    //2.(HMAC密码+服务器时间戳(上1分钟)+key(服务器和客户端商议)MD5
     NSLog(@"加密之后:%@",pwd);

    /*
     非对称加密算法
     一.运行终端,生成私钥
     1.cd /Users/mac/Desktop/iOS/加密
     2.openssl genrsa -out private.pem 512 //生成私钥,注意:这个私钥其实是放在服务器的
     3.openssl rsa -in private.pem -out public.pem -pubout //通过2生成的私钥获取公钥
     4.我们会发现已经在加密文件下,创建成功了两个文件
     5.cat private.pem  //打开私钥,可以看见base64编码的文件格式
     6. openssl rsa -in private.pem -text -out private.txt  //转换成明文格式打开看看
     RSA加密使用效率偏低,它有哪些应用场景呢?
     我们都知道私钥是放在服务端的,公钥是在客户端的。何为公钥?公钥可以理解为公共钥匙,任何客户端都可以向服务器获取公钥。当你的项目在被做逆向的时候,其他人就可以模仿客户端来获取公钥,所以没有绝对的安全,只有相对的安全。因此我们的重要数据仍然需要做加密处理。我们知道OC的方法调用和函数调用是不一样的,方法调用可以显示方法名,而函数调用则返回的是内存地址。所以在大公司中,一些核心算法都是使用的C。
     */

}

//如何避免
一种情况! 如果黑客 模拟你的网络请求..不需要拿到真实密码!用加密后的信息,也可以获得登录之后的权限!!
//让我们的密码具有时效性!! 也就是 加密过后的密码 有时间限制!!

客户端:
UserID = hank
Pass == (123456+KEY)HMAC == e9cdab82d48dcd37af7734b6617357e6
KEY
发送:UserID : (Pass + ‘201702102020’)md5

服务器:
KEY
UserID = hank
密码 = Pass == e9cdab82d48dcd37af7734b6617357e6

对比: 只要服务器当前时间或者上一分钟 加密后的字符相等!就返回登录成功!!
(Pass + ‘201702102020’)md5 != (Pass + ‘201702102021’)md5
(Pass + ‘201702102020’)md5 == (Pass + ‘201702102020’)md5

—————————– 保存在本地 ————————-
钥匙串访问:

  1. 苹果的”生态圈”,从 iOS7.0.3 版本开放给开发者!
  2. 功能:在Mac上能够动态生成复杂密码,帮助用户记住密码!
  3. 如果用户访问网站,记住密码,我们还可以看到记住的密码明文!明文记录
  4. 本身的所有接口都是 C 语言的.借助三方库
  5. 采用的加密方式是 AES 加密!
2016-04-05 16:20:37 super_man_ww 阅读数 1580
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7628 人正在学习 去看看 李文瀚

ios常用加密方式

AES加密

aes(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。本文展示了AES的概貌并解析了它使用的算法。包括一个完整的C#实现和加密.NET数据的举例。在读完本文后你将能用AES加密、测试 基于AES的软件并能在你的系统中使用AES加密。
美国国家标准与技术研究所(NIST)在2002年5月26日建立了新的高级数据加密标准(AES)规范。将提供一个用C#编写的的能运行的 AES 实现,并详细解释到底什么是 AES 以及编码是如何工作的。同时展示如何用 AES 加密数据并扩展本文给出的代码来开发一个商业级质量的 AES 类。解释了怎样把 AES 结合到你的软件系统中去和为什么要这么做,以及如何测试基于 AES 的软件。
  AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 显示了 AES 用192位密钥对一个16位字节数据块进行加密和解密的情形。

BASE64编码

Base64网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

MD5加密

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。
在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。

安卓与ios系统安全对比

安卓系统:
安卓系统是开放的,应用程序可以去读取SD的全局公开目录,换句话说,应用之间是可以相互之间读取数据的,只要知道各自的数据位置和格式就可以去读取或者修改。因此,应用之间相互会产生大量的数据交集,相互之间被委托调用的内容会很多,这也就解释了为什么一些用户出现流量、花费激增或者安装带有病毒应用暗扣费的情况出现。
iOS系统:
iOS系统是一个封闭的系统,在iOS应用的开发中,开发者需要遵循苹果为其设定开发者协议,没有遵循规定协议而开发的应用不会通过App Store审核,这样就使得开发者在开发应用的时候必须遵守一定的协议,没有权限操作任何非本程序目录下的内容。

iOS应用加密问题

众所周知,苹果App Store上架审核很严格,但每天有着成千上万款应用程序审核提交,同时恶意软件的伪装越来越好,也还是让一些恶意软件从审核的夹缝中进入App Store中。就苹果而言,所面临的困难也是十分恶劣的。
根据国外某安全服务商的最新调查,iOS前100名付费应用中87%均遭黑客破解。[5] 除了免费iOS应用被破解以外,越来越多收费应用被破解,破解的应用类型包含各个类型,包括游戏、商业、生产、金融、社交、娱乐、教育、医疗等。这些收费应用原本是需要付费下载的,而被破解之后,用户不需要付费也能下载。内购破解、源代码破解、本地数据窃取,网络安全风险,iOS应用风险无处不在。
从2013年开始,移动互联网圈内涌现了不少从事移动应用安全服务的公司,其中不乏互联网大佬,但遗憾的是,这些公司更多的重心一直都在安卓应用安全,提供的服务都是为安卓应用加密服务,没有对iOS应用提供安全服务的公司。到底是因为iOS系统的封闭性还是因为iOS加密技术比较难而导致这些公司一直止步于前呢?原因不得而知,我们知道的是iOS应用安全一直处于空白。

安全风险

1、内购破解
插件法(仅越狱)、iTools工具替换文件法(常见为存档破解)、八门神器修改
2、应用程序函数PATCH破解
利用FLEX 补丁软件通过派遣返回值来对应用进行patch破解
3、网络安全风险
截获网络请求,破解通信协议并模拟客户端登录,伪造用户行为,对用户数据造成危害
4、源代码安全风险
通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心代码逻辑泄漏与被修改,影响应用安全

ios应用加密已实现

在这种安全形势下,爱加密通过对大量的案例进行详细分析,针对iOS的技术原理和破解原理,强势推出iOS应用加密技术,分别从本地数据、方法体/方法名、URL编码、程序结构、网络数据传输等几个方面对iOS应用进行全方位的保护,并可以根据iOS应用用户的需求提供定制解决方案,从而实现iOS防破解保护。
爱加密CTO林魏表示,作为全球首家推出的iOS应用防破解技术的平台,爱加密的技术在全球都是遥遥领先。整个加密过程纯净简单,没有技术底子的人也能完成,也不需要额外开发。加密过程融入到编译源码的过程,操作简单,而且加密过程更不会嵌入任何插件,用户不需要担心任何风险。对于用户比较担心的应用性能问题,林魏也表示无需担心,加密不会影响应用性能,无论是大型游戏、小型应用还是企业级应用,加密后的应用都能达到完美适配。更值得一提的是,因为加密后的应用更加安全,所以在AppStore上架的时候审核也会更快,让用户毫无后顾之忧。
爱加密作为国内最专业的移动应用保护平台,提供涉及APP开发、APP定制保护服务、APP运营等环节的一站式安全服务。凭借优异的安全技术及优质服务一直以来都是业内公认的知名安全平台。此次又全球首家率先推出了iOS应用防破解技术,结合原有的安卓应用加密服务,爱加密针对整个移动端应用的安全,已经拥有了提供全面保护的能力。相信在将来,爱加密会在更多的领域进行创新、探索,以建立更加完善的移动互联网安全体系。



2015-12-13 17:08:41 qq_18133317 阅读数 215
  • iOS逆向开发案例

    本套课程相信能够帮助到想学习逆向的你,为你节约大量的时间,将时间充分运用到实践的过程中,并非在逆向的“门前”爬坑。在这个系列里,我们从密码学入手,了解常见加密算法,通过数字签名等技术学习iOS应用签名。剖析原理,通过重签名技术绕过系统检测开启逆向之旅。

    7628 人正在学习 去看看 李文瀚

记录RSA加密过程

1.通过openssl生成公钥与私钥,及IOS加密使用的.der格式根证书:
http://blog.sina.com.cn/s/blog_8589a6890102vitk.html

2.根证书使用:
http://johnny.logdown.com/posts/69881-rsa-encryption-method-on-ios

3.PHP后台与java后台使用的不同代码及生成证书区别
http://witcheryne.iteye.com/blog/2171850
http://blog.yorkgu.me/2011/10/27/rsa-in-ios-using-publick-key-generated-by-openssl/

4.PHP后台中安卓端使用的加密代码
http://blog.csdn.net/xyxjn/article/details/17225809

参考:
证书的转换
http://netkiller.github.io/cryptography/openssl/format.html

iOS 加密

阅读数 138

iOS sqlite 加密

阅读数 62

没有更多推荐了,返回首页