HTTP請求和數(shù)據(jù)安全

HTTP請求

1.超文本傳輸協(xié)議.
2.http請求過程.

1> http協(xié)議: 超文本傳輸協(xié)議(Hypertext Transfer Protocol)

http協(xié)議規(guī)定了客戶端和服務(wù)器之間的數(shù)據(jù)傳輸格式.
http協(xié)議是在網(wǎng)絡(luò)開發(fā)中最常用的協(xié)議.不管是移動客戶端還是PC端,訪問網(wǎng)絡(luò)資源經(jīng)常使用http協(xié)議.

http優(yōu)點:
<1> 簡單快速:
http協(xié)議簡單,通信速度很快.               
<2> 靈活:
http協(xié)議允許傳輸任意類型的數(shù)據(jù).
<3> http協(xié)議是短連接(非持續(xù)性連接)
http協(xié)議限制每次連接只處理一個請求,服務(wù)器對客戶端的請求作出響應(yīng)后,馬上斷開連接.這種方式可以節(jié)省傳輸時間.

2> http協(xié)議的使用;

完整的http通信分為兩步:

<1> 請求:客戶端向服務(wù)器索要數(shù)據(jù).

http協(xié)議規(guī)定:一個完整的http請求包含'請求行','請求頭','請求體'三個部分;               
'請求行':包含了請求方法,請求資源路徑,http協(xié)議版本.
"GET /resources/images/ HTTP/1.1"             
'請求頭':包含了對客戶端的環(huán)境描述,客戶端請求的主機地址等信息.
"Accept: text/html // 客戶端所能接收的數(shù)據(jù)類型"
"Accept-Language: zh-cn // 客戶端的語言環(huán)境"
"Accept-Encoding: gzip // 客戶端支持的數(shù)據(jù)壓縮格式"
"Host: m.baidu.com // 客戶端想訪問的服務(wù)器主機地址"
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0 // 客戶端的類型,客戶端的軟件環(huán)境 "             
'請求體':客戶端發(fā)給服務(wù)器的具體數(shù)據(jù),比如文件/圖片等.

<2> 響應(yīng):服務(wù)器返回客戶端想要的數(shù)據(jù).

http協(xié)議規(guī)定:一個完整的http響應(yīng)包含'狀態(tài)行','響應(yīng)頭','實體內(nèi)容'三個部分;

'狀態(tài)行':包含了http協(xié)議版本,狀態(tài)嗎,狀態(tài)英文名稱.
"HTTP/1.1 200 OK"

'響應(yīng)頭':包含了對服務(wù)器的描述,對返回數(shù)據(jù)的描述.
"Content-Encoding: gzip // 服務(wù)器支持的數(shù)據(jù)壓縮格式"
"Content-Length:  1528 // 返回數(shù)據(jù)的長度"
"Content-Type:  application/xhtml+xml;charset=utf-8 // 返回數(shù)據(jù)的類型"
"Date: Mon, 15 Jun 2015 09:06:46 GMT // 響應(yīng)的時間"
"Server: apache  // 服務(wù)器類型"

'實體內(nèi)容':服務(wù)器返回給客戶端的具體數(shù)據(jù)(圖片/html/文件...).

3> 發(fā)送http請求:

在iOS開發(fā)中,發(fā)送http請求的方案有很多,常見的有如下幾種:

<1> 蘋果原生:
  • NSURLConnection:用法簡單,古老經(jīng)典的一種方案.
  • NSURLSession:iOS7以后推出的技術(shù),功能比NSURLConnection更加強大.
  • CFNetWork:NSURL 的底層,純C語言,一般不用.
<2> 第三方框架:
  • ASIHttpRequest:http終結(jié)者,功能很強大,可惜作者已停止更新.
  • AFNetWorking:簡單易用,提供了基本夠用的常用功能,維護和使用者多.
  • MKNetWorkKit:簡單易用,產(chǎn)自印度,維護和使用者少.
  • 在開發(fā)中,一般使用第三方框架.

GET 和 POST

1.GET 和 POST的區(qū)別?
2.用POST方法發(fā)送登陸請求.

