iOS 數據加密方案

iOS安全攻防(二十三):Objective-C代碼混淆

提交用戶的隱私數據

必定要使用POST請求提交用戶的隱私數據
GET請求的全部參數都直接暴露在URL中
請求的URL通常會記錄在服務器的訪問日誌中
服務器的訪問日誌是黑客攻擊的重點對象之一html

用戶的隱私數據
登陸密碼
銀行帳號
… …java

數據安全

僅僅用POST請求提交用戶的隱私數據,仍是不能徹底解決安全問題
能夠利用軟件(好比Charles)設置代理服務器,攔截查看手機的請求數據
所以:提交用戶的隱私數據時,必定不要明文提交,要加密處理後再提交算法

常見的加密算法數據庫

MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES

加密算法的選擇
通常公司都會有一套本身的加密方案,按照公司接口文檔的規定去加密安全

MD5加密

什麼是MD5
全稱是Message Digest Algorithm 5,譯爲「消息摘要算法第5版」
效果:對輸入信息生成惟一的128位散列值(32個字符)服務器

MD5的特色
輸入兩個不一樣的明文不會獲得相同的輸出值
根據輸出值,不能獲得原始的明文,即其過程不可逆網絡

MD5的應用
因爲MD5加密算法具備較好的安全性,並且免費,所以該加密算法被普遍使用
主要運用在數字簽名、文件完整性驗證以及口令加密等方面框架

MD5解密網站:http://www.cmd5.comide

MD5改進

如今的MD5已再也不是絕對安全,對此,能夠對MD5稍做改進,以增長解密的難度
加鹽(Salt):在明文的固定位置插入隨機串,而後再進行MD5
先加密,後亂序:先對明文進行MD5,而後對加密獲得的MD5串的字符進行亂序
… …
總之宗旨就是:黑客就算攻破了數據庫,也沒法解密出正確的明文工具

網絡數據加密方案

1> 加密對象:隱私數據,好比密碼、銀行信息
2> 加密方案
* 提交隱私數據,必須用POST請求
* 使用加密算法對隱私數據進行加密,好比MD5
3> 加密加強:爲了加大破解的難度
* 對明文進行2次MD5 : MD5(MD5(pass))?先對明文撒鹽,再進行MD5:MD5(pass.$salt)

2.本地存儲加密
1> 加密對象:重要的數據,好比遊戲數據

3.代碼安全問題
1> 如今已經有工具和技術能反編譯出源代碼:逆向工程
* 反編譯出來的都是純C語言的,可讀性不高
* 最起碼能知道源代碼裏面用的是哪些框架

2> 參考書籍:《iOS逆向工程》

3> 解決方案:發佈以前對代碼進行混淆
* 混淆以前

@interface HMPerson :NSObject
- (void)run;
- (void)eat;
@end

混淆以後

@interface A :NSObject
- (void)a;
- (void)b;
@end

MD5加密實例

導入加密文件
這裏寫圖片描述

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

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *pwd;
- (IBAction)login;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

- (IBAction)login {
    // 1.用戶名
    NSString *usernameText = self.username.text;
    if (usernameText.length == 0) {
        [MBProgressHUD showError:@"請輸入用戶名"];
        return;
    }

    // 2.密碼
    NSString *pwdText = self.pwd.text;
    if (pwdText.length == 0) {
        [MBProgressHUD showError:@"請輸入密碼"];
        return;
    }

    // 增長蒙板
    [MBProgressHUD showMessage:@"正在拼命登陸中...."];

    // 3.發送用戶名和密碼給服務器(走HTTP協議)
    // 建立一個URL : 請求路徑
    NSURL *url = [NSURL URLWithString:@"http://218.83.161.124:8080/job/login"];

    // 建立一個請求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 5秒後算請求超時(默認60s超時)
    request.timeoutInterval = 15;

    request.HTTPMethod = @"POST";

#warning 對pwdText進行加密
    pwdText = [self MD5Reorder:pwdText];

    // 設置請求體
    NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];

    NSLog(@"%@", param);

    // NSString --> NSData
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];

    // 設置請求頭信息
    [request setValue:@"iPhone 6" forHTTPHeaderField:@"User-Agent"];

    // 發送一個同步請求(在主線程發送請求)
    // queue :存放completionHandler這個任務
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
     ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         // 隱藏蒙板
         [MBProgressHUD hideHUD];

        // 這個block會在請求完畢的時候自動調用
        if (connectionError || data == nil) { // 通常請求超時就會來到這
            [MBProgressHUD showError:@"請求失敗"];
            return;
        }

        // 解析服務器返回的JSON數據
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        NSString *error = dict[@"error"];
        if (error) {
            [MBProgressHUD showError:error];
        } else {
            NSString *success = dict[@"success"];
            [MBProgressHUD showSuccess:success];
        }
     }];
}

/**
 *  MD5($pass.$salt)
 *
 *  @param text 明文
 *
 *  @return 加密後的密文
 */
- (NSString *)MD5Salt:(NSString *)text
{
    // 撒鹽:隨機地往明文中插入任意字符串
    NSString *salt = [text stringByAppendingString:@"aaa"];
    return [salt md5String];
}

/**
 *  MD5(MD5($pass))
 *
 *  @param text 明文
 *
 *  @return 加密後的密文
 */
- (NSString *)doubleMD5:(NSString *)text
{
    return [[text md5String] md5String];
}

/**
 *  先加密,後亂序
 *
 *  @param text 明文
 *
 *  @return 加密後的密文
 */
- (NSString *)MD5Reorder:(NSString *)text
{
    NSString *pwd = [text md5String];

    // 加密後pwd == 3f853778a951fd2cdf34dfd16504c5d8
    NSString *prefix = [pwd substringFromIndex:2];
    NSString *subfix = [pwd substringToIndex:2];

    // 亂序後 result == 853778a951fd2cdf34dfd16504c5d83f
    NSString *result = [prefix stringByAppendingString:subfix];

    NSLog(@"\ntext=%@\npwd=%@\nresult=%@", text, pwd, result);

    return result;
}
@end
相關文章
相關標籤/搜索