讓自己的APP堅如磐石,只需要這幾步
序言
iOS開發安全問題是不容忽視的,在傳統網際網路領域,安全已然是一個老生常談的話題。業界大佬都不惜重金打造軟體安全部,用於檢測自己產品的安全性。縱使如此,仍時常爆出許多安全問題引發新聞。當今,移動網際網路時代,iOS應用由於直接執行在使用者的手機上,相比執行在伺服器的後臺服務,更有可能被黑客攻擊。大部分的iOS應用都需要連網,通過和伺服器端進行通訊,獲得最新的資訊並且將內容展現給使用者。由於網路傳輸過程中有可能經過不安全的中間節點,所以我們應該對敏感資料加密,用於保證使用者資訊的安全。
接下來小編會來淺談一下iOS開發中的幾種加密演算法,同時小編也歡迎大家加入小編的iOS交流群923910776,群裡會提供相關資料、書籍歡迎大家入駐!
Base64編碼原理
Base64編碼之所以稱為Base64,是因為其使用64個字元來對任意資料進行編碼,同理有Base32、Base16編碼。標準Base64編碼使用的64個字元為:

image
這64個字元是各種字元編碼(比如ASCII編碼)所使用字元的子集,基本,並且可列印。唯一有點特殊的是最後兩個字元,因對最後兩個字元的選擇不同,Base64編碼又有很多變種,比如Base64 URL編碼。
Base64編碼本質上是一種將二進位制資料轉成文字資料的方案。對於非二進位制資料,是先將其轉換成二進位制形式,然後每連續6位元(2的6次方=64)計算其十進位制值,根據該值在上面的索引表中找到對應的字元,最終得到一個文字字串。
Base64的特點:可進行反向解密,Xcode7.0 之後出現的,編碼有個非常顯著的特點,末尾有個 = 號
將檔案進行加密
// 獲取需要加密檔案的二進位制資料NSData*data = [NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];
// 或 base64EncodedStringWithOptionsNSData*base64Data = [data base64EncodedDataWithOptions:0];
// 將加密後的檔案儲存到桌面[base64Data writeToFile:@"/Users/wangpengfei/Desktop/123"atomically:YES];
將檔案進行解密
// 獲得加密後的二進位制資料NSData*base64Data = [NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];
// 解密 base64 資料NSData*baseData = [[NSDataalloc] initWithBase64EncodedData:base64Data options:0];
// 寫入桌面[baseData writeToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg"atomically:YES];
利用終端命令進行base64運算:
// 將檔案 meinv.jpg 進行 base64運算之後儲存為 meinv.txtbase64 meinv.jpg -o meinv.txt
// 講meinv.txt 解碼生成 meinv.pngbase64 -D meinv.txt -o meinv.png
// 將字串 "hello" 進行 base 64 編碼 結果:aGVsbG8=cho "hello" | base64
// 將 base64編碼之後的結果 aGVsbG8= 反編碼為字串echoaGVsbG8= | base64 -D
MD5加密--(資訊-摘要演算法) 雜湊演算法之一
基本介紹
需要匯入第三方框架: NSString+Hash
MD5特點:
壓縮性 : 任意長度的資料,算出的 MD5 值長度都是固定的.
容易計算 : 從原資料計算出 MD5 值很容易.
抗修改性: 對原資料進行任何改動,哪怕只修改一個位元組,所得到的 MD5 值都有很大區別.
弱抗碰撞 : 已知原資料和其 MD5 值,想找到一個具有相同 MD5 值的資料(即偽造資料)是非常困難的.
強抗碰撞: 想找到兩個不同資料,使他們具有相同的 MD5 值,是非常困難的
MD5 應用:
一致性驗證:MD5將整個檔案當做一個大文字資訊,通過不可逆的字串變換演算法,產生一個唯一的MD5資訊摘要.就像每個人都有自己獨一無二的指紋,MD5對任何檔案產生一個獨一無二的數字指紋.
利用 MD5 來進行檔案校驗,被大量應用在軟體下載站,論壇資料庫,系統檔案安全等方面(是否認為新增木馬,篡改檔案內容等).百度‘MD5’第一個網站進去,利用資料庫偽解密,即反查詢
數字簽名;
安全訪問認證
使用方法
利用 MD5 對字串進行加密
NSString*password =@"WangPengfei";
password = [password md5String];
NSLog(@"password1:%@", password);
加鹽:可以保證 MD5加密之後更加安全
NSString salt =@"234567890-!@#$%^& ()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";
[password stringByAppendingString:salt];
password = [password md5String];
NSLog(@"password2:%@", password);
每一個公司都有自己的“鹽值”,鹽值越複雜,越安全小編也從網上找了一張加密的圖:大家可以看看