<1> http方法: http協(xié)議定義了很多方法對應(yīng)不同的資源操作,其中最常用的是GET 和 POST 方法.

例如:GET、POST、OPTIONS、HEAD贴彼、PUT、DELETE暮胧、TRACE好唯、CONNECT鞋诗、PATCH
增:PUT
刪:DELETE
改:POST
查:GET

<2> 參數(shù)

因為 GET 和 POST 可以實現(xiàn)上述所有操作,所以,在現(xiàn)實開發(fā)中,我們只要會用GET 和 POST 方法就可以了.
在與服務(wù)器交互時,有時候需要給服務(wù)器發(fā)送一些數(shù)據(jù),比如登錄時需要發(fā)送用戶名和密碼.
參數(shù):就是指傳遞給服務(wù)器的具體數(shù)據(jù).

<3> GET 和 POST 的主要區(qū)別表現(xiàn)在參數(shù)的傳遞上.

#######"GET":
GET的本質(zhì)是從服務(wù)器得到數(shù)據(jù),效率更高.并且GET請求可以被緩存.
'注意': 網(wǎng)絡(luò)緩存數(shù)據(jù),保存在SQLite的數(shù)據(jù)庫中(路徑:NSHomeDirectory()).

查看緩存數(shù)據(jù)命令行:
'cd 文件目錄'  (打開文件目錄)
'ls'  查看當前文件下目錄
'sqlite3 Cache.db'  打開數(shù)據(jù)庫
'.tables'    查看數(shù)據(jù)庫中的表單
'select * from cfurl_cache_response;'  查看服務(wù)器響應(yīng)緩存
'select * from cfurl_cache_receiver_data;'  查看服務(wù)器返回的數(shù)據(jù)緩存

在請求 URL 后面以 ? 的形式跟上發(fā)給服務(wù)器的參數(shù),參數(shù)以 "參數(shù)名"="參數(shù)值"的形式拼接,多個參數(shù)之間用 & 分隔.
注意:GET的長度是有限制的,不同的瀏覽器有不同的長度限制,一般在2~8K之間.
#######"POST":
POST的本質(zhì)是向服務(wù)器發(fā)送數(shù)據(jù),也可以獲得服務(wù)器處理之后的結(jié)果,效率不如GET.POST請求不可以被緩存,每次刷新之后都需要重新提交表單.
發(fā)送給服務(wù)器的參數(shù)全部放在'請求體'中;
理論上,POST傳遞的數(shù)據(jù)量沒有限制.
注意:所有涉及到用戶隱私的數(shù)據(jù)(密碼/銀行卡號等...)都要用POST的方式傳遞.

<4>注意:URL中不能出現(xiàn)空格以及中文等特殊符號.

1>URL中,所有的字符都必須是 ASCII 碼;
2>URL中不能出現(xiàn)中文和特殊符號(如空格);

所以,如果 URL 中出現(xiàn)了中文,需要添加百分號轉(zhuǎn)譯.
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
<5> POST 發(fā)送登陸請求:
注意:
1> 用可變請求: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
2> 指定請求方法: request.HTTPMethod = @"POST";
3> 設(shè)置請求體數(shù)據(jù): request.HTTPBody = data;
// 實例化請求體字符串
NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.userName.text,self.password.text];
// 將字符串轉(zhuǎn)換成二進制數(shù)據(jù)
NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];
4> 發(fā)送異步網(wǎng)絡(luò)請求.
// 網(wǎng)絡(luò)請求的回調(diào).
// NSURLResponse *response: 服務(wù)器響應(yīng)
// NSData *data: 服務(wù)器返回的數(shù)據(jù)
// NSError *connectionError: 連接錯誤處理
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)

保存用戶信息

1.偏好設(shè)置保存用戶信息.

<1>如果用戶登陸成功,就保存用戶信息.下次直接從偏好設(shè)置中讀取用戶信息,以此做到用戶只需要輸入一次賬號和密碼,以后登陸就可以不用再次輸入.

