iOS開發(fā) - 網(wǎng)絡(luò)數(shù)據(jù)安全加密(MD5)

提交用戶的隱私數(shù)據(jù)

一定要使用POST請求提交用戶的隱私數(shù)據(jù)

GET請求的所有參數(shù)都直接暴露在URL中

請求的URL一般會記錄在服務(wù)器的訪問日志中

服務(wù)器的訪問日志是黑客攻擊的重點對象之一

用戶的隱私數(shù)據(jù)

登錄密碼

銀行賬號

… …

數(shù)據(jù)安全

僅僅用POST請求提交用戶的隱私數(shù)據(jù),還是不能完全解決安全問題可以利用軟件(比如Charles)設(shè)置代理服務(wù)器,攔截查看手機(jī)的請求數(shù)據(jù)因此:提交用戶的隱私數(shù)據(jù)時,一定不要明文提交,要加密處理后再提交常見的加密算法MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES 加密算法的選擇一般公司都會有一套自己的加密方案,按照公司接口文檔的規(guī)定去加密


MD5加密

什么是MD5

全稱是Message Digest Algorithm 5,譯為“消息摘要算法第5版”

效果:對輸入信息生成唯一的128位散列值(32個字符)

MD5的特點

輸入兩個不同的明文不會得到相同的輸出值

根據(jù)輸出值,不能得到原始的明文,即其過程不可逆

MD5的應(yīng)用

由于MD5加密算法具有較好的安全性,而且免費,因此該加密算法被廣泛使用

主要運用在數(shù)字簽名、文件完整性驗證以及口令加密等方面

MD5解密網(wǎng)站:http://www.cmd5.com

MD5改進(jìn)

現(xiàn)在的MD5已不再是絕對安全,對此,可以對MD5稍作改進(jìn),以增加解密的難度

加鹽(Salt):在明文的固定位置插入隨機(jī)串,然后再進(jìn)行MD5

先加密,后亂序:先對明文進(jìn)行MD5,然后對加密得到的MD5串的字符進(jìn)行亂序

… …

總之宗旨就是:黑客就算攻破了數(shù)據(jù)庫,也無法解密出正確的明文

1.網(wǎng)絡(luò)數(shù)據(jù)加密方案

1> 加密對象:隱私數(shù)據(jù),比如密碼、銀行信息

2> 加密方案

* 提交隱私數(shù)據(jù),必須用POST請求

* 使用加密算法對隱私數(shù)據(jù)進(jìn)行加密,比如MD5

3> 加密增強:為了加大破解的難度

* 對明文進(jìn)行2次MD5 : MD5(MD5(pass))?先對明文撒鹽,再進(jìn)行MD5:MD5(pass.$salt)

2.本地存儲加密

1> 加密對象:重要的數(shù)據(jù),比如游戲數(shù)據(jù)

3.代碼安全問題

1> 現(xiàn)在已經(jīng)有工具和技術(shù)能反編譯出源代碼:逆向工程

* 反編譯出來的都是純C語言的,可讀性不高

* 最起碼能知道源代碼里面用的是哪些框架

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

3> 解決方案:發(fā)布之前對代碼進(jìn)行混淆

* 混淆之前

@interface HMPerson :NSObject

- (void)run;

- (void)eat;

@end

混淆之后

@interface A :NSObject

- (void)a;

- (void)b;

@end

MD5加密實例

導(dǎo)入加密文件

#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.發(fā)送用戶名和密碼給服務(wù)器(走HTTP協(xié)議)

// 創(chuàng)建一個URL : 請求路徑

NSURL *url = [NSURL URLWithString:@"http://218.83.161.124:8080/job/login"];

// 創(chuàng)建一個請求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 5秒后算請求超時(默認(rèn)60s超時)

request.timeoutInterval = 15;

request.HTTPMethod = @"POST";

#warning 對pwdText進(jìn)行加密

pwdText = [self MD5Reorder:pwdText];

// 設(shè)置請求體

NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];

NSLog(@"%@", param);

// NSString --> NSData

request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];

// 設(shè)置請求頭信息

[request setValue:@"iPhone 6" forHTTPHeaderField:@"User-Agent"];

// 發(fā)送一個同步請求(在主線程發(fā)送請求)

// queue :存放completionHandler這個任務(wù)

NSOperationQueue *queue = [NSOperationQueue mainQueue];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:

^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 隱藏蒙板

[MBProgressHUD hideHUD];

// 這個block會在請求完畢的時候自動調(diào)用

if (connectionError || data == nil) { // 一般請求超時就會來到這

[MBProgressHUD showError:@"請求失敗"];

return;

}

// 解析服務(wù)器返回的JSON數(shù)據(jù)

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

{

// 撒鹽:隨機(jī)地往明文中插入任意字符串

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容