image
時間戳密碼
基本介紹
動態密碼:相同的密碼明文+相同的加密演算法-->因為每次登陸時間都不同,所以每次計算出的結果也都不相同.可以充分保證密碼的安全性.
伺服器會計算兩個時間值,當期時間和前一分鐘的時間(比如:第59S傳送的網路請求,一秒鐘後伺服器收到並作出響應,這時伺服器當前時間比客戶端傳送時間晚一分鐘,仍然能夠判斷準確的值)
使用步驟
獲取MD5 首次加密的密碼
// 1. 當前密碼
NSString*password =@"zhang";
// 2. hmacKey值,是對“WangPengfei” 進行 MD5加密之後的值(動態生成的)
NSString*hmacKey =@"d3bba33b51acaa0a272de7a2f6dfa233";
加密過程
// 1. 第一次加密:第一次 HMAC 運算
password = [password hmacMD5StringWithKey:hmacKey];
// 2.1 獲得當前的時間
NSDate*date = [NSDatedate];
// 2.2 獲得當前時間的字串
// 例項化時間格式器NSDateFormatter*formatter = [[NSDateFormatteralloc] init];
// 設定時間格式
formatter.dateFormat =@"yyyy-MM-dd HH:mm";
// 獲取當前時間(要和伺服器保持一致)
NSString*dateStr = [formatter stringFromDate:date];
// 3. 將第一次加密後的密碼與當前時間的字串拼接在一起
password = [password stringByAppendingString:dateStr];
// 4. 進行第二次 HMAC 加密
password = [password hmacMD5StringWithKey:hmacKey];
訪問 loginhmac.php 介面,傳送請求
建立請求
NSURL*url = [NSURLURLWithString:@" http://localhost/login/loginhmac.php "];
// POST 要手動設定方法,因此為可變
NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];
// 設定請求方法
request.HTTPMethod =@"POST";
// 設定請求體內容
NSString*body = [NSStringstringWithFormat:@"username=zhangsan&password=%@", password]; request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
傳送請求
[[[NSURLSessionsharedSession] dataTaskWithRequest:request completionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {
NSLog(@"%@", [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]); }] resume];
鑰匙串訪問
基本介紹
蘋果在 iOS 7.0.3版本以後公佈鑰匙串訪問的SDK.鑰匙串訪問介面是純C語言的.
鑰匙串使用 AES 256加密演算法,能夠保證使用者密碼的安全.
鑰匙串訪問的第三方框架SSKeychain,是對C語言框架的封裝.注意:不需要看原始碼.
鑰匙串訪問的密碼儲存在哪裡?只有蘋果才知道.這樣進一步保障了使用者的密碼安全.
簡單使用
引數介紹
Password :需要儲存的密碼資訊.
Service :用來標識 app ,app的唯一識別符號.
account :賬戶資訊,當前密碼所對應的賬號.
利用鑰匙串進行加密

image
從鑰匙串載入密碼

image
指紋識別
簡單介紹
指紋識別功能是 iphone 5S之後推出的.SDK是 iOS 8.0 推出!
推出指紋識別功能的目的,是為了簡化移動支付環節,佔領移動支付市場.
使用步驟
匯入框架

image
獲得當前系統版本號

image
例項化指紋識別物件,判斷當前裝置是否支援指紋識別功能(是否帶有TouchID)

image
指紋登陸(預設是非同步方法)
[laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指紋登陸"reply:^(BOOLsuccess,NSError*error) {
// 如果成功,表示指紋輸入正確.
if(success) {
NSLog(@"指紋識別成功!");
}else{
NSLog(@"指紋識別錯誤,請再次嘗試");
}
}];
總結
由於移動網際網路的快速發展,人們的購物、理財等需求也在移動端出現,使得移動應用的安全性越來越重要。由於部署在使用者終端上,移動應用比伺服器應用更容易被攻擊,大家也需要在移動應用的網路通訊、本地檔案和資料、原始碼三方面做好防範,只有這樣才能保證應用安全。