1>.登陸成功,保存用戶信息(偏好設(shè)置)
2>.再次進入,直接顯示用戶之前保存的信息.避免用戶重復(fù)輸入.
// 偏好設(shè)置存儲用戶信息
-(void)savaUserInfo    {
// 實例化偏好設(shè)置對象(單例)
NSUserDefaults *User = [NSUserDefaults standardUserDefaults];
// 保存用戶名
[User setObject:self.userName.text forKey:kITUSERNAMEKEY];
// 保存用戶密碼
[User setObject:pass forKey:kITUSERPASSKEY];
// 同步保存用戶信息
[User synchronize];
}
// 加載偏好設(shè)置中的用戶信息
- (void)loadUserInfo    {
NSUserDefaults *User = [NSUserDefaults standardUserDefaults];
if ([User objectForKey:ITUSERNAMEKEY]) {
self.userName.text = [User objectForKey:ITUSERNAMEKEY];
}if ([User objectForKey:ITUSERPASSKEY]) {
self.password.text = [User objectForKey:ITUSERPASSKEY];
};    } 

<2> 用戶登陸業(yè)務(wù)邏輯

<1> 用戶登陸需要一個單獨的控制器,因為只需要登陸一次(Login.storyboard). 應(yīng)用程序需要有一個入口:main.storyboard: app 主頁面
<2> 判斷用戶是否登陸成功過(通過偏好設(shè)置中存儲的用戶信息判斷)

1> 如果偏好設(shè)置中存有用戶信息(說明之前登陸成功過),直接進入 app 主頁面 :main.storyboard
2> 如果偏好設(shè)置中不存在用戶信息(第一次登陸或者之前注銷了用戶信息),進入登陸界面 :Login.storyboard
3> 如果用戶登陸成功,跳轉(zhuǎn)到 app 主頁面:main.storyboard.并且在偏好設(shè)置中保存用戶信息.
4> 如果用戶點擊注銷按鈕,注銷用戶信息,返回到登陸頁面.

<3> 問題: 用戶密碼不能以明文的形式保存,需要對用戶密碼加密之后再保存!

密碼的安全原則:
1> 本地和服務(wù)器都不允許保存用戶的密碼明文.
2> 在網(wǎng)絡(luò)上,不允許傳輸用戶的密碼明文.現(xiàn)代密碼學趣聞! 中途島海戰(zhàn)(AF)

<4> 數(shù)據(jù)加密算法:

1> 對稱加密算法:加密和解密使用同一密鑰.加密解密速度快,要保證密鑰安全.適合給大數(shù)據(jù)加密.
2> 非對稱加密算法:使用公鑰加密,私鑰解密.或者使用私鑰加密,公鑰解密.更加安全,但是加密解密速度慢,適合給小數(shù)據(jù)加密.

<5> 小技巧:

openssl :是一個強大的安全套接字層密碼庫,囊括主要的密碼算法,常用的密鑰和證書封裝管理功能以及 SSL 協(xié)議.提供豐富的應(yīng)用程序測試功能.

終端命令:
echo hello |openssl md5
echo hello |openssl sha1
echo hello |openssl sha -sha256
echo hello |openssl sha -sha512

信息安全加密

常用加密方法:

1> base64
2> MD5
3> MD5加鹽
4> HMAC
5> 時間戳密碼(用戶密碼動態(tài)變化)

1> base64

base64 編碼是現(xiàn)代密碼學的基礎(chǔ).
原本是 8個bit 一組表示數(shù)據(jù),改為 6個bit一組表示數(shù)據(jù),不足的部分補零,每 兩個0 用 一個 = 表示.
用base64 編碼之后,數(shù)據(jù)長度會變大,增加了大約 1/3 左右.
base64 基本能夠達到安全要求,但是,base64能夠逆運算,非常不安全!
base64 編碼有個非常顯著的特點,末尾有個 '=' 號.

利用終端命令進行base64運算:
將文件 meinv.jpg 進行 base64運算之后存儲為 meinv.txt
base64 meinv.jpg -o meinv.txt 
// 講meinv.txt 解碼生成 meinv.png
base64 -D meinv.txt -o meinv.png
// 將字符串 "hello" 進行 base 64 編碼 結(jié)果:aGVsbG8=
echo "hello" | base64
// 將 base64編碼之后的結(jié)果 aGVsbG8= 反編碼為字符串
echo aGVsbG8= | base64 -D

