提交用戶的隱私數(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加密實例

#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