华山论剑之iOS加密

现在什么类型的应用程序最火? 大多数的人会说店铺类的APP和运动健身类的APP,今天我就店铺类的APP说一下这个加密技术.首先我要说一下 很多人封闭的iOS系统很安全,iOS应用也很安全,但事实上,iOS应用没有我们想象中的安全。如同安卓应用,iOS应用也面临着被破解的威胁,存在大量盗版情况。

就是在这样的情况下,所以我们就要对我们自己的APP做一些加密技术.加密的方面主要从下面几个方面入手,

类型 简介
本地数据加密 对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息。
URL编码加密 对程序中出现的URL进行编码加密,防止URL被静态分析
网络传输数据加密 对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取
方法体,方法名高级混淆 对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码
程序结构混排加密 对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

加密主要就是从这五个方面入手.


钥匙串加密操作

当我们的应用的用户在使用我的App的时候经常要使用到一些密码,而作为程序员的我们,则需要对这些账号和密码做一些操作,如果我们不做加密设置的话,黑客就很容易获取到我们的用户信息,造成一些不必要的损失.这时候,我们就需要做一些加密的操作了.

下面我从网上找到一个代码 根据暴露的三个接口,我们就可以做出对应的操作,这样做就比直接存入NSUserDefaults要安全的多了 ,下面是在KeyChain.h的文件中写的代码

#import <Foundation/Foundation.h>
#import <Security/Security.h>
@interface KeyChain : NSObject

+ (void)save:(NSString *)service data:(id)data;//保存一个字段  service是键 data是值
+ (id)load:(NSString *)service;//根据键加载一个值
+ (void)delete:(NSString *)service;//删除一个键值对

@end

我们需要在KeyChain.m文件中写出下面的代码

#import "KeyChain.h"

@implementation KeyChain

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (id)kSecClassGenericPassword,(id)kSecClass,
            service, (id)kSecAttrService,
            service, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
            nil];
}

+ (void)save:(NSString *)service data:(id)data {
    //Get search dictionary
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Delete old item before add new item
    SecItemDelete((CFDictionaryRef)keychainQuery);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        } @catch (NSException *e) {
//            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return ret;
}

+ (void)delete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
}


@end

然后我们就可以直接调用我们所暴露的接口做一些操作


MD5加密技术

对于MD5加密技术,iOS已经封装好了一些算法,我们直接调用这些算法就可,当然了,其实现在的开发人员已经不直接使用MD5加密技术,而是在上面直接加一下辅料~,让密码更难破解, 我们先看一下简单的MD5字符串加载吧.

首先,我们需要导入MD5所在的库

#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access

下面,我们就对MD5的加密方法实现以下,

- (NSString *)md5:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ]; 
}

下面是我做的一个小的范例

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *str = [self md5:@"123456"];//直接调用MD5加密,返回一个字符串类型的数据
    
    NSLog(@"%@",str);
    
    
    // Do any additional setup after loading the view, typically from a nib.
}
- (NSString *)md5:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ]; 
}

打印结果

然后接下来,我们看一下各位技术大牛是如何在简单的MD5加密技术中往上加上辅料的...

#import "ViewController.h"


#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //假设现在我们需要登录功能,那么我们在请求数据的时候,就需要对我们的密码进行一些简单的处理,比如加上时间戳,或者一些字符串字段
    NSString *userName = @"dongGe";//账号
    NSString *userKey = @"123456";//密码
    NSString *troken = @"5355";//要添加的字段(可以是时间戳)
    
    
    NSString *newKey = [userKey stringByAppendingString:troken];
    
    newKey = [self md5:newKey];//进行MD5加密
    
    //然后就是请求我们的网络数据
    NSString *urlString = [NSString stringWithFormat:@"http://localhost/login.php"];
    
    NSURL *url = [NSURL URLWithString:urlString];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    [request setHTTPMethod:@"POST"];//设置请求方式为POST请求方式
    
    NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",userName , userKey];
    
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];//设置请求参数
    
    NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if (!error && data != nil) {
            
            NSLog(@"请求成功");
        }else{
        
            NSLog(@"请求失败!");
        
        }
        
        
    }];
    
    [dataTask resume];
    
    
    
}
- (NSString *)md5:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ]; 
}




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

当然了,上面的只是我们简单加的辅料,我们可以让这些辅料更加完美一些.那就是加上公钥和私钥还有时间戳,这样的话,我们可以更好让我们的密码不容易破解.

今天就说到这,后期我将带给大家更多的技术分享,喜欢的话,就点个喜欢吧,谢谢各位看官了~.

本文参考博客http://blog.csdn.net/xn4545945

如果你觉得生活不如意,没有关系,那只是生活在考验你,加油!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容