2> MD5 -- (信息-摘要算法) 哈希算法之一.

把一個任意長度的字節(jié)串變換成一定長度的十六進制的大整數(shù). 注意,字符串的轉(zhuǎn)換過程是不可逆的.
用于確保'信息傳輸'完整一致.

MD5特點:

1.壓縮性: 任意長度的數(shù)據(jù),算出的 MD5 值長度都是固定的.
2.容易計算: 從原數(shù)據(jù)計算出 MD5 值很容易.
3.抗修改性: 對原數(shù)據(jù)進行任何改動,哪怕只修改一個字節(jié),所得到的 MD5 值都有很大區(qū)別.
4.弱抗碰撞: 已知原數(shù)據(jù)和其 MD5 值,想找到一個具有相同 MD5 值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的.
5.強抗碰撞: 想找到兩個不同數(shù)據(jù),使他們具有相同的 MD5 值,是非常困難的.

MD5 應(yīng)用:

  1. 一致性驗證: MD5 將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產(chǎn)生一個唯一的 MD5 信息摘要.
    就像每個人都有自己獨一無二的指紋,MD5 對任何文件產(chǎn)生一個獨一無二的"數(shù)字指紋".
    利用 MD5 來進行文件校驗, 被大量應(yīng)用在軟件下載站,論壇數(shù)據(jù)庫,系統(tǒng)文件安全等方面.
  2. 數(shù)字簽名;
  3. 安全訪問認證;

3> MD5加鹽

MD5 本身是不可逆運算,但是,目前網(wǎng)絡(luò)上有很多數(shù)據(jù)庫支持反查詢.
MD5加鹽 就是在密碼哈希過程中添加的額外的隨機值.
注意:加鹽要足夠長,足夠復(fù)雜.

4> HMAC

HMAC 利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出.
HMAC 主要使用在身份認證中;

認證流程:

  1. 客戶端向服務(wù)器發(fā)送一個請求.
  2. 服務(wù)器接收到請求后,生成一個'隨機數(shù)'并通過網(wǎng)絡(luò)傳輸給客戶端.
  3. 客戶端將接收到的'隨機數(shù)'和'密鑰'進行 HMAC-MD5 運算,將得到的結(jié)構(gòu)作為認證數(shù)據(jù)傳遞給服務(wù)器. (實際是將隨機數(shù)提供給 ePass,密鑰也是存儲在 ePass中的)
  4. 與此同時,服務(wù)器也使用該'隨機數(shù)'與存儲在服務(wù)器數(shù)據(jù)庫中的該客戶'密鑰'進行 HMAC-MD5 運算,如果服務(wù)器的運算結(jié)果與客戶端傳回的認證數(shù)據(jù)相同,則認為客戶端是一個合法用法.

5> 時間戳密碼(用戶密碼動態(tài)變化)

相同的密碼明文 + 相同的加密算法 ===>> 每次計算都得出不同的結(jié)果.可以充分保證密碼的安全性.
原理:將當前時間加入到密碼中;
因為每次登陸時間都不同,所以每次計算出的結(jié)果也都不相同.
服務(wù)器也需要采用相同的算法.這就需要服務(wù)器和客戶端時間一致.

注意:服務(wù)器端時間和客戶端時間,可以有一分鐘的誤差(比如:第59S發(fā)送的網(wǎng)絡(luò)請求,一秒鐘后服務(wù)器收到并作出響應(yīng),這時服務(wù)器當前時間比客戶端發(fā)送時間晚一分鐘).
這就意味著,服務(wù)器需要計算兩次(當前時間和一分鐘之前兩個時間點各計算一次).
只要有一個結(jié)果是正確的,就可以驗證成功!
可用于IP輔助/手機綁定...

鑰匙串訪問

1.鑰匙串訪問

蘋果在 iOS 7.0.3 版本以后公布鑰匙串訪問的SDK. 鑰匙串訪問接口是純C語言的.
鑰匙串使用 AES 256加密算法,能夠保證用戶密碼的安全.
鑰匙串訪問的第三方框架(SSKeychain),是對 C語言框架 的封裝.注意:不需要看源碼.
鑰匙串訪問的密碼保存在哪里?只有蘋果才知道.這樣進一步保障了用戶的密碼安全.

