序言
iOS開發(fā)安全問題是不容忽視的肛鹏,在傳統(tǒng)互聯(lián)網(wǎng)領(lǐng)域肃晚,安全已然是一個老生常談的話題畔柔。業(yè)界大佬都不惜重金打造軟件安全部哼丈,用于檢測自己產(chǎn)品的安全性。縱使如此游沿,仍時常爆出許多安全問題引發(fā)新聞饰抒。當今,移動互聯(lián)網(wǎng)時代诀黍,iOS應用由于直接運行在用戶的手機上袋坑,相比運行在服務器的后臺服務,更有可能被黑客攻擊眯勾。大部分的iOS應用都需要連網(wǎng)枣宫,通過和服務器端進行通信,獲得最新的信息并且將內(nèi)容展現(xiàn)給用戶吃环。由于網(wǎng)絡傳輸過程中有可能經(jīng)過不安全的中間節(jié)點也颤,所以我們應該對敏感數(shù)據(jù)加密,用于保證用戶信息的安全郁轻。
接下來小編會來淺談一下iOS開發(fā)中的幾種加密算法翅娶,同時小編也歡迎大家加入小編的iOS交流群551346706,群里會提供相關(guān)資料好唯,書籍歡迎大家入駐竭沫!
Base64編碼原理
Base64編碼之所以稱為Base64,是因為其使用64個字符來對任意數(shù)據(jù)進行編碼骑篙,同理有Base32蜕提、Base16編碼。標準Base64編碼使用的64個字符為:
這64個字符是各種字符編碼(比如ASCII編碼)所使用字符的子集靶端,基本谎势,并且可打印。唯一有點特殊的是最后兩個字符杨名,因?qū)ψ詈髢蓚€字符的選擇不同脏榆,Base64編碼又有很多變種,比如Base64 URL編碼镣煮。
Base64編碼本質(zhì)上是一種將二進制數(shù)據(jù)轉(zhuǎn)成文本數(shù)據(jù)的方案姐霍。對于非二進制數(shù)據(jù)鄙麦,是先將其轉(zhuǎn)換成二進制形式典唇,然后每連續(xù)6比特(2的6次方=64)計算其十進制值,根據(jù)該值在上面的索引表中找到對應的字符胯府,最終得到一個文本字符串介衔。
Base64的特點:可進行反向解密,Xcode7.0 之后出現(xiàn)的骂因,編碼有個非常顯著的特點,末尾有個?=?號
將文件進行加密
// 獲取需要加密文件的二進制數(shù)據(jù)NSData*data = [NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];
// 或 base64EncodedStringWithOptionsNSData*base64Data = [data base64EncodedDataWithOptions:0];
// 將加密后的文件存儲到桌面[base64Data writeToFile:@"/Users/wangpengfei/Desktop/123"atomically:YES];
將文件進行解密
// 獲得加密后的二進制數(shù)據(jù)NSData*base64Data = [NSDatadataWithContentsOfFile:@"/Users/wangpengfei/Desktop/123"];
// 解密 base64 數(shù)據(jù)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 編碼 結(jié)果:aGVsbG8=cho "hello" | base64
// 將 base64編碼之后的結(jié)果 aGVsbG8= 反編碼為字符串echoaGVsbG8= | base64 -D
MD5加密--(信息-摘要算法) 哈希算法之一
基本介紹
需要導入第三方框架: NSString+Hash
MD5特點:
壓縮性 : 任意長度的數(shù)據(jù),算出的 MD5 值長度都是固定的.
容易計算 : 從原數(shù)據(jù)計算出 MD5 值很容易.
抗修改性: 對原數(shù)據(jù)進行任何改動,哪怕只修改一個字節(jié),所得到的 MD5 值都有很大區(qū)別.
弱抗碰撞 : 已知原數(shù)據(jù)和其 MD5 值,想找到一個具有相同 MD5 值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的.
強抗碰撞: 想找到兩個不同數(shù)據(jù),使他們具有相同的 MD5 值,是非常困難的
MD5 應用:
一致性驗證:MD5將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產(chǎn)生一個唯一的MD5信息摘要.就像每個人都有自己獨一無二的指紋,MD5對任何文件產(chǎn)生一個獨一無二的數(shù)字指紋.
利用 MD5 來進行文件校驗,被大量應用在軟件下載站,論壇數(shù)據(jù)庫,系統(tǒng)文件安全等方面(是否認為添加木馬炎咖,篡改文件內(nèi)容等).百度‘MD5’第一個網(wǎng)站進去,利用數(shù)據(jù)庫偽解密,即反查詢
數(shù)字簽名;
安全訪問認證
使用方法
利用 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);
每一個公司都有自己的“鹽值”,鹽值越復雜乘盼,越安全小編也從網(wǎng)上找了一張加密的圖:大家可以看看
時間戳密碼
基本介紹
動態(tài)密碼:相同的密碼明文+相同的加密算法-->因為每次登陸時間都不同,所以每次計算出的結(jié)果也都不相同.可以充分保證密碼的安全性.
服務器會計算兩個時間值,當期時間和前一分鐘的時間(比如:第59S發(fā)送的網(wǎng)絡請求,一秒鐘后服務器收到并作出響應,這時服務器當前時間比客戶端發(fā)送時間晚一分鐘升熊,仍然能夠判斷準確的值)
使用步驟
獲取MD5 首次加密的密碼
// 1. 當前密碼
NSString*password =@"zhang";
// 2. hmacKey值,是對“WangPengfei” 進行 MD5加密之后的值(動態(tài)生成的)
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 接口,發(fā)送請求
創(chuàng)建請求
NSURL*url = [NSURLURLWithString:@"http://localhost/login/loginhmac.php"];
// POST 要手動設置方法绸栅,因此為可變
NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];
// 設置請求方法
request.HTTPMethod =@"POST";
// 設置請求體內(nèi)容
NSString*body = [NSStringstringWithFormat:@"username=zhangsan&password=%@", password]; request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
發(fā)送請求
[[[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語言框架的封裝.注意:不需要看源碼.
鑰匙串訪問的密碼保存在哪里?只有蘋果才知道.這樣進一步保障了用戶的密碼安全.
簡單使用
參數(shù)介紹
Password :需要存儲的密碼信息.
Service :用來標識 app ,app的唯一標識符.
account :賬戶信息,當前密碼所對應的賬號.
利用鑰匙串進行加密
從鑰匙串加載密碼
指紋識別
簡單介紹
指紋識別功能是 iphone 5S之后推出的.SDK是 iOS 8.0 推出!
推出指紋識別功能的目的,是為了簡化移動支付環(huán)節(jié),占領(lǐng)移動支付市場.
使用步驟
導入框架
獲得當前系統(tǒng)版本號
實例化指紋識別對象,判斷當前設備是否支持指紋識別功能(是否帶有TouchID)
指紋登陸(默認是異步方法)
[laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指紋登陸"reply:^(BOOLsuccess,NSError*error) {
// 如果成功,表示指紋輸入正確.
if(success) {
NSLog(@"指紋識別成功!");?
?}else{
NSLog(@"指紋識別錯誤,請再次嘗試");?
?}?
?}];
總結(jié)
由于移動互聯(lián)網(wǎng)的快速發(fā)展级野,人們的購物、理財?shù)刃枨笠苍谝苿佣顺霈F(xiàn)粹胯,使得移動應用的安全性越來越重要蓖柔。由于部署在用戶終端上,移動應用比服務器應用更容易被攻擊风纠,大家也需要在移動應用的網(wǎng)絡通信况鸣、本地文件和數(shù)據(jù)、源代碼三方面做好防范竹观,只有這樣才能保證應用安全镐捧。
今天給大家的分享就到這吧!有收獲臭增,或者喜歡小編的可以關(guān)注小編同時也歡迎大家加入小編的iOS交流群551346706愤估,大家一起交流成長!速址!