使用步驟:

獲取應(yīng)用程序唯一標識.
NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;

"注意"三個參數(shù):
1>.密碼:可以直接使用明文.鑰匙串訪問本身是使用 AES 256加密,就是安全的.所以使用的時候,直接傳遞密碼明文就可以了.
2>.服務(wù)名:可以隨便亂寫,建議唯一! 建議使用 bundleId.
bundleId是應(yīng)用程序的唯一標識,每一個上架的應(yīng)用程序都有一個唯一的 bundleId
3>.賬戶名:直接用用戶名稱就可以.
1.利用第三方框架,將用戶密碼保存在鑰匙串
[SSKeychain setPassword:self.pwdText.text forService:bundleId account:self.usernameText.text];

2.從鑰匙串加載密碼
self.pwdText.text = [SSKeychain passwordForService:bundleId account:self.usernameText.text];

指紋識別

1.指紋識別用法

指紋識別功能是 iphone 5S之后推出的.SDK是 iOS 8.0 推出!
推出指紋識別功能的目的,是為了簡化移動支付環(huán)節(jié),占領(lǐng)移動支付市場.

使用步驟:

1> 導(dǎo)入框架;
#import <LocalAuthentication/LocalAuthentication.h>
2> 指紋識別的實現(xiàn):
1. 需要判斷手機系統(tǒng)版本是否是 iOS 8.0 以上的版本.只有 iOS 8.0 以上才支持.
// 獲得當前系統(tǒng)版本號
float version = [UIDevice currentDevice].systemVersion.floatValue;
// 判斷當前系統(tǒng)版本
if (version < 8.0 )  {
                     NSLog(@"系統(tǒng)版本太低,請升級至最新系統(tǒng)");
                     return;
}
2. 實例化指紋識別對象,判斷當前設(shè)備是否支持指紋識別功能(是否帶有TouchID).
// 1> 實例化指紋識別對象
LAContext *laCtx = [[LAContext alloc] init];
// 2> 判斷當前設(shè)備是否支持指紋識別功能.
if (![laCtx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]){
// 如果設(shè)備不支持指紋識別功能
                     NSLog(@"該設(shè)備不支持指紋識別功能");
                     return;
};
3.指紋登陸(默認是異步方法)
// 指紋登陸
[laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指紋登陸" reply:^(BOOL success, NSError *error)  {
// 如果成功,表示指紋輸入正確.
         if (success) {
         NSLog(@"指紋識別成功!");
   }else {                    
         NSLog(@"指紋識別錯誤,請再次嘗試");
                 } 
            }];
        }
    }}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撕捍,隨后出現(xiàn)的幾起案子拿穴,更是在濱河造成了極大的恐慌,老刑警劉巖忧风,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件默色,死亡現(xiàn)場離奇詭異,居然都是意外死亡狮腿,警方通過查閱死者的電腦和手機腿宰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘厢,“玉大人吃度,你說我怎么就攤上這事√颍” “怎么了规肴?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夜畴。 經(jīng)常有香客問我,道長删壮,這世上最難降的妖魔是什么贪绘? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮央碟,結(jié)果婚禮上税灌,老公的妹妹穿的比我還像新娘。我一直安慰自己亿虽,他們只是感情好菱涤,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洛勉,像睡著了一般粘秆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上收毫,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天攻走,我揣著相機與錄音,去河邊找鬼此再。 笑死昔搂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的输拇。 我是一名探鬼主播摘符,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逛裤?” 一聲冷哼從身側(cè)響起瘩绒,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎别凹,沒想到半個月后草讶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡炉菲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年堕战,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拍霜。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘱丢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祠饺,到底是詐尸還是另有隱情越驻,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布道偷,位于F島的核電站缀旁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勺鸦。R本人自食惡果不足惜并巍,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望换途。 院中可真熱鬧懊渡,春花似錦、人聲如沸军拟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懈息。三九已至肾档,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漓拾,已是汗流浹背阁最。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骇两,地道東北人速种。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像低千,于是被迫代替她去往敵國和親配阵。 傳聞我的和親對象是個殘疾皇子馏颂,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容